source: ogBrowser-Git/qtermwidget/src/ShellCommand.cpp

qndtest
Last change on this file was 050d67a, checked in by adelcastillo <adelcastillo@…>, 15 years ago

Ahora el browser tiene consola en vez del output.
Pasado todo el sistema de compilacion a cmake.

git-svn-id: https://opengnsys.es/svn/trunk@408 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100644
File size: 4.0 KB
Line 
1/*
2    Copyright (C) 2007 by Robert Knight <robertknight@gmail.com>
3
4    Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19    02110-1301  USA.
20*/
21
22// Own
23#include "ShellCommand.h"
24
25//some versions of gcc(4.3) require explicit include
26#include <cstdlib>
27
28
29using namespace Konsole;
30
31// expands environment variables in 'text'
32// function copied from kdelibs/kio/kio/kurlcompletion.cpp
33static bool expandEnv(QString& text);
34
35ShellCommand::ShellCommand(const QString& fullCommand)
36{
37    bool inQuotes = false;
38
39    QString builder;
40
41    for ( int i = 0 ; i < fullCommand.count() ; i++ )
42    {
43        QChar ch = fullCommand[i];
44
45        const bool isLastChar = ( i == fullCommand.count() - 1 );
46        const bool isQuote = ( ch == '\'' || ch == '\"' );
47
48        if ( !isLastChar && isQuote )
49            inQuotes = !inQuotes;
50        else
51        { 
52            if ( (!ch.isSpace() || inQuotes) && !isQuote )
53                builder.append(ch);
54
55            if ( (ch.isSpace() && !inQuotes) || ( i == fullCommand.count()-1 ) )
56            {
57                _arguments << builder;     
58                builder.clear(); 
59            }
60        }
61    }
62}
63ShellCommand::ShellCommand(const QString& command , const QStringList& arguments)
64{
65    _arguments = arguments;
66   
67    if ( !_arguments.isEmpty() )
68        _arguments[0] == command;
69}
70QString ShellCommand::fullCommand() const
71{
72    return _arguments.join(QChar(' '));
73}
74QString ShellCommand::command() const
75{
76    if ( !_arguments.isEmpty() )
77        return _arguments[0];
78    else
79        return QString();
80}
81QStringList ShellCommand::arguments() const
82{
83    return _arguments;
84}
85bool ShellCommand::isRootCommand() const
86{
87    Q_ASSERT(0); // not implemented yet
88    return false;
89}
90bool ShellCommand::isAvailable() const
91{
92    Q_ASSERT(0); // not implemented yet
93    return false; 
94}
95QStringList ShellCommand::expand(const QStringList& items)
96{
97    QStringList result;
98
99    foreach( QString item , items )
100        result << expand(item);
101
102    return result;
103}
104QString ShellCommand::expand(const QString& text)
105{
106    QString result = text;
107    expandEnv(result);
108    return result;
109}
110
111/*
112 * expandEnv
113 *
114 * Expand environment variables in text. Escaped '$' characters are ignored.
115 * Return true if any variables were expanded
116 */
117static bool expandEnv( QString &text )
118{
119        // Find all environment variables beginning with '$'
120        //
121        int pos = 0;
122
123        bool expanded = false;
124
125        while ( (pos = text.indexOf(QLatin1Char('$'), pos)) != -1 ) {
126
127                // Skip escaped '$'
128                //
129                if ( pos > 0 && text.at(pos-1) == QLatin1Char('\\') ) {
130                        pos++;
131                }
132                // Variable found => expand
133                //
134                else {
135                        // Find the end of the variable = next '/' or ' '
136                        //
137                        int pos2 = text.indexOf( QLatin1Char(' '), pos+1 );
138                        int pos_tmp = text.indexOf( QLatin1Char('/'), pos+1 );
139
140                        if ( pos2 == -1 || (pos_tmp != -1 && pos_tmp < pos2) )
141                                pos2 = pos_tmp;
142
143                        if ( pos2 == -1 )
144                                pos2 = text.length();
145
146                        // Replace if the variable is terminated by '/' or ' '
147                        // and defined
148                        //
149                        if ( pos2 >= 0 ) {
150                                int len = pos2 - pos;
151                                QString key     = text.mid( pos+1, len-1);
152                                QString value =
153                                        QString::fromLocal8Bit( ::getenv(key.toLocal8Bit()) );
154
155                                if ( !value.isEmpty() ) {
156                                        expanded = true;
157                                        text.replace( pos, len, value );
158                                        pos = pos + value.length();
159                                }
160                                else {
161                                        pos = pos2;
162                                }
163                        }
164                }
165        }
166
167        return expanded;
168}
Note: See TracBrowser for help on using the repository browser.