//
//
-#include <QApplication>
+#include <QDesktopServices>
#include <QDir>
#include <QHostInfo>
#include <QIcon>
#include <QInputDialog>
#include <QLocale>
+#include <QMenu>
#include <QMessageBox>
#include <QSettings>
#include <QTranslator>
+#include <QUrl>
#include "autoupdate.h"
-#include "keygen.h"
-#include "mainwindow.h"
+#include "debug.h"
#include "hmac.h"
+#include "keygen.h"
#include "main.h"
-#include "debug.h"
-
+#include "mainwindow.h"
+#include "msinterface.h"
QString choseLanguage(bool warn)
{
void initDataDir()
{
- QSettings set;
- if(set.contains("datadir"))
- dataDir=set.value("datadir").toString();
- else{
#ifdef Q_OS_WIN32
- dataDir=getenv("APPDATA");
+ dataDir=getenv("APPDATA");
#else
- dataDir=getenv("HOME");
+ dataDir=getenv("HOME");
#endif
- if(dataDir=="")
- qFatal("Cannot determine application data directory.");
- dataDir+="/.magicSmoke";
- set.setValue("datadir",dataDir);
- }
+ if(dataDir=="")
+ qFatal("Cannot determine application data directory.");
+ dataDir+="/.magicSmoke2";
+}
+
+QMenu* MApplication::helpMenu()
+{
+ QMenu*m=new QMenu(tr("&Help"));
+ m->addAction("&Help",qApp,SLOT(help()));
+ m->addSeparator();
+ m->addAction("About &MagicSmoke",qApp,SLOT(aboutMS()));
+ m->addAction("About &Qt",qApp,SLOT(aboutQt()));
+ return m;
+}
+
+void MApplication::aboutMS()
+{
+ QMessageBox mb;
+ mb.setIconPixmap(QPixmap(":/icon.png"));
+ mb.setWindowTitle(tr("About MagicSmoke"));
+ mb.setText(tr( "<h3>MagicSmoke %3</h3>"
+ "© Konrad Rosenbaum, Peter Keller, 2007-9<br>"
+ "protected under the GNU GPL v.3 or at your option any newer<p>"
+ "See also the <a href=\"http://smoke.silmor.de\">MagicSmoke Homepage</a>.<p>"
+ "This version was compiled from repository '%1' revision '%2'.").
+ arg(MSInterface::repoPart()). // %1
+ arg(MInterface::svnVersion()). //%2
+ arg(MSInterface::version()) //%3
+ );
+ mb.setStandardButtons(QMessageBox::Ok);
+ mb.exec();
}
+void MApplication::help()
+{
+ QString d=QApplication::applicationDirPath()+"/doc/index.html";
+ if(!QFile(d).exists()){
+ d="http://smoke.silmor.de/doc/"+MSInterface::repoPart()+"/index.html";
+ }else d="file:///"+d;
+ QDesktopServices::openUrl(QUrl(d));
+}
+
+
int main(int argc,char**argv)
{
//create global app
- QApplication app(argc,argv);
+ MApplication app(argc,argv);
//locate settings
app.setOrganizationName("MagicSmoke");
- app.setApplicationName("MagicSmoke");
+ app.setApplicationName("MagicSmoke2");
//set icon
app.setWindowIcon(QIcon(":/icon.png"));
/**contains the directory that is used for external data storage*/
extern QString dataDir;
+
+#include <QApplication>
+class QMenu;
+class MApplication:public QApplication
+{
+ Q_OBJECT
+ public:
+ MApplication(int ac,char**av):QApplication(ac,av){}
+
+ static QMenu*helpMenu();
+ public slots:
+ //help menu
+ void aboutMS();
+ void help();
+};
+
#endif
#include "msinterface.h"
#include "office.h"
#include "overview.h"
-#include "version.h"
#include <QApplication>
#include <QByteArray>
#include <QSpinBox>
#include <QStackedWidget>
-static MMainWindow *maininst=0;
-
MMainWindow::MMainWindow()
{
- maininst=this;
setWindowTitle("Magic Smoke");
//create Menu Bar
QMenuBar*mb=menuBar();
m->addAction(tr("&Generate Host Key..."),this,SLOT(generateKey()));
m->addSeparator();
m->addAction(tr("&OpenOffice.org Settings..."),this,SLOT(openOfficeCfg()));
- mb->addMenu(helpMenu());
+ mb->addMenu(MApplication::helpMenu());
//create central widget
QWidget *loginwidget;
loadProfile();
}
-QMenu* MMainWindow::helpMenu()
-{
- QMenu*m=new QMenu(tr("&Help"));
- m->addAction("&Help",maininst,SLOT(help()));
- m->addSeparator();
- m->addAction("About &MagicSmoke",maininst,SLOT(about()));
- m->addAction("About &Qt",qApp,SLOT(aboutQt()));
- return m;
-}
-
void MMainWindow::initProfiles()
{
QSettings set;
MOfficeConfig c(this);
c.exec();
}
-
-void MMainWindow::about()
-{
- QMessageBox mb(this);
- mb.setIconPixmap(QPixmap(":/icon.png"));
- mb.setWindowTitle(tr("About MagicSmoke"));
- mb.setText(tr( "<h3>MagicSmoke</h3>"
- "© Konrad Rosenbaum, Peter Keller, 2007-9<br>"
- "protected under the GNU GPL v.3 or at your option any newer<p>"
- "See also the <a href=\"http://smoke.silmor.de\">MagicSmoke Homepage</a>.<p>"
- "This version was compiled from repository %1 revision %2.").
- arg(repoPart()).arg(svnRevision()));
- mb.setStandardButtons(QMessageBox::Ok);
- mb.exec();
-}
-
-void MMainWindow::help()
-{
- QString d=QApplication::applicationDirPath()+"/doc/index.html";
- if(!QFile(d).exists()){
- d="http://smoke.silmor.de/doc/"+repoPart()+"/index.html";
- }else d="file:///"+d;
- QDesktopServices::openUrl(QUrl(d));
-}
public:
MMainWindow();
- static QMenu*helpMenu();
private:
QHttp*req;
QString sessionid;
void importKey();
void generateKey();
void openOfficeCfg();
- //help menu
- void about();
- void help();
};
#endif
//
#include "msinterface.h"
+#include "main.h"
+
+#include <QDir>
#include <QMessageBox>
MSInterface::MSInterface(QString pid)
profileid=pid;
}
+MSInterface::~MSInterface()
+{
+ logout();
+}
+
bool MSInterface::login(QString username,QString passwd,QString hostname,QString hostkey)
{
+ m_uname=username;m_passwd=passwd;m_host=hostname;m_hostkey=hostkey;
MTLogin lg=MTLogin::query(username,passwd,hostname,hostkey);
if(lg.stage()==lg.Error)
QMessageBox::warning(0,tr("Warning"),tr("Login failed: %1").arg(tr(lg.errorString().toAscii())));
return lg.stage()==lg.Success;
}
- void logout(){}
- bool relogin(){return false;}
+void MSInterface::logout()
+{
+ if(m_sessid!="")queryLogout();
+ m_sessid="";
+}
+bool MSInterface::relogin()
+{
+ logout();
+ return login(m_uname,m_passwd,m_host,m_hostkey);
+}
QMap<QString,QString> MSInterface::headers(QString s)const
{
ret.insert("Wob-SessionId",m_sessid);
return ret;
}
+
+QString MSInterface::dataDir()const
+{
+ QString dd="profile."+profileid;
+ QDir dir(::dataDir);
+ if(!dir.exists(dd))
+ if(!dir.mkpath(dd))
+ qDebug("Warning: oh dir! Can't create my data directory!");
+ return ::dataDir+"/"+dd;
+}
+
+QString MSInterface::settingsGroup()const
+{
+ return "profsettings/"+profileid;
+}
+
+QString MSInterface::repoPart()
+{
+ QStringList l=svnRepositoryUrl().split("/smoke/");
+ if(l.size()>1)return l[1];
+ else return svnRepositoryUrl();
+}
Q_OBJECT
public:
MSInterface(QString);
+ ~MSInterface();
static MSInterface* instance(){return qobject_cast<MSInterface*>(MInterface::instance());}
- QString currentUser()const{return "";}
+ QString currentUser()const{return m_uname;}
bool hasRole(QString)const{return false;}
- QString dataDir()const{return "/tmp/blah";}
- QString settingsGroup()const{return "nosuchgroup";}
+ QString dataDir()const;
+ QString settingsGroup()const;
/**returns the current session ID*/
QString sessionId()const{return m_sessid;}
+ /**returns the branch/trunk part of the repository*/
+ static QString repoPart();
+
virtual QMap<QString,QString> headers(QString)const;
public slots:
bool login(QString username,QString passwd,QString hostname,QString hostkey);
- void logout(){}
- bool relogin(){return false;}
+ void logout();
+ bool relogin();
/**sets the session id to be transmitted*/
void setSessionId(QString sid){m_sessid=sid;}
private:
- QString profileid,m_sessid;
+ QString profileid,m_sessid,m_uname,m_passwd,m_host,m_hostkey;
};
#include "checkdlg.h"
#include "eventedit.h"
#include "eventsummary.h"
+#include "main.h"
#include "mainwindow.h"
#include "misc.h"
#include "moneylog.h"
m->addAction(tr("&Backup now..."),this,SLOT(doBackup()))
->setEnabled(req->hasRole("backup"));
- mb->addMenu(MMainWindow::helpMenu());
+ mb->addMenu(MApplication::helpMenu());
//tabs
setCentralWidget(tab=new QTabWidget);
ticketrender.cpp \
orderwin.cpp \
labeldlg.cpp \
- version.cpp \
templates.cpp \
templatedlg.cpp \
office.cpp \
msinterface.cpp
HEADERS = \
+ main.h \
keygen.h \
debug.h \
mainwindow.h \
include(widgets/widgets.pri)
include(wbase/wbase.pri)
include(wob/wob.pri)
-
-#LIBS += -lgmp
-
-versiontarget.target = version.xml
-versiontarget.commands = svn info -R --xml --non-interactive .. > version.xml
-versiontarget.depends = FORCE
-
-PRE_TARGETDEPS += version.xml
-QMAKE_EXTRA_TARGETS += versiontarget
+++ /dev/null
-//
-// C++ Implementation: version information
-//
-// Description: processes version.inc to form some meaningful C++ code
-//
-//
-// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2008
-//
-// Copyright: See README/COPYING files that come with this distribution
-//
-//
-
-#include "version.h"
-
-#define defversion(x,y) const char VERSION_##x[] = #y;
-#include "../www/inc/machine/version.inc"
-#undef defversion
-
-#include <QDomDocument>
-#include <QDomElement>
-#include <QFile>
-#include <QStringList>
-
-static QString rpart,srev;
-
-static void initVer()
-{
- QFile x(":/version.xml");
- x.open(QIODevice::ReadOnly);
- QDomDocument doc;
- doc.setContent(&x);
- QDomNodeList nl=doc.documentElement().elementsByTagName("entry");
- int baserev=0,maxrev=0;
- for(int i=0;i<nl.size();i++){
- QDomElement el=nl.at(i).toElement();
- QString p=el.attribute("path");
- int r=el.attribute("revision").toInt();
- if(p==".."){
- baserev=r;
- QDomNodeList nl2=el.elementsByTagName("url");
- QString u;
- if(nl2.size()>0)u=nl2.at(0).toElement().text();
- else continue;
- nl2=el.elementsByTagName("root");
- if(nl2.size()>0){
- u="."+u.mid(nl2.at(0).toElement().text().size());
- }
- QStringList sl=u.split("/smoke/");
- if(sl.size()>1)rpart=sl[1];
- else rpart=u;
- }
- if(r>maxrev)maxrev=r;
- }
- srev=QString::number(baserev);
- if(maxrev>baserev)srev+="-"+QString::number(maxrev);
-}
-
-QString repoPart()
-{
- if(rpart=="")initVer();
- return rpart;
-}
-
-QString svnRevision()
-{
- if(rpart=="")initVer();
- return srev;
-}
+++ /dev/null
-#include <QString>
-
-#define defversion(x,y) extern const char VERSION_##x[];
-#include "../www/inc/machine/version.inc"
-#undef defversion
-
-QString repoPart();
-QString svnRevision();
<Wolf>
<!-- generic settings -->
<Project baseDir=".." wobDir="wob" name="MagicSmoke"/>
- <Version comm="0100" needcomm="0100" humanReadable="1.1 alpha" svnTarget="."/>
+ <Version comm="0100" needcomm="0100" humanReadable="1.91 alpha" svnTarget="."/>
<DataBase instance="db" schema="dbScheme" version="01.04"/>
<!-- configure output -->
qDebug("Warning: unable to parse output of svn info.");
return;
}
- //parse it.
+ //parse it:revisions
QStringList rl=MDomQuery(doc,"/*/entry/@revision");
if(rl.size()==0){
m_svnRev="unknown";
else
m_svnRev=QString::number(minv)+"-"+QString::number(maxv);
}
+ //parse for repository path
+ MDomNodeList nl=MDomQuery(doc,"/*/entry");
+ for(int i=0;i<nl.size();i++){
+ QDomElement el=nl.at(i).toElement();
+ if(el.isNull())continue;
+ if(el.attribute("path")=="."){
+ rl=MDomQuery(el,"url");
+ if(rl.size()>0)m_svnUrl=rl[0];
+ rl=MDomQuery(el,"repository/root");
+ if(rl.size()>0)m_svnRoot=rl[0];
+ break;//we can stop now
+ }
+ }
}
//svn status
svn.start(m_svnExe,QStringList()<<"status"<<"--xml"<<"--non-interactive"<<".");
QString verHR()const{return m_verHR;}
/**returns the SVN revision of the project: it contains two tokens, the first one is the current revision or min-max if the working copy contains mixed revisions; the second token contains the word "vanilla" if there are no local modifications, or "modified" if there are local modifications*/
QString svnRevision()const{return m_svnRev;}
+ /**returns the SVN Repository Root*/
+ QString svnRepositoryRoot()const{return m_svnRoot;}
+ /**returns the complete SVN Repository URL*/
+ QString svnRepositoryUrl()const{return m_svnUrl;}
/**returns the variable name that will contain the database driver instance*/
QString dbInst()const{return m_dbInst;}
/**returns the variable name that will contain the database schema object*/
void errorFound();
private:
QString m_baseDir,m_wobDir,m_verComm,m_verNeedComm,m_verHR,m_projname;
- QString m_svnTarget,m_svnRev,m_svnExe,m_dbInst,m_dbSchema,m_dbVer;
+ QString m_svnTarget,m_svnRev,m_svnExe,m_svnRoot,m_svnUrl;
+ QString m_dbInst,m_dbSchema,m_dbVer;
bool m_error;
QList<WocTable> m_tables;
m_iface.write(QString("class "+m_prefix+"Interface:public WInterface\n{\n Q_OBJECT\n").toAscii());
m_iface.write(QString(" public:\n "+m_prefix+"Interface(QString name=\""+pn+"\"):WInterface(name){}\n").toAscii());
m_iface.write(QString(" static "+m_prefix+"Interface*instance(QString name=\""+pn+"\")\n\t{return qobject_cast<"+m_prefix+"Interface*>(WInterface::instance(name));}\n\n").toAscii());
- m_iface.write(QString(" QString commVersion()const{return \""+woc->verComm()+"\";}\n").toAscii());
- m_iface.write(QString(" QString needCommVersion()const{return \""+woc->verNeedComm()+"\";}\n").toAscii());
- m_iface.write(QString(" QString version()const{return \""+woc->verHR()+"\";}\n").toAscii());
- m_iface.write(QString(" QString svnVersion()const{return \""+woc->svnRevision()+"\";}\n\n").toAscii());
+ m_iface.write(QString(" static QString commVersion(){return \""+woc->verComm()+"\";}\n").toAscii());
+ m_iface.write(QString(" static QString needCommVersion(){return \""+woc->verNeedComm()+"\";}\n").toAscii());
+ m_iface.write(QString(" static QString version(){return \""+woc->verHR()+"\";}\n").toAscii());
+ m_iface.write(QString(" static QString svnVersion(){return \""+woc->svnRevision()+"\";}\n\n").toAscii());
+ m_iface.write(QString(" static QString svnRepositoryRoot(){return \""+woc->svnRepositoryRoot()+"\";}\n\n").toAscii());
+ m_iface.write(QString(" static QString svnRepositoryUrl(){return \""+woc->svnRepositoryUrl()+"\";}\n\n").toAscii());
//create all includer
m_hdr.setFileName(m_basedir+"/"+m_subdir+"/"+m_prefix+"Include.h");