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

1.2.1 by Francesco Paolo Lovergine
Import upstream version 1.4.0+12730
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
}