[svn-inject] Installing original source of teleschorsch
[debian/teleschorsch.git] / main.cpp
1 /*
2 # Copyright and License:
3 #
4 # Copyright (C) 2007 
5 # gregor herrmann <gregor+debian@comodo.priv.at>,
6 # Philipp Spitzer <philipp@spitzer.priv.at>
7 #
8 # This program is free software; you can redistribute it and/or modify it   
9 # under the terms of the GNU General Public License version 2 as published
10 # by the Free Software Foundation.
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 # You should have received a copy of the GNU General Public License along
16 # with this program; if not, write to the Free Software Foundation, Inc.,
17 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or point
18 # your browser to http://www.gnu.org/licenses/gpl.html
19 */
20
21 #include <QtGlobal>
22 #include <QtDebug>
23 #include <QApplication>
24 #include <QVector>
25 #include <QFile>
26 #include <QProcess>
27 #include <QMessageBox>
28 #include "main.h"
29 #include "options.h"
30
31
32 // Functions
33 // =========
34
35 void initConfigInfo(ConfigInfo& configInfo) {
36         QStringList environment = QProcess::systemEnvironment().filter(QRegExp("^HOME=")); // ("HOME=/home/gregoa")
37         if (environment.size() == 1) {
38                 configInfo.home = environment.at(0).mid(5);
39                 configInfo.userConfigFile = configInfo.home + + "/.teleschorschrc";
40         }
41         configInfo.systemConfigFile = "/etc/teleschorschrc";
42
43         // User config file
44         if (!configInfo.userConfigFile.isEmpty()) {
45                 QFile configFileUser(configInfo.userConfigFile);
46                 if (configFileUser.exists()) {configInfo.usedConfigFile  = configInfo.userConfigFile;}
47         }
48
49         // System config file
50         if (configInfo.usedConfigFile.isEmpty()) {
51                 QFile configFileSystem(configInfo.systemConfigFile);
52                 if (configFileSystem.exists()) configInfo.usedConfigFile = configInfo.systemConfigFile;
53         }
54 }
55
56
57 bool addConfig(const QString& fileName, ChannelVec& cv, QString& error) {
58         QFile file(fileName);
59         if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {error = QObject::tr("Could not open file %1").arg(fileName); return false;}
60         Channel channel; // current channel
61         bool sectionOccured = false;
62         while (!file.atEnd()) {
63                 QString line = QString(file.readLine()).trimmed();
64                 if (line.startsWith("#") || line.startsWith(";") || line.isEmpty()) continue; // strip comments
65                 
66                 // Is the line a [section]?
67                 bool section = line.startsWith("[") && line.endsWith("]") && line.size() >= 3;
68                 if (section) {
69                         if (sectionOccured) cv.push_back(channel);
70                         sectionOccured = true;
71                         channel = Channel();
72                         channel.name = line.mid(1, line.size()-2);
73                 }
74
75                 // Read properties
76                 int eqPos = line.indexOf("=");
77                 bool property = !section && eqPos >= 1;
78                 if (property) {
79                         QString propKey = line.left(eqPos);
80                         QString propVal = line.right(line.size()-eqPos-1);
81                         if (!sectionOccured) {error = QObject::tr("Property %1 is only allowed in a [section].").arg(propKey); return false;}
82
83                         if (propKey == "FULLNAME") channel.fullName = propVal;
84                         else if (propKey == "STATICURL") channel.staticUrl = propVal;
85                         else if (propKey == "PLAYER") channel.player = propVal;
86                         else {error = QObject::tr("Unknown key in ini file: %1").arg(propKey); return false;}
87                 }
88
89                 if (!section && !property) {error = QObject::tr("Line %1 is not valid.").arg(line); return false;}
90         }
91         if (sectionOccured) cv.push_back(channel);
92         return true;
93 }
94
95
96 QString readChannelVec(const ConfigInfo& configInfo, ChannelVec& channelVec) {
97         if (configInfo.usedConfigFile.isEmpty()) return QObject::tr("Neither %1 nor %2 found.").arg(configInfo.systemConfigFile).arg(configInfo.userConfigFile);
98         QString error;
99         if (!addConfig(configInfo.usedConfigFile, channelVec, error));
100         return error;
101 }
102
103
104
105 // MainDialog
106 // ==========
107
108 MainDialog::MainDialog(QWidget *parent): QDialog(parent) {
109         // User interface
110         setupUi(this);
111         QObject::connect(btnOptions, SIGNAL(clicked()), this, SLOT(editOptions()));
112         QObject::connect(btnStart, SIGNAL(clicked()), this, SLOT(startAction()));
113
114         // Init configInfo
115         initConfigInfo(configInfo);
116
117         // Read config
118         QString error = readChannelVec(configInfo, channelVec);
119         if (!error.isEmpty()) QMessageBox::warning(this, tr("Problem when reading the configuration file"), error);
120
121         // Fill in channels
122         updateLwChannels();
123 }
124
125
126 void MainDialog::editOptions() {
127         OptionsDialog *od = new OptionsDialog();
128         if (od->exec(configInfo.userConfigFile)) {
129                 channelVec.clear();
130                 QString error = readChannelVec(configInfo, channelVec);
131                 if (!error.isEmpty()) QMessageBox::warning(this, tr("Problem when reading the configuration file"), error);
132                 updateLwChannels();
133         }
134         delete od;
135 }
136
137
138 void MainDialog::updateLwChannels() {
139         lwChannels->clear();
140         for (int i = 0; i != channelVec.size(); ++i) lwChannels->addItem(channelVec[i].fullName);
141 }
142
143
144 bool MainDialog::startAction() {
145         int row = lwChannels->currentRow();
146         if (row > 0) {
147                 Channel channel = channelVec[row];
148                 qDebug() << "User would like to see " << channel.staticUrl;
149
150                 QString program = "/usr/bin/vlc";
151                 QStringList arguments;
152                 // arguments << "-style" << "motif";
153                 // @args=("$player $url " . ${playeroptions}{$player} . " $offsetseconds");
154                 QProcess player(0);
155                 player.start(program, arguments);
156                 player.waitForFinished();
157                 return true;
158         }
159         return false;
160 }
161
162
163
164 // Main function
165 // =============
166
167 int main(int argc, char *argv[]) {
168         QApplication app(argc, argv);
169         MainDialog *mainDialog = new MainDialog();
170         mainDialog->show();
171         return app.exec();
172