blob: 9ece8309ff9a5c6283d48dff5f49dd01143fac49 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_desktop.hxx"
#include "cppuhelper/implbase4.hxx"
#include "cppuhelper/implementationentry.hxx"
#include "rtl/ustrbuf.hxx"
#include "rtl/ustring.h"
#include "rtl/ustring.hxx"
#include "rtl/bootstrap.hxx"
#include "sal/types.h"
#include "sal/config.h"
#include "boost/scoped_array.hpp"
#include "com/sun/star/lang/XServiceInfo.hpp"
#include "com/sun/star/lang/XInitialization.hpp"
#include "com/sun/star/lang/WrappedTargetException.hpp"
#include "com/sun/star/task/XJob.hpp"
#include "com/sun/star/configuration/backend/XLayer.hpp"
#include "com/sun/star/configuration/backend/XLayerHandler.hpp"
#include "com/sun/star/configuration/backend/MalformedDataException.hpp"
#include "com/sun/star/configuration/backend/TemplateIdentifier.hpp"
#include "jvmfwk/framework.h"
#include "jvmfwk.hxx"
#include <stack>
#include <stdio.h>
#include "osl/thread.hxx"
#define OUSTR(x) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( x ))
#define SERVICE_NAME "com.sun.star.migration.Java"
#define IMPL_NAME "com.sun.star.comp.desktop.migration.Java"
#define ENABLE_JAVA 1
#define USER_CLASS_PATH 2
namespace css = com::sun::star;
using namespace rtl;
using namespace com::sun::star::uno;
using namespace com::sun::star::beans;
using namespace com::sun::star::lang;
using namespace com::sun::star::configuration::backend;
namespace migration
{
class CJavaInfo
{
CJavaInfo(const CJavaInfo&);
CJavaInfo& operator = (const CJavaInfo&);
public:
JavaInfo* pData;
CJavaInfo();
~CJavaInfo();
operator JavaInfo* ();
};
CJavaInfo::CJavaInfo(): pData(NULL)
{
}
CJavaInfo::~CJavaInfo()
{
jfw_freeJavaInfo(pData);
}
CJavaInfo::operator JavaInfo*()
{
return pData;
}
class JavaMigration : public ::cppu::WeakImplHelper4<
css::lang::XServiceInfo,
css::lang::XInitialization,
css::task::XJob,
css::configuration::backend::XLayerHandler>
{
public:
// XServiceInfo
virtual OUString SAL_CALL getImplementationName()
throw (css::uno::RuntimeException);
virtual sal_Bool SAL_CALL supportsService( const OUString & rServiceName )
throw (css::uno::RuntimeException);
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames()
throw (css::uno::RuntimeException);
//XInitialization
virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
throw(css::uno::Exception, css::uno::RuntimeException);
//XJob
virtual css::uno::Any SAL_CALL execute(
const css::uno::Sequence<css::beans::NamedValue >& Arguments )
throw (css::lang::IllegalArgumentException, css::uno::Exception,
css::uno::RuntimeException);
// XLayerHandler
virtual void SAL_CALL startLayer()
throw(::com::sun::star::lang::WrappedTargetException);
virtual void SAL_CALL endLayer()
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL overrideNode(
const rtl::OUString& aName,
sal_Int16 aAttributes,
sal_Bool bClear)
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL addOrReplaceNode(
const rtl::OUString& aName,
sal_Int16 aAttributes)
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL addOrReplaceNodeFromTemplate(
const rtl::OUString& aName,
const ::com::sun::star::configuration::backend::TemplateIdentifier& aTemplate,
sal_Int16 aAttributes )
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL endNode()
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL dropNode(
const rtl::OUString& aName )
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL overrideProperty(
const rtl::OUString& aName,
sal_Int16 aAttributes,
const css::uno::Type& aType,
sal_Bool bClear )
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL setPropertyValue(
const css::uno::Any& aValue )
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL setPropertyValueForLocale(
const css::uno::Any& aValue,
const rtl::OUString& aLocale )
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL endProperty()
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL addProperty(
const rtl::OUString& aName,
sal_Int16 aAttributes,
const css::uno::Type& aType )
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
virtual void SAL_CALL addPropertyWithValue(
const rtl::OUString& aName,
sal_Int16 aAttributes,
const css::uno::Any& aValue )
throw(
::com::sun::star::configuration::backend::MalformedDataException,
::com::sun::star::lang::WrappedTargetException );
//----------------
~JavaMigration();
private:
OUString m_sUserDir;
css::uno::Reference< ::css::configuration::backend::XLayer> m_xLayer;
void migrateJavarc();
typedef ::std::pair< ::rtl::OUString, sal_Int16> TElementType;
typedef ::std::stack< TElementType > TElementStack;
TElementStack m_aStack;
};
JavaMigration::~JavaMigration()
{
OSL_ASSERT(m_aStack.empty());
}
OUString jvmfwk_getImplementationName()
{
return OUSTR(IMPL_NAME);
}
css::uno::Sequence< OUString > jvmfwk_getSupportedServiceNames()
{
OUString str_name = OUSTR(SERVICE_NAME);
return css::uno::Sequence< OUString >( &str_name, 1 );
}
// XServiceInfo
OUString SAL_CALL JavaMigration::getImplementationName()
throw (css::uno::RuntimeException)
{
return jvmfwk_getImplementationName();
}
sal_Bool SAL_CALL JavaMigration::supportsService( const OUString & rServiceName )
throw (css::uno::RuntimeException)
{
css::uno::Sequence< OUString > const & rSNL = getSupportedServiceNames();
OUString const * pArray = rSNL.getConstArray();
for ( sal_Int32 nPos = rSNL.getLength(); nPos--; )
{
if (rServiceName.equals( pArray[ nPos ] ))
return true;
}
return false;
}
css::uno::Sequence< OUString > SAL_CALL JavaMigration::getSupportedServiceNames()
throw (css::uno::RuntimeException)
{
return jvmfwk_getSupportedServiceNames();
}
//XInitialization ----------------------------------------------------------------------
void SAL_CALL JavaMigration::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
throw(css::uno::Exception, css::uno::RuntimeException)
{
const css::uno::Any* pIter = aArguments.getConstArray();
const css::uno::Any* pEnd = pIter + aArguments.getLength();
css::uno::Sequence<css::beans::NamedValue> aOldConfigValues;
css::beans::NamedValue aValue;
for(;pIter != pEnd;++pIter)
{
*pIter >>= aValue;
if (aValue.Name.equalsAscii("OldConfiguration"))
{
sal_Bool bSuccess = aValue.Value >>= aOldConfigValues;
OSL_ENSURE(bSuccess == sal_True, "[Service implementation " IMPL_NAME
"] XInitialization::initialize: Argument OldConfiguration has wrong type.");
if (bSuccess)
{
const css::beans::NamedValue* pIter2 = aOldConfigValues.getConstArray();
const css::beans::NamedValue* pEnd2 = pIter2 + aOldConfigValues.getLength();
for(;pIter2 != pEnd2;++pIter2)
{
if ( pIter2->Name.equalsAscii("org.openoffice.Office.Java") )
{
pIter2->Value >>= m_xLayer;
break;
}
}
}
}
else if (aValue.Name.equalsAscii("UserData"))
{
if ( !(aValue.Value >>= m_sUserDir) )
{
OSL_ENSURE(
false,
"[Service implementation " IMPL_NAME
"] XInitialization::initialize: Argument UserData has wrong type.");
}
}
}
}
//XJob
css::uno::Any SAL_CALL JavaMigration::execute(
const css::uno::Sequence<css::beans::NamedValue >& )
throw (css::lang::IllegalArgumentException, css::uno::Exception,
css::uno::RuntimeException)
{
migrateJavarc();
if (m_xLayer.is())
m_xLayer->readData(this);
return css::uno::Any();
}
void JavaMigration::migrateJavarc()
{
if (m_sUserDir.getLength() == 0)
return;
OUString sValue;
rtl::Bootstrap javaini(m_sUserDir + OUSTR( "/user/config/" SAL_CONFIGFILE("java")));
sal_Bool bSuccess = javaini.getFrom(OUSTR("Home"), sValue);
OSL_ENSURE(bSuccess, "[Service implementation " IMPL_NAME
"] XJob::execute: Could not get Home entry from java.ini/javarc.");
if (bSuccess == sal_True && sValue.getLength() > 0)
{
//get the directory
CJavaInfo aInfo;
javaFrameworkError err = jfw_getJavaInfoByPath(sValue.pData, &aInfo.pData);
if (err == JFW_E_NONE)
{
if (jfw_setSelectedJRE(aInfo) != JFW_E_NONE)
{
OSL_ENSURE(0, "[Service implementation " IMPL_NAME
"] XJob::execute: jfw_setSelectedJRE failed.");
fprintf(stderr, "\nCannot migrate Java. An error occured.\n");
}
}
else if (err == JFW_E_FAILED_VERSION)
{
fprintf(stderr, "\nCannot migrate Java settings because the version of the Java "
"is not supported anymore.\n");
}
}
}
// XLayerHandler
void SAL_CALL JavaMigration::startLayer()
throw(css::lang::WrappedTargetException)
{
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::endLayer()
throw(
MalformedDataException,
WrappedTargetException )
{
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::overrideNode(
const ::rtl::OUString&,
sal_Int16,
sal_Bool)
throw(
MalformedDataException,
WrappedTargetException )
{
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::addOrReplaceNode(
const ::rtl::OUString&,
sal_Int16)
throw(
MalformedDataException,
WrappedTargetException )
{
}
void SAL_CALL JavaMigration::endNode()
throw(
MalformedDataException,
WrappedTargetException )
{
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::dropNode(
const ::rtl::OUString& )
throw(
MalformedDataException,
WrappedTargetException )
{
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::overrideProperty(
const ::rtl::OUString& aName,
sal_Int16,
const Type&,
sal_Bool )
throw(
MalformedDataException,
WrappedTargetException )
{
if (aName.equalsAscii("Enable"))
m_aStack.push(TElementStack::value_type(aName,ENABLE_JAVA));
else if (aName.equalsAscii("UserClassPath"))
m_aStack.push(TElementStack::value_type(aName, USER_CLASS_PATH));
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::setPropertyValue(
const Any& aValue )
throw(
MalformedDataException,
WrappedTargetException )
{
if ( !m_aStack.empty())
{
switch (m_aStack.top().second)
{
case ENABLE_JAVA:
{
sal_Bool val = sal_Bool();
if ((aValue >>= val) == sal_False)
throw MalformedDataException(
OUSTR("[Service implementation " IMPL_NAME
"] XLayerHandler::setPropertyValue received wrong type for Enable property"), 0, Any());
if (jfw_setEnabled(val) != JFW_E_NONE)
throw WrappedTargetException(
OUSTR("[Service implementation " IMPL_NAME
"] XLayerHandler::setPropertyValue: jfw_setEnabled failed."), 0, Any());
break;
}
case USER_CLASS_PATH:
{
OUString cp;
if ((aValue >>= cp) == sal_False)
throw MalformedDataException(
OUSTR("[Service implementation " IMPL_NAME
"] XLayerHandler::setPropertyValue received wrong type for UserClassPath property"), 0, Any());
if (jfw_setUserClassPath(cp.pData) != JFW_E_NONE)
throw WrappedTargetException(
OUSTR("[Service implementation " IMPL_NAME
"] XLayerHandler::setPropertyValue: jfw_setUserClassPath failed."), 0, Any());
break;
}
default:
OSL_ASSERT(0);
}
}
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::setPropertyValueForLocale(
const Any&,
const ::rtl::OUString& )
throw(
MalformedDataException,
WrappedTargetException )
{
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::endProperty()
throw(
MalformedDataException,
WrappedTargetException )
{
if (!m_aStack.empty())
m_aStack.pop();
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::addProperty(
const rtl::OUString&,
sal_Int16,
const Type& )
throw(
MalformedDataException,
WrappedTargetException )
{
}
// -----------------------------------------------------------------------------
void SAL_CALL JavaMigration::addPropertyWithValue(
const rtl::OUString&,
sal_Int16,
const Any& )
throw(
MalformedDataException,
WrappedTargetException )
{
}
void SAL_CALL JavaMigration::addOrReplaceNodeFromTemplate(
const rtl::OUString&,
const TemplateIdentifier&,
sal_Int16 )
throw(
MalformedDataException,
WrappedTargetException )
{
}
// -----------------------------------------------------------------------------
//ToDo enable java, user class path
} //end namespace jfw