Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
bibletime/bibletime/frontend/btinstallmgr.cpp

345 рядки
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"