~ubuntu-branches/debian/sid/smplayer/sid

« back to all changes in this revision

Viewing changes to src/myprocess.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Maia Kozheva
  • Date: 2009-03-31 23:05:43 UTC
  • mfrom: (1.2.2 upstream)
  • mto: This revision was merged to the branch mainline in revision 14.
  • Revision ID: james.westby@ubuntu.com-20090331230543-0h2hfwpwlu9opbv2
Tags: 0.6.7-1
* New upstream release. (Closes: #523791)
  - Reworked subtitle font preferences. (Closes: #503295)
  - No longer installs qt_fr.qm. (Closes: #486314)
* debian/control:
  - Bumped Standards-Version to 3.8.1.
  - Changed maintainer name (still the same person and GPG key).
  - Changed section to video.
  - Build-depend on zlib1g-dev for findsubtitles.
  - Require Qt >= 4.3 per readme.
  - Added ${misc:Depends}.
  - Make smplayer-translations depend on smplayer and smplayer recommend
    smplayer-translations, not the other way round. (Closes: #489375)
* debian/copyright:
  - Significantly expanded per-file with new upstream authors.
* debian/rules:
  - Make make use correct uic in install.
  - Clean svn_revision.
  - Removed get-orig-source - not needed with uscan --repack.
* debian/patches/01_gl_translation.patch:
  - Added patch to fix lrelease error on smplayer_gl.ts.
* Added debian/README.source for simple-patchsys.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  smplayer, GUI front-end for mplayer.
 
2
    Copyright (C) 2006-2009 Ricardo Villalba <rvm@escomposlinux.org>
 
3
 
 
4
    This program is free software; you can redistribute it and/or modify
 
5
    it under the terms of the GNU General Public License as published by
 
6
    the Free Software Foundation; either version 2 of the License, or
 
7
    (at your option) any later version.
 
8
 
 
9
    This program is distributed in the hope that it will be useful,
 
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
    GNU General Public License for more details.
 
13
 
 
14
    You should have received a copy of the GNU General Public License
 
15
    along with this program; if not, write to the Free Software
 
16
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
17
*/
 
18
 
 
19
#include "myprocess.h"
 
20
 
 
21
#ifdef Q_OS_WIN
 
22
 
 
23
#if QT_VERSION < 0x040300
 
24
#define USE_TEMP_FILE 1
 
25
#else
 
26
#define USE_TEMP_FILE 0
 
27
#endif
 
28
 
 
29
#else
 
30
#define USE_TEMP_FILE 0
 
31
#endif
 
32
 
 
33
 
 
34
MyProcess::MyProcess(QObject * parent) : QProcess(parent)
 
35
{
 
36
        clearArguments();
 
37
        setProcessChannelMode( QProcess::MergedChannels );
 
38
        
 
39
#if USE_TEMP_FILE
 
40
        temp_file.open(); // Create temporary file
 
41
        QString filename = temp_file.fileName();
 
42
        setStandardOutputFile( filename );
 
43
        qDebug("MyProcess::MyProcess: temporary file: %s", filename.toUtf8().data());
 
44
        temp_file.close();
 
45
 
 
46
        //connect(&temp_file, SIGNAL(readyRead()), this, SLOT(readTmpFile()) );
 
47
        connect(&timer, SIGNAL(timeout()), this, SLOT(readTmpFile()) );
 
48
#else
 
49
        connect(this, SIGNAL(readyReadStandardOutput()), this, SLOT(readStdOut()) );
 
50
#endif
 
51
 
 
52
        connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), 
 
53
            this, SLOT(procFinished()) ); 
 
54
 
 
55
        // Test splitArguments
 
56
        //QStringList l = MyProcess::splitArguments("-opt 1 hello \"56 67\" wssx -ios");
 
57
}
 
58
 
 
59
void MyProcess::clearArguments() {
 
60
        program = "";
 
61
        arg.clear();
 
62
}
 
63
 
 
64
bool MyProcess::isRunning() {
 
65
        return (state() == QProcess::Running);
 
66
}
 
67
 
 
68
void MyProcess::addArgument(const QString & a) {
 
69
        if (program.isEmpty()) {
 
70
                program = a;
 
71
        } else {
 
72
                arg.append(a);
 
73
        }
 
74
}
 
75
 
 
76
QStringList MyProcess::arguments() {
 
77
        QStringList l = arg;
 
78
        l.prepend(program);
 
79
        return l;
 
80
}
 
81
 
 
82
void MyProcess::start() {
 
83
        remaining_output.clear();
 
84
 
 
85
        QProcess::start(program, arg);
 
86
 
 
87
#if USE_TEMP_FILE
 
88
        //bool r = temp_file.open(QIODevice::ReadOnly);
 
89
        bool r = temp_file.open();
 
90
        timer.start(50);
 
91
        qDebug("MyProcess::start: r: %d", r);
 
92
#endif
 
93
}
 
94
 
 
95
void MyProcess::readStdOut() {
 
96
        genericRead( readAllStandardOutput() );
 
97
}
 
98
 
 
99
 
 
100
void MyProcess::readTmpFile() {
 
101
        genericRead( temp_file.readAll() );
 
102
}
 
103
 
 
104
void MyProcess::genericRead(QByteArray buffer) {
 
105
        QByteArray ba = remaining_output + buffer;
 
106
        int start = 0;
 
107
        int from_pos = 0;
 
108
        int pos = canReadLine(ba, from_pos);
 
109
 
 
110
        //qDebug("MyProcess::read: pos: %d", pos);
 
111
        while ( pos > -1 ) {
 
112
                // Readline
 
113
                //QByteArray line = ba.left(pos);
 
114
                QByteArray line = ba.mid(start, pos-start);
 
115
                //ba = ba.mid(pos+1);
 
116
                from_pos = pos + 1;
 
117
#ifdef Q_OS_WIN
 
118
                if ((from_pos < ba.size()) && (ba.at(from_pos)=='\n')) from_pos++;
 
119
#endif
 
120
                start = from_pos;
 
121
 
 
122
                emit lineAvailable(line);
 
123
 
 
124
                pos = canReadLine(ba, from_pos);
 
125
        }
 
126
 
 
127
        remaining_output = ba.mid(from_pos);
 
128
}
 
129
 
 
130
int MyProcess::canReadLine(const QByteArray & ba, int from) {
 
131
        int pos1 = ba.indexOf('\n', from);
 
132
        int pos2 = ba.indexOf('\r', from);
 
133
 
 
134
        //qDebug("MyProcess::canReadLine: pos2: %d", pos2);
 
135
 
 
136
        if ( (pos1 == -1) && (pos2 == -1) ) return -1;
 
137
 
 
138
        int pos = pos1;
 
139
        if ( (pos1 != -1) && (pos2 != -1) ) {
 
140
                /*
 
141
                if (pos2 == (pos1+1)) pos = pos2; // \r\n
 
142
                else
 
143
                */
 
144
                if (pos1 < pos2) pos = pos1; else pos = pos2;
 
145
        } else {
 
146
                if (pos1 == -1) pos = pos2;
 
147
                else
 
148
                if (pos2 == -1) pos = pos1;
 
149
        }
 
150
 
 
151
        return pos;
 
152
}
 
153
 
 
154
/*!
 
155
Do some clean up, and be sure that all output has been read.
 
156
*/
 
157
void MyProcess::procFinished() {
 
158
        qDebug("MyProcess::procFinished");
 
159
 
 
160
#if !USE_TEMP_FILE
 
161
        qDebug("MyProcess::procFinished: Bytes available: %ld", bytesAvailable());
 
162
        if ( bytesAvailable() > 0 ) readStdOut();
 
163
#else
 
164
        timer.stop();
 
165
 
 
166
        qDebug("MyProcess::procFinished: Bytes available: %ld", temp_file.bytesAvailable());
 
167
        if ( temp_file.bytesAvailable() > 0 ) readTmpFile();
 
168
        qDebug("MyProcess::procFinished: Bytes available: %ld", temp_file.bytesAvailable());
 
169
 
 
170
        temp_file.close();
 
171
#endif
 
172
}
 
173
 
 
174
QStringList MyProcess::splitArguments(const QString & args) {
 
175
        qDebug("MyProcess::splitArguments: '%s'", args.toUtf8().constData());
 
176
 
 
177
        QStringList l;
 
178
 
 
179
        bool opened_quote = false;
 
180
        int init_pos = 0;
 
181
        for (int n = 0; n < args.length(); n++) {
 
182
                if ((args[n] == QChar(' ')) && (!opened_quote)) {
 
183
                        l.append(args.mid(init_pos, n - init_pos));
 
184
                        init_pos = n+1;
 
185
                }
 
186
                else
 
187
                if (args[n] == QChar('\"')) opened_quote = !opened_quote;
 
188
 
 
189
                if (n == args.length()-1) {
 
190
                        l.append(args.mid(init_pos, (n - init_pos)+1));
 
191
                }
 
192
        }
 
193
 
 
194
        for (int n = 0; n < l.count(); n++) {
 
195
                qDebug("MyProcess::splitArguments: arg: %d '%s'", n, l[n].toUtf8().constData());
 
196
        }
 
197
 
 
198
        return l;
 
199
}
 
200
 
 
201
#include "moc_myprocess.cpp"