summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kioslave/system/entries/documents.desktop2
-rw-r--r--kioslave/system/systemimpl.cpp32
-rw-r--r--kioslave/system/systemimpl.h3
-rw-r--r--konqueror/konq_mainwindow.cc63
4 files changed, 97 insertions, 3 deletions
diff --git a/kioslave/system/entries/documents.desktop b/kioslave/system/entries/documents.desktop
index 225149c25..e5fc3d1c3 100644
--- a/kioslave/system/entries/documents.desktop
+++ b/kioslave/system/entries/documents.desktop
@@ -1,6 +1,6 @@
[Desktop Entry]
Type=Link
-Path[$e]=$( kxdglauncher --getpath --xdgname DOCUMENTS )
+Path=$( kxdglauncher --getpath --xdgname DOCUMENTS )
Icon=folder_man
Name=Documents Folder
Name[af]=Dokument Gids
diff --git a/kioslave/system/systemimpl.cpp b/kioslave/system/systemimpl.cpp
index a53c85045..63171009a 100644
--- a/kioslave/system/systemimpl.cpp
+++ b/kioslave/system/systemimpl.cpp
@@ -27,6 +27,7 @@
#include <tqapplication.h>
#include <tqeventloop.h>
#include <tqdir.h>
+#include <tqfile.h>
#include <sys/stat.h>
@@ -206,6 +207,33 @@ void SystemImpl::createTopLevelEntry(KIO::UDSEntry &entry) const
addAtom(entry, KIO::UDS_ICON_NAME, 0, "system");
}
+TQString SystemImpl::readPathINL(TQString filename)
+{
+ bool isPathExpanded = false;
+ TQString unexpandedPath;
+ TQFile f( filename );
+ if (!f.open(IO_ReadOnly))
+ return TQString();
+ // set the codec for the current locale
+ TQTextStream s(&f);
+ TQString line = s.readLine();
+ while (!line.isNull())
+ {
+ if (line.startsWith("Path=$(")) {
+ isPathExpanded = true;
+ unexpandedPath = line.remove("Path=");
+ }
+ line = s.readLine();
+ }
+ if (isPathExpanded == false) {
+ KDesktopFile desktop(filename, true);
+ return desktop.readPath();
+ }
+ else {
+ return unexpandedPath;
+ }
+}
+
void SystemImpl::createEntry(KIO::UDSEntry &entry,
const TQString &directory,
const TQString &file)
@@ -219,7 +247,7 @@ void SystemImpl::createEntry(KIO::UDSEntry &entry,
entry.clear();
// Ensure that we really want this entry to be displayed
- if ( desktop.readURL().isEmpty() && desktop.readPath().isEmpty() )
+ if ( desktop.readURL().isEmpty() && readPathINL(directory+file).isEmpty() )
{
return;
}
@@ -231,7 +259,7 @@ void SystemImpl::createEntry(KIO::UDSEntry &entry,
if ( desktop.readURL().isEmpty() )
{
- addAtom(entry, KIO::UDS_URL, 0, desktop.readPath());
+ addAtom(entry, KIO::UDS_URL, 0, readPathINL(directory+file));
}
else
{
diff --git a/kioslave/system/systemimpl.h b/kioslave/system/systemimpl.h
index 2cddeb120..45de39b3b 100644
--- a/kioslave/system/systemimpl.h
+++ b/kioslave/system/systemimpl.h
@@ -22,6 +22,7 @@
#include <kio/global.h>
#include <kio/job.h>
+#include <kdesktopfile.h>
#include <kurl.h>
#include <dcopobject.h>
@@ -56,6 +57,8 @@ private:
bool m_lastListingEmpty;
+ TQString readPathINL(TQString filename);
+
/// Last error code stored in class to simplify API.
/// Note that this means almost no method can be const.
int m_lastErrorCode;
diff --git a/konqueror/konq_mainwindow.cc b/konqueror/konq_mainwindow.cc
index c6a9bb742..18b638934 100644
--- a/konqueror/konq_mainwindow.cc
+++ b/konqueror/konq_mainwindow.cc
@@ -485,6 +485,69 @@ void KonqMainWindow::openURL( KonqView *_view, const KURL &_url,
#endif
KURL url( _url );
+ if (url.url().startsWith("$(")) {
+ // check for environment variables and make necessary translations
+ TQString aValue = url.url();
+ int nDollarPos = aValue.find( '$' );
+
+ while( nDollarPos != -1 && nDollarPos+1 < static_cast<int>(aValue.length())) {
+ // there is at least one $
+ if( (aValue)[nDollarPos+1] == '(' ) {
+ uint nEndPos = nDollarPos+1;
+ // the next character is no $
+ while ( (nEndPos <= aValue.length()) && (aValue[nEndPos]!=')') )
+ nEndPos++;
+ nEndPos++;
+ TQString cmd = aValue.mid( nDollarPos+2, nEndPos-nDollarPos-3 );
+
+ TQString result;
+ FILE *fs = popen(TQFile::encodeName(cmd).data(), "r");
+ if (fs)
+ {
+ {
+ TQTextStream ts(fs, IO_ReadOnly);
+ result = ts.read().stripWhiteSpace();
+ }
+ pclose(fs);
+ }
+ aValue.replace( nDollarPos, nEndPos-nDollarPos, result );
+ } else if( (aValue)[nDollarPos+1] != '$' ) {
+ uint nEndPos = nDollarPos+1;
+ // the next character is no $
+ TQString aVarName;
+ if (aValue[nEndPos]=='{')
+ {
+ while ( (nEndPos <= aValue.length()) && (aValue[nEndPos]!='}') )
+ nEndPos++;
+ nEndPos++;
+ aVarName = aValue.mid( nDollarPos+2, nEndPos-nDollarPos-3 );
+ }
+ else
+ {
+ while ( nEndPos <= aValue.length() && (aValue[nEndPos].isNumber()
+ || aValue[nEndPos].isLetter() || aValue[nEndPos]=='_' ) )
+ nEndPos++;
+ aVarName = aValue.mid( nDollarPos+1, nEndPos-nDollarPos-1 );
+ }
+ const char* pEnv = 0;
+ if (!aVarName.isEmpty())
+ pEnv = getenv( aVarName.ascii() );
+ if( pEnv ) {
+ // !!! Sergey A. Sukiyazov <corwin@micom.don.ru> !!!
+ // A environment variables may contain values in 8bit
+ // locale cpecified encoding or in UTF8 encoding.
+ aValue.replace( nDollarPos, nEndPos-nDollarPos, KStringHandler::from8Bit( pEnv ) );
+ } else
+ aValue.remove( nDollarPos, nEndPos-nDollarPos );
+ } else {
+ // remove one of the dollar signs
+ aValue.remove( nDollarPos, 1 );
+ nDollarPos++;
+ }
+ nDollarPos = aValue.find( '$', nDollarPos );
+ }
+ url = KURL(aValue);
+ }
TQString serviceType( _serviceType );
if ( url.url() == "about:blank" )
{