~ubuntu-branches/ubuntu/trusty/qgis/trusty

« back to all changes in this revision

Viewing changes to src/plugins/grass/qtermwidget/ShellCommand.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Johan Van de Wauw
  • Date: 2010-07-11 20:23:24 UTC
  • mfrom: (3.1.4 squeeze)
  • Revision ID: james.westby@ubuntu.com-20100711202324-5ktghxa7hracohmr
Tags: 1.4.0+12730-3ubuntu1
* Merge from Debian unstable (LP: #540941).
* Fix compilation issues with QT 4.7
* Add build-depends on libqt4-webkit-dev 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
29
using namespace Konsole;
 
30
 
 
31
// expands environment variables in 'text'
 
32
// function copied from kdelibs/kio/kio/kurlcompletion.cpp
 
33
static bool expandEnv( QString& text );
 
34
 
 
35
ShellCommand::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
}
 
63
ShellCommand::ShellCommand( const QString& command , const QStringList& arguments )
 
64
{
 
65
  _arguments = arguments;
 
66
 
 
67
  if ( !_arguments.isEmpty() )
 
68
    _arguments[0] == command;
 
69
}
 
70
QString ShellCommand::fullCommand() const
 
71
{
 
72
  return _arguments.join( QChar( ' ' ) );
 
73
}
 
74
QString ShellCommand::command() const
 
75
{
 
76
  if ( !_arguments.isEmpty() )
 
77
    return _arguments[0];
 
78
  else
 
79
    return QString();
 
80
}
 
81
QStringList ShellCommand::arguments() const
 
82
{
 
83
  return _arguments;
 
84
}
 
85
bool ShellCommand::isRootCommand() const
 
86
{
 
87
  Q_ASSERT( 0 ); // not implemented yet
 
88
  return false;
 
89
}
 
90
bool ShellCommand::isAvailable() const
 
91
{
 
92
  Q_ASSERT( 0 ); // not implemented yet
 
93
  return false;
 
94
}
 
95
QStringList ShellCommand::expand( const QStringList& items )
 
96
{
 
97
  QStringList result;
 
98
 
 
99
  foreach( QString item , items )
 
100
  result << expand( item );
 
101
 
 
102
  return result;
 
103
}
 
104
QString 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
 */
 
117
static 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
 
 
128
    // Skip escaped '$'
 
129
    //
 
130
    if ( pos > 0 && text.at( pos - 1 ) == QLatin1Char( '\\' ) )
 
131
    {
 
132
      pos++;
 
133
    }
 
134
    // Variable found => expand
 
135
    //
 
136
    else
 
137
    {
 
138
      // Find the end of the variable = next '/' or ' '
 
139
      //
 
140
      int pos2 = text.indexOf( QLatin1Char( ' ' ), pos + 1 );
 
141
      int pos_tmp = text.indexOf( QLatin1Char( '/' ), pos + 1 );
 
142
 
 
143
      if ( pos2 == -1 || ( pos_tmp != -1 && pos_tmp < pos2 ) )
 
144
        pos2 = pos_tmp;
 
145
 
 
146
      if ( pos2 == -1 )
 
147
        pos2 = text.length();
 
148
 
 
149
      // Replace if the variable is terminated by '/' or ' '
 
150
      // and defined
 
151
      //
 
152
      if ( pos2 >= 0 )
 
153
      {
 
154
        int len = pos2 - pos;
 
155
        QString key = text.mid( pos + 1, len - 1 );
 
156
        QString value =
 
157
          QString::fromLocal8Bit( ::getenv( key.toLocal8Bit() ) );
 
158
 
 
159
        if ( !value.isEmpty() )
 
160
        {
 
161
          expanded = true;
 
162
          text.replace( pos, len, value );
 
163
          pos = pos + value.length();
 
164
        }
 
165
        else
 
166
        {
 
167
          pos = pos2;
 
168
        }
 
169
      }
 
170
    }
 
171
  }
 
172
 
 
173
  return expanded;
 
174
}