Kaydet (Commit) 180ca9e9 authored tarafından Kurt Zenker's avatar Kurt Zenker

INTEGRATION: CWS obr05 (1.12.6); FILE MERGED

2007/06/13 07:53:33 obr 1.12.6.2: #i75329# fixed crash when open of file failed
2007/06/08 06:30:53 obr 1.12.6.1: #i75329# patch commited
üst cde8aaba
......@@ -4,9 +4,9 @@
*
* $RCSfile: gconflayer.cxx,v $
*
* $Revision: 1.12 $
* $Revision: 1.13 $
*
* last change: $Author: rt $ $Date: 2007-04-04 07:47:04 $
* last change: $Author: kz $ $Date: 2007-06-19 16:11:58 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
......@@ -52,6 +52,10 @@
#include <rtl/strbuf.hxx>
#endif
#ifndef _RTL_USTRBUF_HXX_
#include <rtl/ustrbuf.hxx>
#endif
#ifndef _OSL_SECURITY_HXX_
#include <osl/security.hxx>
#endif
......@@ -68,6 +72,8 @@
#include <com/sun/star/uno/Sequence.hxx>
#endif
using namespace rtl;
//==============================================================================
GconfLayer::GconfLayer( const uno::Reference<uno::XComponentContext>& xContext,
......@@ -97,6 +103,133 @@ GconfLayer::GconfLayer( const uno::Reference<uno::XComponentContext>& xContext,
//------------------------------------------------------------------------------
static OUString xdg_user_dir_lookup (const char *type)
{
char *config_home;
char *p;
int relative;
bool bError = false;
osl::Security aSecurity;
oslFileHandle handle;
OUString aHomeDirURL;
OUString aDocumentsDirURL;
OUString aConfigFileURL;
OUStringBuffer aUserDirBuf;
if (!aSecurity.getHomeDir( aHomeDirURL ) )
{
osl::FileBase::getFileURLFromSystemPath(rtl::OUString::createFromAscii("/tmp"), aDocumentsDirURL);
return aDocumentsDirURL;
}
config_home = getenv ("XDG_CONFIG_HOME");
if (config_home == NULL || config_home[0] == 0)
{
aConfigFileURL = OUString(aHomeDirURL);
aConfigFileURL += OUString::createFromAscii( "/.config/user-dirs.dirs" );
}
else
{
aConfigFileURL = OUString::createFromAscii(config_home);
aConfigFileURL += OUString::createFromAscii( "/user-dirs.dirs" );
}
if(osl_File_E_None == osl_openFile(aConfigFileURL.pData, &handle, osl_File_OpenFlag_Read))
{
rtl::ByteSequence seq;
while (osl_File_E_None == osl_readLine(handle , (sal_Sequence **)&seq))
{
/* Remove newline at end */
int len = seq.getLength();
if(len>0 && seq[len-1] == '\n')
seq[len-1] = 0;
p = (char *)seq.getArray();
while (*p == ' ' || *p == '\t')
p++;
if (strncmp (p, "XDG_", 4) != 0)
continue;
p += 4;
if (strncmp (p, type, strlen (type)) != 0)
continue;
p += strlen (type);
if (strncmp (p, "_DIR", 4) != 0)
continue;
p += 4;
while (*p == ' ' || *p == '\t')
p++;
if (*p != '=')
continue;
p++;
while (*p == ' ' || *p == '\t')
p++;
if (*p != '"')
continue;
p++;
relative = 0;
if (strncmp (p, "$HOME/", 6) == 0)
{
p += 6;
relative = 1;
}
else if (*p != '/')
continue;
if (relative)
{
aUserDirBuf = OUStringBuffer(aHomeDirURL);
aUserDirBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM( "/" ) );
}
else
{
aUserDirBuf = OUStringBuffer();
}
while (*p && *p != '"')
{
if ((*p == '\\') && (*(p+1) != 0))
p++;
aUserDirBuf.append((sal_Unicode)*p++);
}
}
osl_closeFile(handle);
}
else
bError = true;
if (aUserDirBuf.getLength()>0 && !bError)
{
aDocumentsDirURL = aUserDirBuf.makeStringAndClear();
osl::Directory aDocumentsDir( aDocumentsDirURL );
if( osl::FileBase::E_None == aDocumentsDir.open() )
return aDocumentsDirURL;
}
/* Special case desktop for historical compatibility */
if (strcmp (type, "DESKTOP") == 0)
{
aUserDirBuf = OUStringBuffer(aHomeDirURL);
aUserDirBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM( "/Desktop" ) );
return aUserDirBuf.makeStringAndClear();
}
else
{
aUserDirBuf = OUStringBuffer(aHomeDirURL);
aUserDirBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM( "/Documents" ) );
return aUserDirBuf.makeStringAndClear();
}
}
//------------------------------------------------------------------------------
uno::Any makeAnyOfGconfValue( GConfValue *aGconfValue )
{
switch( aGconfValue->type )
......@@ -141,6 +274,7 @@ static void splitFontName( GConfValue *aGconfValue, rtl::OUString &rName, sal_In
uno::Any translateToOOo( const ConfigurationValue aValue, GConfValue *aGconfValue )
{
switch( aValue.nSettingId )
{
case SETTING_PROXY_MODE:
......@@ -212,10 +346,8 @@ uno::Any translateToOOo( const ConfigurationValue aValue, GConfValue *aGconfValu
case SETTING_WORK_DIRECTORY:
{
osl::Security aSecurity;
rtl::OUString aDocumentsDirURL;
if ( aSecurity.getHomeDir( aDocumentsDirURL ) )
aDocumentsDirURL += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/Documents" ) );
rtl::OUString aDocumentsDirURL = xdg_user_dir_lookup("DOCUMENTS");
return uno::makeAny( aDocumentsDirURL );
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment