Você não pode selecionar mais de 25 tópicos
Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
345 linhas
9.9 KiB
345 linhas
9.9 KiB
/*********
|
|
*
|
|
* This file is part of BibleTime's source code, http://www.bibletime.info/.
|
|
*
|
|
* Copyright 1999-2006 by the BibleTime developers.
|
|
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
|
|
*
|
|
**********/
|
|
|
|
//BibleTime includes
|
|
#include "btinstallmgr.h"
|
|
#include "util/cpointers.h"
|
|
#include "cbtconfig.h"
|
|
|
|
//TQt includes
|
|
#include <tqfile.h>
|
|
#include <tqfileinfo.h>
|
|
|
|
//KDE includes
|
|
#include <tdeapplication.h>
|
|
#include <tdeglobal.h>
|
|
#include <tdelocale.h>
|
|
#include <kstandarddirs.h>
|
|
#include <kprocess.h>
|
|
#include <tdeconfig.h>
|
|
#include <tdemessagebox.h>
|
|
|
|
//Sword includes
|
|
#include <filemgr.h>
|
|
#include <swconfig.h>
|
|
#include <swbuf.h>
|
|
#include <map>
|
|
#include <utility>
|
|
|
|
//Stl includes
|
|
#include <functional>
|
|
|
|
using namespace sword;
|
|
|
|
namespace BookshelfManager {
|
|
|
|
const TQString BTInstallMgr::Tool::LocalConfig::swordConfigFilename() {
|
|
// Q_ASSERT( CPointers::backend()->sysconfig );
|
|
return TQString::fromLatin1("%1/.sword/sword.conf").arg(getenv("HOME"));
|
|
}
|
|
|
|
TQStringList BTInstallMgr::Tool::RemoteConfig::sourceList( sword::InstallMgr* mgr ) {
|
|
// tqWarning("BTInstallMgr::Tool::sourceList( sword::InstallMgr* mgr )");
|
|
Q_ASSERT(mgr);
|
|
Q_ASSERT(mgr->installConf);
|
|
|
|
TQStringList names;
|
|
|
|
//add Sword remote sources
|
|
for (InstallSourceMap::iterator it = mgr->sources.begin(); it != mgr->sources.end(); it++) {
|
|
names << TQString::fromLocal8Bit(it->second->caption);
|
|
}
|
|
|
|
// Add local directory sources
|
|
SWConfig config(Tool::RemoteConfig::configFilename().latin1());
|
|
sword::SectionMap::iterator sourcesSection = config.Sections.find("Sources");
|
|
if (sourcesSection != config.Sections.end()) {
|
|
sword::ConfigEntMap::iterator sourceBegin = sourcesSection->second.lower_bound("DIRSource");
|
|
sword::ConfigEntMap::iterator sourceEnd = sourcesSection->second.upper_bound("DIRSource");
|
|
|
|
while (sourceBegin != sourceEnd) {
|
|
InstallSource is("DIR", sourceBegin->second.c_str());
|
|
names << TQString::fromLatin1(is.caption.c_str());
|
|
|
|
sourceBegin++;
|
|
}
|
|
}
|
|
|
|
return names;
|
|
}
|
|
|
|
TQStringList BTInstallMgr::Tool::LocalConfig::targetList() {
|
|
TQStringList names = CPointers::backend()->swordDirList();
|
|
return names;
|
|
}
|
|
|
|
void BTInstallMgr::Tool::LocalConfig::setTargetList( const TQStringList& targets ) {
|
|
//saves a new Sworc config using the provided target list
|
|
TQString filename = TDEGlobal::dirs()->saveLocation("data", "bibletime/") + "sword.conf"; //default is to assume the real location isn't writable
|
|
bool directAccess = false;
|
|
|
|
TQFileInfo i(LocalConfig::swordConfigFilename());
|
|
TQFileInfo dirInfo(i.dirPath(true));
|
|
|
|
if ( i.exists() && i.isWritable() ) { //we can write to the file ourself
|
|
filename = LocalConfig::swordConfigFilename();
|
|
directAccess = true;
|
|
}
|
|
else if ( !i.exists() && dirInfo.isWritable() ) { // if the file doesn't exist but th eparent is writable for us, create it
|
|
filename = LocalConfig::swordConfigFilename();
|
|
directAccess = true;
|
|
}
|
|
|
|
bool setDataPath = false;
|
|
SWConfig conf(filename.local8Bit());
|
|
conf.Sections.clear();
|
|
|
|
for (TQStringList::const_iterator it = targets.begin(); it != targets.end(); ++it) {
|
|
TQString t = *it;
|
|
if (t.contains( TQString("%1/.sword").arg(getenv("HOME")) )) {
|
|
//we don't want HOME/.sword in the config
|
|
continue;
|
|
}
|
|
else {
|
|
conf["Install"].insert( std::make_pair(!setDataPath ? SWBuf("DataPath") : SWBuf("AugmentPath"), t.local8Bit().data()) );
|
|
|
|
setDataPath = true;
|
|
}
|
|
}
|
|
conf.Save();
|
|
|
|
if (!directAccess) { //use tdesu to move the file to the right place
|
|
TDEProcess *proc = new TDEProcess;
|
|
*proc << "tdesu";
|
|
*proc << TQString::fromLatin1("-c") << TQString("mv %1 %2").arg(filename).arg(LocalConfig::swordConfigFilename());
|
|
proc->start(TDEProcess::Block);
|
|
}
|
|
}
|
|
|
|
sword::InstallSource BTInstallMgr::Tool::RemoteConfig::source( sword::InstallMgr* mgr, const TQString& name ) {
|
|
Q_ASSERT(mgr);
|
|
|
|
InstallSourceMap::iterator source = mgr->sources.find(name.latin1());
|
|
if (source != mgr->sources.end()) {
|
|
return *(source->second);
|
|
}
|
|
else { //not found in Sword, may be a local DIR source
|
|
SWConfig config(Tool::RemoteConfig::configFilename().latin1());
|
|
SectionMap::iterator sourcesSection = config.Sections.find("Sources");
|
|
if (sourcesSection != config.Sections.end()) {
|
|
ConfigEntMap::iterator sourceBegin =
|
|
sourcesSection->second.lower_bound("DIRSource");
|
|
ConfigEntMap::iterator sourceEnd =
|
|
sourcesSection->second.upper_bound("DIRSource");
|
|
|
|
while (sourceBegin != sourceEnd) {
|
|
InstallSource is("DIR", sourceBegin->second.c_str());
|
|
if (!strcmp(is.caption, name.latin1()) ) { //found local dir source
|
|
return is;
|
|
}
|
|
|
|
sourceBegin++;//next source
|
|
}
|
|
}
|
|
}
|
|
|
|
InstallSource is("EMPTY"); //default return value
|
|
is.caption = "unknown caption";
|
|
is.source = "unknown source";
|
|
is.directory = "unknown dir";
|
|
|
|
return is;
|
|
}
|
|
|
|
const bool BTInstallMgr::Tool::RemoteConfig::isRemoteSource( sword::InstallSource* is ) {
|
|
Q_ASSERT(is);
|
|
if (is)
|
|
return !strcmp(is->type, "FTP");
|
|
else
|
|
return false;
|
|
}
|
|
|
|
void BTInstallMgr::Tool::RemoteConfig::addSource( sword::InstallSource* is ) {
|
|
if (!is) {
|
|
return;
|
|
}
|
|
|
|
SWConfig config(Tool::RemoteConfig::configFilename().latin1());
|
|
if (!strcmp(is->type, "FTP")) {
|
|
//make sure the path doesn't have a trailing slash, sword doesn't like it
|
|
if (is->directory[ is->directory.length()-1 ] == '/') {
|
|
is->directory--; //make one char shorter
|
|
}
|
|
|
|
config["Sources"].insert( std::make_pair(SWBuf("FTPSource"), is->getConfEnt()) );
|
|
}
|
|
else if (!strcmp(is->type, "DIR")) {
|
|
config["Sources"].insert( std::make_pair(SWBuf("DIRSource"), is->getConfEnt()) );
|
|
}
|
|
config.Save();
|
|
}
|
|
|
|
void BTInstallMgr::Tool::RemoteConfig::initConfig() {
|
|
SWConfig config(Tool::RemoteConfig::configFilename().latin1());
|
|
config["General"]["PassiveFTP"] = "true";
|
|
config.Save();
|
|
}
|
|
|
|
const TQString BTInstallMgr::Tool::RemoteConfig::configPath() {
|
|
const char *envhomedir = getenv("HOME");
|
|
TQString confPath = TQString(envhomedir ? envhomedir : ".");
|
|
confPath.append("/.sword/InstallMgr");
|
|
|
|
return confPath;
|
|
}
|
|
|
|
const TQString BTInstallMgr::Tool::RemoteConfig::configFilename() {
|
|
return (configPath() + "/InstallMgr.conf");
|
|
}
|
|
|
|
void BTInstallMgr::Tool::RemoteConfig::removeSource( sword::InstallMgr* mgr, sword::InstallSource* is) {
|
|
Q_ASSERT(mgr);
|
|
Q_ASSERT(is);
|
|
|
|
SWConfig config(Tool::RemoteConfig::configFilename().latin1());
|
|
|
|
//this code can probably be shortened by using the stl remove_if functionality
|
|
std::pair< ConfigEntMap::iterator, ConfigEntMap::iterator > range =
|
|
isRemoteSource(is)
|
|
? config["Sources"].equal_range("FTPSource")
|
|
: config["Sources"].equal_range("DIRSource");
|
|
|
|
ConfigEntMap::iterator it = range.first;
|
|
while (it != range.second) {
|
|
if (it->second == is->getConfEnt()) {
|
|
// tqWarning("found the source!");
|
|
config["Sources"].erase(it);
|
|
break;
|
|
}
|
|
|
|
++it;
|
|
}
|
|
|
|
config.Save();
|
|
}
|
|
|
|
void BTInstallMgr::Tool::RemoteConfig::resetRemoteSources() {
|
|
SWConfig config(Tool::RemoteConfig::configFilename().latin1());
|
|
config["Sources"].erase( //remove all FTP sources
|
|
config["Sources"].lower_bound("FTPSource"),
|
|
config["Sources"].upper_bound("FTPSource")
|
|
);
|
|
config.Save();
|
|
}
|
|
|
|
void BTInstallMgr::Tool::RemoteConfig::resetLocalSources() {
|
|
SWConfig config(Tool::RemoteConfig::configFilename().latin1());
|
|
config["Sources"].erase( //remove all FTP sources
|
|
config["Sources"].lower_bound("DIRSource"),
|
|
config["Sources"].upper_bound("DIRSource")
|
|
);
|
|
config.Save();
|
|
}
|
|
|
|
CSwordBackend* BTInstallMgr::Tool::backend( sword::InstallSource* const is) {
|
|
Q_ASSERT(is);
|
|
if (!is) {
|
|
return 0;
|
|
}
|
|
|
|
CSwordBackend* ret = 0;
|
|
if (RemoteConfig::isRemoteSource(is)) {
|
|
// tqWarning("## remote backend for %s", is->localShadow.c_str());
|
|
ret = new CSwordBackend( TQString(is->localShadow.c_str()), false );
|
|
}
|
|
else {
|
|
// tqWarning("## local backend for %s", TQString(is->directory.c_str()).latin1());
|
|
ret = new CSwordBackend( TQString(is->directory.c_str()) );
|
|
}
|
|
|
|
Q_ASSERT(ret);
|
|
if (ret) {
|
|
ret->initModules();
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
BTInstallMgr::BTInstallMgr() : InstallMgr(Tool::RemoteConfig::configPath().latin1(), this) { //use this class also as status reporter
|
|
this->setFTPPassive(true);
|
|
}
|
|
|
|
#ifdef SWORD_INTERNET_WARNING
|
|
bool BTInstallMgr::isUserDisclaimerConfirmed() const
|
|
{
|
|
TDEConfig* config = CBTConfig::getConfig();
|
|
config->setGroup("Remote Resources");
|
|
if (config->readNumEntry("Allowed", 0) == 1) {
|
|
return true;
|
|
}
|
|
else {
|
|
if (KMessageBox::questionYesNo(0, i18n("Do you wish to allow BibleTime to access the Internet?\nWARNING: Click DENY if you live in a persecuted country!"), i18n("Confirm Internet Access"), i18n("DENY"), i18n("Allow") ) == KMessageBox::No ) {
|
|
config->setGroup("Remote Resources");
|
|
config->writeEntry("Allowed", 1);
|
|
config->sync();
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
BTInstallMgr::~BTInstallMgr() {
|
|
terminate(); //make sure to close the connection
|
|
}
|
|
|
|
void BTInstallMgr::statusUpdate(double dltotal, double dlnow) {
|
|
|
|
if (dlnow > dltotal)
|
|
dlnow = dltotal;
|
|
|
|
int totalPercent = (int)((float)(dlnow + m_completedBytes) / (float)(m_totalBytes) * 100.0);
|
|
|
|
if (totalPercent > 100) {
|
|
totalPercent = 100;
|
|
}
|
|
else if (totalPercent < 0) {
|
|
totalPercent = 0;
|
|
}
|
|
|
|
int filePercent = (int)((float)(dlnow) / (float)(dltotal+1) * 100.0);
|
|
if (filePercent > 100) {
|
|
filePercent = 100;
|
|
}
|
|
else if (filePercent < 0) {
|
|
filePercent = 0;
|
|
}
|
|
|
|
emit completed(totalPercent, filePercent);
|
|
}
|
|
|
|
void BTInstallMgr::preStatus(long totalBytes, long completedBytes, const char* /*message*/) {
|
|
tqWarning("pre Status: %i / %i", (int)totalBytes, (int)completedBytes);
|
|
emit downloadStarted( "unknown filename" );
|
|
|
|
m_completedBytes = completedBytes;
|
|
m_totalBytes = (totalBytes > 0) ? totalBytes : 1; //avoid division by zero
|
|
}
|
|
|
|
// FTPTransport *BTInstallMgr::createFTPTransport(const char *host, StatusReporter *statusReporter) {
|
|
// return new TDEIO_FTPTransport(host, statusReporter);
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
#include "btinstallmgr.moc"
|