diff options
Diffstat (limited to 'framework/source/fwi/helper')
-rw-r--r-- | framework/source/fwi/helper/mischelper.cxx | 242 | ||||
-rw-r--r-- | framework/source/fwi/helper/networkdomain.cxx | 295 | ||||
-rw-r--r-- | framework/source/fwi/helper/shareablemutex.cxx | 81 |
3 files changed, 618 insertions, 0 deletions
diff --git a/framework/source/fwi/helper/mischelper.cxx b/framework/source/fwi/helper/mischelper.cxx new file mode 100644 index 000000000000..641200069dfc --- /dev/null +++ b/framework/source/fwi/helper/mischelper.cxx @@ -0,0 +1,242 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_framework.hxx" + +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/document/XDocumentLanguages.hpp> +#include <com/sun/star/frame/XModuleManager.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> + +#include <tools/debug.hxx> +#include <vcl/settings.hxx> +#include <vcl/svapp.hxx> +#include <i18npool/mslangid.hxx> +#include <svtools/langtab.hxx> +#include <comphelper/processfactory.hxx> +#include <helper/mischelper.hxx> +#include <services.h> + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; + +using ::rtl::OUString; + + +namespace framework +{ + +uno::Reference< linguistic2::XLanguageGuessing > LanguageGuessingHelper::GetGuesser() const +{ + if (!m_xLanguageGuesser.is()) + { + try + { + m_xLanguageGuesser = uno::Reference< linguistic2::XLanguageGuessing >( + m_xServiceManager->createInstance( + rtl::OUString::createFromAscii( "com.sun.star.linguistic2.LanguageGuessing" ) ), + uno::UNO_QUERY ); + } + catch (uno::Exception &r) + { + (void) r; + DBG_ASSERT( 0, "failed to get language guessing component" ); + } + } + return m_xLanguageGuesser; +} + +//////////////////////////////////////////////////////////// + +::rtl::OUString RetrieveLabelFromCommand( + const ::rtl::OUString& aCmdURL, + const uno::Reference< lang::XMultiServiceFactory >& _xServiceFactory, + uno::Reference< container::XNameAccess >& _xUICommandLabels, + const uno::Reference< frame::XFrame >& _xFrame, + ::rtl::OUString& _rModuleIdentifier, + sal_Bool& _rIni, + const sal_Char* _pName) +{ + ::rtl::OUString aLabel; + + // Retrieve popup menu labels + if ( !_xUICommandLabels.is() ) + { + try + { + if ( !_rIni ) + { + _rIni = sal_True; + Reference< XModuleManager > xModuleManager( _xServiceFactory->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY_THROW ); + + try + { + _rModuleIdentifier = xModuleManager->identify( _xFrame ); + } + catch( Exception& ) + { + } + } + + Reference< XNameAccess > xNameAccess( _xServiceFactory->createInstance( SERVICENAME_UICOMMANDDESCRIPTION ), UNO_QUERY ); + if ( xNameAccess.is() ) + { + xNameAccess->getByName( _rModuleIdentifier ) >>= _xUICommandLabels; + } + } + catch ( Exception& ) + { + } + } + + if ( _xUICommandLabels.is() ) + { + try + { + if ( aCmdURL.getLength() > 0 ) + { + rtl::OUString aStr; + Sequence< PropertyValue > aPropSeq; + if( _xUICommandLabels->hasByName( aCmdURL ) ) + { + if ( _xUICommandLabels->getByName( aCmdURL ) >>= aPropSeq ) + { + for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ ) + { + if ( aPropSeq[i].Name.equalsAscii( _pName/*"Label"*/ )) + { + aPropSeq[i].Value >>= aStr; + break; + } + } + } + } + aLabel = aStr; + } + } + catch ( com::sun::star::uno::Exception& ) + { + } + } + + return aLabel; +} + +//////////////////////////////////////////////////////////// + +void FillLangItems( std::set< OUString > &rLangItems, + const SvtLanguageTable & rLanguageTable, + const uno::Reference< frame::XFrame > & rxFrame, + const LanguageGuessingHelper & rLangGuessHelper, + sal_Int16 nScriptType, + const OUString & rCurLang, + const OUString & rKeyboardLang, + const OUString & rGuessedTextLang ) +{ + rLangItems.clear(); + + //1--add current language + if( rCurLang != OUString() && + LANGUAGE_DONTKNOW != rLanguageTable.GetType( rCurLang )) + rLangItems.insert( rCurLang ); + + //2--System + const AllSettings& rAllSettings = Application::GetSettings(); + LanguageType rSystemLanguage = rAllSettings.GetLanguage(); + if( rSystemLanguage != LANGUAGE_DONTKNOW ) + { + if ( IsScriptTypeMatchingToLanguage( nScriptType, rSystemLanguage )) + rLangItems.insert( OUString( rLanguageTable.GetString( rSystemLanguage )) ); + } + + //3--UI + LanguageType rUILanguage = rAllSettings.GetUILanguage(); + if( rUILanguage != LANGUAGE_DONTKNOW ) + { + if ( IsScriptTypeMatchingToLanguage( nScriptType, rUILanguage )) + rLangItems.insert( OUString( rLanguageTable.GetString( rUILanguage )) ); + } + + //4--guessed language + uno::Reference< linguistic2::XLanguageGuessing > xLangGuesser( rLangGuessHelper.GetGuesser() ); + if ( xLangGuesser.is() && rGuessedTextLang.getLength() > 0) + { + ::com::sun::star::lang::Locale aLocale(xLangGuesser->guessPrimaryLanguage( rGuessedTextLang, 0, rGuessedTextLang.getLength()) ); + LanguageType nLang = MsLangId::convertLocaleToLanguageWithFallback( aLocale ); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_NONE && nLang != LANGUAGE_SYSTEM + && IsScriptTypeMatchingToLanguage( nScriptType, nLang )) + rLangItems.insert( rLanguageTable.GetString( nLang )); + } + + //5--keyboard language + if( rKeyboardLang != OUString()) + { + if ( IsScriptTypeMatchingToLanguage( nScriptType, rLanguageTable.GetType( rKeyboardLang ))) + rLangItems.insert( rKeyboardLang ); + } + + //6--all languages used in current document + Reference< com::sun::star::frame::XModel > xModel; + if ( rxFrame.is() ) + { + Reference< com::sun::star::frame::XController > xController( rxFrame->getController(), UNO_QUERY ); + if ( xController.is() ) + xModel = xController->getModel(); + } + Reference< document::XDocumentLanguages > xDocumentLanguages( xModel, UNO_QUERY ); + /*the description of nScriptType + LATIN : 0x001 + ASIAN : 0x002 + COMPLEX: 0x004 + */ + const sal_Int16 nMaxCount = 7; + if ( xDocumentLanguages.is() ) + { + Sequence< Locale > rLocales( xDocumentLanguages->getDocumentLanguages( nScriptType, nMaxCount )); + if ( rLocales.getLength() > 0 ) + { + for ( sal_uInt16 i = 0; i < rLocales.getLength(); ++i ) + { + if ( rLangItems.size() == static_cast< size_t >(nMaxCount) ) + break; + const Locale& rLocale=rLocales[i]; + if( IsScriptTypeMatchingToLanguage( nScriptType, rLanguageTable.GetType( rLocale.Language ))) + rLangItems.insert( OUString( rLocale.Language ) ); + } + } + } +} + +} // namespace framework + + diff --git a/framework/source/fwi/helper/networkdomain.cxx b/framework/source/fwi/helper/networkdomain.cxx new file mode 100644 index 000000000000..fcc966402944 --- /dev/null +++ b/framework/source/fwi/helper/networkdomain.cxx @@ -0,0 +1,295 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_framework.hxx" +#include <helper/networkdomain.hxx> + +namespace framework +{ + +#ifdef WNT +//_________________________________________________________________________________________________________________ +// Windows +//_________________________________________________________________________________________________________________ + +#define UNICODE +#if defined _MSC_VER +#pragma warning(push, 1) +#endif +#include <windows.h> +#if defined _MSC_VER +#pragma warning(pop) +#endif + +//_________________________________________________________________________________________________________________ +// Win NT, Win 2000, Win XP +//_________________________________________________________________________________________________________________ + +static DWORD WINAPI GetUserDomainW_NT( LPWSTR lpBuffer, DWORD nSize ) +{ + return GetEnvironmentVariable( TEXT("USERDOMAIN"), lpBuffer, nSize ); +} + +//_________________________________________________________________________________________________________________ +// Win 9x,Win ME +//_________________________________________________________________________________________________________________ + +static DWORD WINAPI GetUserDomainW_WINDOWS( LPWSTR lpBuffer, DWORD nSize ) +{ + HKEY hkeyLogon; + HKEY hkeyWorkgroup; + DWORD dwResult = 0; + + + if ( ERROR_SUCCESS == RegOpenKeyEx( + HKEY_LOCAL_MACHINE, + TEXT("Network\\Logon"), + 0, KEY_READ, &hkeyLogon ) ) + { + DWORD dwLogon = 0; + DWORD dwLogonSize = sizeof(dwLogon); + RegQueryValueEx( hkeyLogon, TEXT("LMLogon"), 0, NULL, (LPBYTE)&dwLogon, &dwLogonSize ); + RegCloseKey( hkeyLogon ); + + if ( dwLogon ) + { + HKEY hkeyNetworkProvider; + + if ( ERROR_SUCCESS == RegOpenKeyEx( + HKEY_LOCAL_MACHINE, + TEXT("SYSTEM\\CurrentControlSet\\Services\\MSNP32\\NetworkProvider"), + 0, KEY_READ, &hkeyNetworkProvider ) ) + { + DWORD dwBufferSize = nSize; + LONG lResult = RegQueryValueEx( hkeyNetworkProvider, TEXT("AuthenticatingAgent"), 0, NULL, (LPBYTE)lpBuffer, &dwBufferSize ); + + if ( ERROR_SUCCESS == lResult || ERROR_MORE_DATA == lResult ) + dwResult = dwBufferSize / sizeof(TCHAR); + + RegCloseKey( hkeyNetworkProvider ); + } + } + } + else if ( ERROR_SUCCESS == RegOpenKeyEx( + HKEY_LOCAL_MACHINE, + TEXT("SYSTEM\\CurrentControlSet\\Services\\VxD\\VNETSUP"), + 0, KEY_READ, &hkeyWorkgroup ) ) + { + DWORD dwBufferSize = nSize; + LONG lResult = RegQueryValueEx( hkeyWorkgroup, TEXT("Workgroup"), 0, NULL, (LPBYTE)lpBuffer, &dwBufferSize ); + + if ( ERROR_SUCCESS == lResult || ERROR_MORE_DATA == lResult ) + dwResult = dwBufferSize / sizeof(TCHAR); + + RegCloseKey( hkeyWorkgroup ); + } + + + return dwResult; +} + +static rtl::OUString GetUserDomain() +{ + sal_Unicode aBuffer[256]; + + long nVersion = GetVersion(); + DWORD nResult; + + if ( nVersion < 0 ) + nResult = GetUserDomainW_WINDOWS( reinterpret_cast<LPWSTR>(aBuffer), sizeof( aBuffer ) ); + else + nResult = GetUserDomainW_NT( reinterpret_cast<LPWSTR>(aBuffer), sizeof( aBuffer ) ); + + if ( nResult > 0 ) + return rtl::OUString( aBuffer ); + else + return rtl::OUString(); +} + +//_________________________________________________________________________________________________________________ +// Windows +//_________________________________________________________________________________________________________________ + +rtl::OUString NetworkDomain::GetYPDomainName() +{ + return ::rtl::OUString(); +} + +rtl::OUString NetworkDomain::GetNTDomainName() +{ + return GetUserDomain(); +} + +#elif defined( UNIX ) + +#include <rtl/ustring.h> +#include <stdlib.h> +#include <errno.h> +#include <osl/thread.h> + +//_________________________________________________________________________________________________________________ +// Unix +//_________________________________________________________________________________________________________________ + +#if defined( SOLARIS ) + +//_________________________________________________________________________________________________________________ +// Solaris +//_________________________________________________________________________________________________________________ + +#include <sys/systeminfo.h> +#include <sal/alloca.h> + +static rtl_uString *getDomainName() +{ + /* Initialize and assume failure */ + rtl_uString *ustrDomainName = NULL; + + char szBuffer[256]; + + long nCopied = sizeof(szBuffer); + char *pBuffer = szBuffer; + long nBufSize; + + do + { + nBufSize = nCopied; + nCopied = sysinfo( SI_SRPC_DOMAIN, pBuffer, nBufSize ); + + /* If nCopied is greater than buffersize we need to allocate + a buffer with suitable size */ + + if ( nCopied > nBufSize ) + pBuffer = (char *)alloca( nCopied ); + + } while ( nCopied > nBufSize ); + + if ( -1 != nCopied ) + { + rtl_string2UString( + &ustrDomainName, + pBuffer, + nCopied - 1, + osl_getThreadTextEncoding(), + OSTRING_TO_OUSTRING_CVTFLAGS ); + } + + return ustrDomainName; +} + +#elif defined( LINUX ) /* endif SOLARIS */ + +//_________________________________________________________________________________________________________________ +// Linux +//_________________________________________________________________________________________________________________ + +#include <unistd.h> +#include <string.h> + +static rtl_uString *getDomainName() +{ + /* Initialize and assume failure */ + rtl_uString *ustrDomainName = NULL; + + char *pBuffer; + int result; + size_t nBufSize = 0; + + do + { + nBufSize += 256; /* Increase buffer size by steps of 256 bytes */ + pBuffer = (char *)alloca( nBufSize ); + result = getdomainname( pBuffer, nBufSize ); + /* If buffersize in not large enough -1 is returned and errno + is set to EINVAL. This only applies to libc. With glibc the name + is truncated. */ + } while ( -1 == result && EINVAL == errno ); + + if ( 0 == result ) + { + rtl_string2UString( + &ustrDomainName, + pBuffer, + strlen( pBuffer ), + osl_getThreadTextEncoding(), + OSTRING_TO_OUSTRING_CVTFLAGS ); + } + + return ustrDomainName; +} + +#else /* LINUX */ + +//_________________________________________________________________________________________________________________ +// Other Unix +//_________________________________________________________________________________________________________________ + +static rtl_uString *getDomainName() +{ + return NULL; +} + +#endif + +//_________________________________________________________________________________________________________________ +// Unix +//_________________________________________________________________________________________________________________ + +rtl::OUString NetworkDomain::GetYPDomainName() +{ + rtl_uString* pResult = getDomainName(); + if ( pResult ) + return rtl::OUString( pResult ); + else + return rtl::OUString(); +} + +rtl::OUString NetworkDomain::GetNTDomainName() +{ + return ::rtl::OUString(); +} + +#else /* UNIX */ + +//_________________________________________________________________________________________________________________ +// Other operating systems (non-Windows and non-Unix) +//_________________________________________________________________________________________________________________ + +rtl::OUString NetworkDomain::GetYPDomainName() +{ + return rtl::OUString(); +} + +rtl::OUString NetworkDomain::GetNTDomainName() +{ + return rtl::OUString(); +} + +#endif + +} // namespace framework diff --git a/framework/source/fwi/helper/shareablemutex.cxx b/framework/source/fwi/helper/shareablemutex.cxx new file mode 100644 index 000000000000..b173c6c34a4f --- /dev/null +++ b/framework/source/fwi/helper/shareablemutex.cxx @@ -0,0 +1,81 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_framework.hxx" +#include <helper/shareablemutex.hxx> + +namespace framework +{ + +ShareableMutex::ShareableMutex() +{ + pMutexRef = new MutexRef; + pMutexRef->acquire(); +} + +ShareableMutex::ShareableMutex( const ShareableMutex& rShareableMutex ) +{ + pMutexRef = rShareableMutex.pMutexRef; + if ( pMutexRef ) + pMutexRef->acquire(); +} + +const ShareableMutex& ShareableMutex::operator=( const ShareableMutex& rShareableMutex ) +{ + if ( rShareableMutex.pMutexRef ) + rShareableMutex.pMutexRef->acquire(); + if ( pMutexRef ) + pMutexRef->release(); + pMutexRef = rShareableMutex.pMutexRef; + return *this; +} + +ShareableMutex::~ShareableMutex() +{ + if ( pMutexRef ) + pMutexRef->release(); +} + +void ShareableMutex::acquire() +{ + if ( pMutexRef ) + pMutexRef->m_oslMutex.acquire(); +} + +void ShareableMutex::release() +{ + if ( pMutexRef ) + pMutexRef->m_oslMutex.release(); +} + +::osl::Mutex& ShareableMutex::getShareableOslMutex() +{ + return pMutexRef->m_oslMutex; +} + +} |