diff --git a/Repository.mk b/Repository.mk index 5fab1b5..f123f3b 100644 --- a/Repository.mk +++ b/Repository.mk @@ -229,6 +229,7 @@ $(eval $(call gb_Helper_register_libraries,OOOLIBS, \ vclplug_gtk \ vclplug_gtk3 \ vclplug_kde \ + vclplug_tde \ vclplug_kde4 \ vclplug_svp \ visioimport \ diff --git a/bin/distro-install-file-lists b/bin/distro-install-file-lists index b233030..23f2504 100755 --- a/bin/distro-install-file-lists +++ b/bin/distro-install-file-lists @@ -211,6 +211,13 @@ if test "z$OOO_VENDOR" != "zDebian" ; then mv_file_between_flists kde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libkabdrv1.so add_used_directories kde_list.txt common_list.txt + # tde subpackage + test -f $DESTDIR/gid_Module_Optional_Tde && cp $DESTDIR/gid_Module_Optional_Tde tde_list.txt || : + mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/program/tdefilepicker + mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/fps_tde.uno.so + mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libvclplug_tdel..so + mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libtdeabdrv1.so + # create kde4 subpackage mv_file_between_flists kde4_list.txt kde_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/kde4be1.uno.so mv_file_between_flists kde4_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libvclplug_kde4l..so @@ -416,6 +423,7 @@ else create_package_directory gid_Module_Optional_Pyuno pkg/python-uno create_package_directory gid_Module_Optional_Gnome pkg/libreoffice-gnome create_package_directory gid_Module_Optional_Kde pkg/libreoffice-kde + create_package_directory gid_Module_Optional_Tde pkg/libreoffice-tde create_package_directory gid_Module_Root_Files_2 pkg/libreoffice-common create_package_directory gid_Module_Root_Files_3 pkg/libreoffice-common @@ -494,7 +502,7 @@ else fi && ( cd pkg/libreoffice-common/$d find -maxdepth 1 \ - -regex '\./\(.*\.so.*\|.*\.bin\|pagein\|nsplugin\|kdefilepicker\|msfontextract\|.*\.rdb\|javaldx\|uri-encode\)' \ + -regex '\./\(.*\.so.*\|.*\.bin\|pagein\|nsplugin\|kdefilepicker\|tdefilepicker\|msfontextract\|.*\.rdb\|javaldx\|uri-encode\)' \ -exec mv {} $DESTDIR/pkg/libreoffice-core/$d \; ); \ done diff --git a/configure.in b/configure.in index 3b48331..2888cbb 100644 --- a/configure.in +++ b/configure.in @@ -381,6 +381,15 @@ AC_ARG_ENABLE(kdeab, fi ) +AC_ARG_ENABLE(tde, +[ --enable-tde Determines whether to use TQt3/TDE vclplug on platforms + where TQt and TDE are available. +],,) + +AC_ARG_ENABLE(tdeab, +[ --disable-tdeab Disable the TDE address book support +],,if test "$enable_tde" = "yes"; then enable_tdeab=yes; fi) + AC_ARG_ENABLE(kde4, AS_HELP_STRING([--enable-kde4], [Determines whether to use Qt4/KDE4 vclplug on platforms where Qt4 and @@ -1554,6 +1563,7 @@ solaris*) test_gtk=yes build_gstreamer=yes test_kde=yes + test_tde=yes test_freetype=yes test_gstreamer=yes _os=SunOS @@ -1587,6 +1597,7 @@ linux-gnu*|k*bsd*-gnu*) test_gtk=yes build_gstreamer=yes test_kde=yes + test_tde=yes test_kde4=yes test_freetype=yes test_unix_quickstarter=yes @@ -1659,6 +1670,7 @@ freebsd*) test_gtk=yes build_gstreamer=yes test_kde=yes + test_tde=yes test_kde4=yes test_freetype=yes AC_MSG_CHECKING([the FreeBSD operating system release]) @@ -1703,6 +1715,7 @@ aix*) openbsd*) test_gtk=yes test_kde=yes + test_tde=yes test_freetype=yes PTHREAD_CFLAGS="-D_THREAD_SAFE" PTHREAD_LIBS="-pthread" @@ -1713,6 +1726,7 @@ dragonfly*) test_gtk=yes build_gstreamer=yes test_kde=yes + test_tde=yes test_kde4=yes test_freetype=yes PTHREAD_LIBS="-pthread" @@ -6941,6 +6955,13 @@ if test "x$enable_kde4" = "xyes"; then fi AC_SUBST(ENABLE_KDE4) +ENABLE_TDE="" +if test "x$enable_tde" = "xyes"; then + ENABLE_TDE="TRUE" + R="$R tde" +fi +AC_SUBST(ENABLE_TDE) + if test -z "$R"; then AC_MSG_RESULT([none]) else @@ -7852,6 +7873,129 @@ AC_SUBST(KDE_GLIB_LIBS) AC_SUBST(KDE_HAVE_GLIB) dnl =================================================================== +dnl Check whether the Qt3 and TDE libraries are available. +dnl =================================================================== + +TDE_CFLAGS="" +TDE_LIBS="" +if test "$_os" != "OpenBSD"; then + MOC="tmoc" +fi +if test "$test_tde" = "yes" -a "$ENABLE_TDE" = "TRUE" ; then + dnl Search paths for Qt3 and TDE + if test "$build_cpu" != "x86_64" ; then + qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib/qt3/include /usr/lib/qt/include /usr/share/qt3/include /usr/local/include/X11/qt3 $x_includes" + qt_libdirs="$QTLIB /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries" + else + qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib64/qt3/include /usr/lib64/qt/include /usr/share/qt3/include /usr/lib/qt3/include /usr/lib/qt/include /usr/local/include/X11/qt3 $x_includes" + qt_libdirs="$QTLIB /usr/local/qt/lib64 /usr/lib64/qt /usr/lib64 /usr/X11R6/lib64/X11/qt /usr/X11R6/lib64/qt /usr/lib64/qt3/lib64 /usr/lib64/qt/lib64 /usr/share/qt3/lib64 /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries" + fi + if test -n "$TQTDIR" ; then + qt_incdirs="$TQTDIR/include $qt_incdirs" + if test "$build_cpu" != "x86_64" ; then + qt_libdirs="$TQTDIR/lib $qt_libdirs" + else + qt_libdirs="$TQTDIR/lib64 $TQTDIR/lib $qt_libdirs" + fi + fi + if test "$build_cpu" != "x86_64" ; then + tde_incdirs="/opt/trinity/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes" + tde_libdirs="/opt/trinity/lib /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib/kde4/lib /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries" + else + tde_incdirs="/opt/trinity/include /usr/lib64/kde/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes" + tde_libdirs="/opt/trinity/lib /usr/lib64/kde/lib64 /usr/local/kde/lib64 /usr/kde/lib64 /usr/lib64/kde /usr/lib64/kde3 /usr/lib64 /usr/X11R6/lib64 /usr/local/lib64 /opt/trinity/lib64 /opt/kde/lib64 /usr/X11R6/kde/lib64 /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries" + fi + if test -n "$TDEDIR" ; then + tde_incdirs="$TDEDIR/include $tde_incdirs" + if test "$build_cpu" != "x86_64" ; then + tde_libdirs="$TDEDIR/lib $tde_libdirs" + else + tde_libdirs="$TDEDIR/lib64 $TDEDIR/lib $tde_libdirs" + fi + fi + + dnl What to test + qt_test_include="qstyle.h" + qt_test_library="libqt-mt.so*" + tde_test_include="kapp.h" + tde_test_library="libDCOP.so*" + + dnl Check for Qt3 headers + AC_MSG_CHECKING([for Qt3 headers]) + qt_incdir="no" + for tde_check in $qt_incdirs ; do + if test -r "$tde_check/$qt_test_include" ; then + qt_incdir="$tde_check" + break + fi + done + AC_MSG_RESULT([$qt_incdir]) + if test "x$qt_incdir" = "xno" ; then + AC_MSG_ERROR([Qt3 headers not found. Please specify the root of +your Qt3 installation by exporting TQTDIR before running "configure".]) + fi + + dnl Check for Qt3 libraries + AC_MSG_CHECKING([for Qt3 libraries]) + qt_libdir="no" + for qt_check in $qt_libdirs ; do + if test -r "`ls $qt_check/$qt_test_library 2>/dev/null | head -1`" ; then + qt_libdir="$qt_check" + break + fi + done + AC_MSG_RESULT([$qt_libdir]) + if test "x$qt_libdir" = "xno" ; then + AC_MSG_ERROR([Qt3 libraries not found. Please specify the root of +your Qt3 installation by exporting TQTDIR before running "configure".]) + fi + + dnl Check for Meta Object Compiler + AC_PATH_PROG( MOC, tmoc, no, [`dirname $qt_libdir`/bin:$TQTDIR/bin:$PATH] ) + if test "$MOC" = "no" ; then + AC_MSG_ERROR([TQt3 Meta Object Compiler not found. Please specify +the root of your Qt3 installation by exporting TQTDIR before running "configure".]) + fi + + dnl Check for TDE headers + AC_MSG_CHECKING([for TDE headers]) + tde_incdir="no" + for tde_check in $tde_incdirs ; do + if test -r "$tde_check/$tde_test_include" ; then + tde_incdir="$tde_check" + break + fi + done + AC_MSG_RESULT([$tde_incdir]) + if test "x$tde_incdir" = "xno" ; then + AC_MSG_ERROR([TDE headers not found. Please specify the root of +your TDE installation by exporting TDEDIR before running "configure".]) + fi + + dnl Check for TDE libraries + AC_MSG_CHECKING([for TDE libraries]) + tde_libdir="no" + for tde_check in $tde_libdirs ; do + if test -r "`ls $tde_check/$tde_test_library 2>/dev/null | head -1`" ; then + tde_libdir="$tde_check" + break + fi + done + AC_MSG_RESULT([$tde_libdir]) + if test "x$tde_libdir" = "xno" ; then + AC_MSG_ERROR([TDE libraries not found. Please specify the root of +your TDE installation by exporting TDEDIR before running "configure".]) + fi + + dnl Set the variables + TDE_CFLAGS="-I$qt_incdir -I$tde_incdir -I/usr/include/tqt -DTQT_THREAD_SUPPORT" + TDE_LIBS="-L$tde_libdir -L$qt_libdir -lkdeui -lkdecore -ltqt -lqt-mt" +fi +AC_SUBST(TDE_CFLAGS) +AC_SUBST(TDE_LIBS) +AC_SUBST(MOC) + +dnl =================================================================== dnl Test for the enabling the lockdown pieces dnl =================================================================== AC_MSG_CHECKING([whether to enable the lockdown pieces]) @@ -7908,6 +8052,33 @@ fi AC_SUBST(ENABLE_KAB) dnl =================================================================== +dnl Test whether to include TDE AB support +dnl =================================================================== +AC_MSG_CHECKING([whether to enable TDE address book support]) +if test "$enable_tdeab" = "yes" && test "$enable_tde" = "yes"; then + AC_MSG_RESULT([yes]) + AC_LANG_PUSH([C++]) + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $TDE_CFLAGS" + AC_MSG_CHECKING([whether TDE is between 3.2 and 3.6]) + AC_TRY_RUN([ +#include + +int main(int argc, char **argv) { + if (TDE_VERSION_MAJOR == 3 && 2 <= TDE_VERSION_MINOR && TDE_VERSION_MINOR <= 6) return 0; + else return 1; +} + ], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([TDE version too old or too recent, please use another version of TDE or disable TDE address book support])]) + CXXFLAGS=$save_CXXFLAGS + AC_LANG_POP([C++]) + ENABLE_TDEAB=TRUE +else + AC_MSG_RESULT([no]) + ENABLE_TDEAB= +fi +AC_SUBST(ENABLE_TDEAB) + +dnl =================================================================== dnl Test whether to include MathMLDTD dnl =================================================================== AC_MSG_CHECKING([whether to include MathMLDTD]) diff --git a/connectivity/prj/build.lst b/connectivity/prj/build.lst index 9860897..be07edb 100644 --- a/connectivity/prj/build.lst +++ b/connectivity/prj/build.lst @@ -12,6 +12,7 @@ cn connectivity\source\drivers\mozab\mozillasrc nmake - all cn_mozab_moz cn connectivity\source\drivers\mozab\bootstrap nmake - all cn_mozab_bootstrap cn_mozab_mozillasrc cn_inc NULL cn connectivity\source\drivers\mozab nmake - all cn_mozab cn_mozab_bootstrap cn_dbtools cn_inc NULL cn connectivity\source\drivers\kab nmake - all cn_kab cn_dbtools cn_inc NULL +cn connectivity\source\drivers\tdeab nmake - all cn_tdeab cn_dbtools cn_inc NULL cn connectivity\source\drivers\macab nmake - all cn_macab cn_dbtools cn_inc NULL cn connectivity\source\drivers\evoab2 nmake - all cn_evoab2 cn_dbtools cn_file cn_inc NULL cn connectivity\source\drivers\calc nmake - all cn_calc cn_file cn_inc NULL @@ -28,4 +29,4 @@ cn connectivity\source\simpledbt nmake - all cn_simpledbt cn connectivity\source\dbtools nmake - all cn_dbtools cn_simpledbt cn_cmtools cn_parse cn_res cn_sdbcx cn_inc cn_res NULL cn connectivity\qa\connectivity\tools nmake - all cn_qa_tools cn_inc NULL cn connectivity\qa nmake - all cn_qa cn_inc NULL -cn connectivity\util nmake - all cn_util cn_ado cn_mozab cn_kab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_flat cn_dbase cn_hsqldb cn_macab NULL +cn connectivity\util nmake - all cn_util cn_ado cn_mozab cn_kab cn_tdeab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_flat cn_dbase cn_hsqldb cn_macab NULL diff --git a/connectivity/prj/d.lst b/connectivity/prj/d.lst index 1387da4..400ecaa 100644 --- a/connectivity/prj/d.lst +++ b/connectivity/prj/d.lst @@ -11,6 +11,7 @@ ..\source\drivers\adabas\*.xml %_DEST%\xml\*.xml ..\source\drivers\ado\*.xml %_DEST%\xml\*.xml ..\source\drivers\kab\*.xml %_DEST%\xml\*.xml +..\source\drivers\tdeab\*.xml %_DEST%\xml\*.xml ..\source\drivers\macab\*.xml %_DEST%\xml\*.xml ..\source\drivers\file\*.xml %_DEST%\xml\*.xml ..\source\drivers\flat\*.xml %_DEST%\xml\*.xml diff --git a/connectivity/source/drivers/tdeab/KCatalog.cxx b/connectivity/source/drivers/tdeab/KCatalog.cxx new file mode 100644 index 0000000..262144e --- /dev/null +++ b/connectivity/source/drivers/tdeab/KCatalog.cxx @@ -0,0 +1,128 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KCatalog.hxx" +#include "KConnection.hxx" +#include "KTables.hxx" + +using namespace connectivity::kab; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; +using namespace ::cppu; + +// ------------------------------------------------------------------------- +KabCatalog::KabCatalog(KabConnection* _pCon) + : connectivity::sdbcx::OCatalog(_pCon), + m_pConnection(_pCon), + m_xMetaData(m_pConnection->getMetaData()) +{ +} +// ------------------------------------------------------------------------- +void KabCatalog::refreshTables() +{ + TStringVector aVector; + Sequence< ::rtl::OUString > aTypes(1); + aTypes[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")); + Reference< XResultSet > xResult = m_xMetaData->getTables( + Any(), + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")), + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")), + aTypes); + + if (xResult.is()) + { + Reference< XRow > xRow(xResult,UNO_QUERY); + ::rtl::OUString aName; + // const ::rtl::OUString& sDot = KabCatalog::getDot(); + + while (xResult->next()) + { + // aName = xRow->getString(2); + // aName += sDot; + aName = xRow->getString(3); + aVector.push_back(aName); + } + } + if (m_pTables) + m_pTables->reFill(aVector); + else + m_pTables = new KabTables(m_xMetaData,*this,m_aMutex,aVector); +} +// ------------------------------------------------------------------------- +void KabCatalog::refreshViews() +{ +} +// ------------------------------------------------------------------------- +void KabCatalog::refreshGroups() +{ +} +// ------------------------------------------------------------------------- +void KabCatalog::refreshUsers() +{ +} +// ------------------------------------------------------------------------- +const ::rtl::OUString& KabCatalog::getDot() +{ + static const ::rtl::OUString sDot = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".")); + return sDot; +} +// ----------------------------------------------------------------------------- + +// XTablesSupplier +Reference< XNameAccess > SAL_CALL KabCatalog::getTables( ) throw(RuntimeException) +{ + ::osl::MutexGuard aGuard(m_aMutex); + checkDisposed(rBHelper.bDisposed); + + try + { + if (!m_pTables) + refreshTables(); + } + catch( const RuntimeException& ) + { + // allowed to leave this method + throw; + } + catch( const Exception& ) + { + // allowed + } + + return m_pTables; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KCatalog.hxx b/connectivity/source/drivers/tdeab/KCatalog.hxx new file mode 100644 index 0000000..ddfe1e9 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KCatalog.hxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_CATALOG_HXX_ +#define _CONNECTIVITY_KAB_CATALOG_HXX_ + +#include "connectivity/sdbcx/VCatalog.hxx" + +namespace connectivity +{ + namespace kab + { + class KabConnection; + + class KabCatalog : public connectivity::sdbcx::OCatalog + { + KabConnection* m_pConnection; // used to get the metadata + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; // just to make things easier + + public: + KabCatalog(KabConnection* _pCon); + + inline KabConnection* getConnection() const { return m_pConnection; } + + static const ::rtl::OUString& getDot(); + + // implementation of the pure virtual methods + virtual void refreshTables(); + virtual void refreshViews(); + virtual void refreshGroups(); + virtual void refreshUsers(); + + // XTablesSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getTables( + ) throw(::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_KAB_CATALOG_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KColumns.cxx b/connectivity/source/drivers/tdeab/KColumns.cxx new file mode 100644 index 0000000..e61e457 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KColumns.cxx @@ -0,0 +1,102 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KColumns.hxx" +#include "KTable.hxx" +#include "KTables.hxx" +#include "KCatalog.hxx" +#include "connectivity/sdbcx/VColumn.hxx" + +using namespace connectivity::kab; +using namespace connectivity::sdbcx; +using namespace connectivity; +using namespace ::comphelper; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; + +// ------------------------------------------------------------------------- +sdbcx::ObjectType KabColumns::createObject(const ::rtl::OUString& _rName) +{ + Reference< XResultSet > xResult = m_pTable->getConnection()->getMetaData()->getColumns( + Any(), + m_pTable->getSchema(), + m_pTable->getTableName(), + _rName); + + sdbcx::ObjectType xRet = NULL; + if (xResult.is()) + { + Reference< XRow > xRow(xResult,UNO_QUERY); + + while (xResult->next()) + { + if (xRow->getString(4) == _rName) + { + OColumn* pRet = new OColumn( + _rName, + xRow->getString(6), + xRow->getString(13), + xRow->getString(12), + xRow->getInt(11), + xRow->getInt(7), + xRow->getInt(9), + xRow->getInt(5), + sal_False, + sal_False, + sal_False, + sal_True); + xRet = pRet; + break; + } + } + } + + return xRet; +} +// ------------------------------------------------------------------------- +void KabColumns::impl_refresh() throw(RuntimeException) +{ + m_pTable->refreshColumns(); +} +// ------------------------------------------------------------------------- +KabColumns::KabColumns( KabTable* _pTable, + ::osl::Mutex& _rMutex, + const TStringVector &_rVector) + : sdbcx::OCollection(*_pTable, sal_True, _rMutex, _rVector), + m_pTable(_pTable) +{ +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KColumns.hxx b/connectivity/source/drivers/tdeab/KColumns.hxx new file mode 100644 index 0000000..1919747 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KColumns.hxx @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_COLUMNS_HXX_ +#define _CONNECTIVITY_KAB_COLUMNS_HXX_ + +#include "KTable.hxx" +#include "connectivity/sdbcx/VCollection.hxx" + +namespace connectivity +{ + namespace kab + { + class KabColumns : public sdbcx::OCollection + { + protected: + KabTable* m_pTable; + + virtual sdbcx::ObjectType createObject(const ::rtl::OUString& _rName); + virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); + + public: + KabColumns( KabTable* _pTable, + ::osl::Mutex& _rMutex, + const TStringVector &_rVector); + }; + } +} + +#endif // _CONNECTIVITY_KAB_COLUMNS_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KConnection.cxx b/connectivity/source/drivers/tdeab/KConnection.cxx new file mode 100644 index 0000000..26824bf --- /dev/null +++ b/connectivity/source/drivers/tdeab/KConnection.cxx @@ -0,0 +1,332 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KConnection.hxx" +#include "KDatabaseMetaData.hxx" +#include "KStatement.hxx" +#include "KPreparedStatement.hxx" +#include "KDriver.hxx" +#include "KCatalog.hxx" +#include +#include +#include + +using namespace connectivity::kab; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::sdbc; +using namespace com::sun::star::sdbcx; + +IMPLEMENT_SERVICE_INFO(KabConnection, "com.sun.star.sdbc.drivers.KabConnection", "com.sun.star.sdbc.Connection") +//----------------------------------------------------------------------------- +KabConnection::KabConnection(KabDriver* _pDriver) + : OMetaConnection_BASE(m_aMutex), + OSubComponent((::cppu::OWeakObject*)_pDriver, this), + m_xMetaData(NULL), + m_pAddressBook(NULL), + m_pDriver(_pDriver) +{ + m_pDriver->acquire(); +} +//----------------------------------------------------------------------------- +KabConnection::~KabConnection() +{ + if (!isClosed()) + close(); + + m_pDriver->release(); + m_pDriver = NULL; +} +//----------------------------------------------------------------------------- +void SAL_CALL KabConnection::release() throw() +{ + relase_ChildImpl(); +} +// ----------------------------------------------------------------------------- +void KabConnection::construct(const ::rtl::OUString&, const Sequence< PropertyValue >&) throw(SQLException) +{ + osl_incrementInterlockedCount( &m_refCount ); + + // create a TDE address book object + m_pAddressBook = TDEABC::StdAddressBook::self(); + m_pAddressBook->setAutomaticSave(false); +// perharps we should analyze the URL to know whether the addressbook is local, over LDAP, etc... +// perharps we should get some user and password information from "info" properties + + osl_decrementInterlockedCount( &m_refCount ); +} +// XServiceInfo +// -------------------------------------------------------------------------------- +Reference< XStatement > SAL_CALL KabConnection::createStatement( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // create a statement + // the statement can only be executed once + Reference< XStatement > xReturn = new KabStatement(this); + m_aStatements.push_back(WeakReferenceHelper(xReturn)); + return xReturn; +} +// -------------------------------------------------------------------------------- +Reference< XPreparedStatement > SAL_CALL KabConnection::prepareStatement( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // create a statement + // the statement can only be executed more than once + Reference< XPreparedStatement > xReturn = new KabPreparedStatement(this, _sSql); + m_aStatements.push_back(WeakReferenceHelper(xReturn)); + return xReturn; +} +// -------------------------------------------------------------------------------- +Reference< XPreparedStatement > SAL_CALL KabConnection::prepareCall( const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // not implemented yet :-) a task to do + return NULL; +} +// -------------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabConnection::nativeSQL( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + // when you need to transform SQL92 to you driver specific you can do it here + + return _sSql; +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabConnection::setAutoCommit( sal_Bool ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + // here you have to set your commit mode please have a look at the jdbc documentation to get a clear explanation +} +// -------------------------------------------------------------------------------- +sal_Bool SAL_CALL KabConnection::getAutoCommit( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + // you have to distinguish which if you are in autocommit mode or not + // at normal case true should be fine here + + return sal_True; +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabConnection::commit( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // when you database does support transactions you should commit here +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabConnection::rollback( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // same as commit but for the other case +} +// -------------------------------------------------------------------------------- +sal_Bool SAL_CALL KabConnection::isClosed( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + // just simple -> we are closed when we are disposed, that means someone called dispose(); (XComponent) + return KabConnection_BASE::rBHelper.bDisposed; +} +// -------------------------------------------------------------------------------- +Reference< XDatabaseMetaData > SAL_CALL KabConnection::getMetaData( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // here we have to create the class with biggest interface + // The answer is 42 :-) + Reference< XDatabaseMetaData > xMetaData = m_xMetaData; + if (!xMetaData.is()) + { + xMetaData = new KabDatabaseMetaData(this); // need the connection because it can return it + m_xMetaData = xMetaData; + } + + return xMetaData; +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabConnection::setReadOnly( sal_Bool ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // set you connection to readonly +} +// -------------------------------------------------------------------------------- +sal_Bool SAL_CALL KabConnection::isReadOnly( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // return if your connection to readonly + return sal_False; +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabConnection::setCatalog( const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // if your database doesn't work with catalogs you go to next method otherwise you kjnow what to do +} +// -------------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabConnection::getCatalog( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + + // return your current catalog + return ::rtl::OUString(); +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabConnection::setTransactionIsolation( sal_Int32 ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // set your isolation level + // please have a look at @see com.sun.star.sdbc.TransactionIsolation +} +// -------------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabConnection::getTransactionIsolation( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + + // please have a look at @see com.sun.star.sdbc.TransactionIsolation + return TransactionIsolation::NONE; +} +// -------------------------------------------------------------------------------- +Reference< ::com::sun::star::container::XNameAccess > SAL_CALL KabConnection::getTypeMap( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + + // if your driver has special database types you can return it here + + return NULL; +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabConnection::setTypeMap( const Reference< ::com::sun::star::container::XNameAccess >& ) throw(SQLException, RuntimeException) +{ + // the other way around +} +// -------------------------------------------------------------------------------- +// XCloseable +void SAL_CALL KabConnection::close( ) throw(SQLException, RuntimeException) +{ + { + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabConnection_BASE::rBHelper.bDisposed); + } + dispose(); +} +// -------------------------------------------------------------------------------- +// XWarningsSupplier +Any SAL_CALL KabConnection::getWarnings( ) throw(SQLException, RuntimeException) +{ + // when you collected some warnings -> return it + return Any(); +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabConnection::clearWarnings( ) throw(SQLException, RuntimeException) +{ + // you should clear your collected warnings here +} +//------------------------------------------------------------------------------ +void KabConnection::disposing() +{ + // we noticed that we should be destroied in near future so we have to dispose our statements + ::osl::MutexGuard aGuard(m_aMutex); + + for (OWeakRefArray::iterator i = m_aStatements.begin(); m_aStatements.end() != i; ++i) + { + Reference< XComponent > xComp(i->get(), UNO_QUERY); + if (xComp.is()) + xComp->dispose(); + } + m_aStatements.clear(); + + if (m_pAddressBook != NULL) + { + m_pAddressBook->close(); + m_pAddressBook = NULL; + } + + m_xMetaData = ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDatabaseMetaData>(); + + dispose_ChildImpl(); + KabConnection_BASE::disposing(); +} +// ----------------------------------------------------------------------------- +Reference< XTablesSupplier > SAL_CALL KabConnection::createCatalog() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + Reference< XTablesSupplier > xTab = m_xCatalog; + if (!m_xCatalog.is()) + { + KabCatalog *pCat = new KabCatalog(this); + xTab = pCat; + m_xCatalog = xTab; + } + return xTab; +} +// ----------------------------------------------------------------------------- +::TDEABC::AddressBook* KabConnection::getAddressBook() const +{ + return m_pAddressBook; +} +// ----------------------------------------------------------------------------- +extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL createKabConnection( void* _pDriver ) +{ + KabConnection* pConnection = new KabConnection( static_cast< KabDriver* >( _pDriver ) ); + // by definition, the pointer crossing library boundaries as void ptr is acquired once + pConnection->acquire(); + return pConnection; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KConnection.hxx b/connectivity/source/drivers/tdeab/KConnection.hxx new file mode 100644 index 0000000..66b75d4 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KConnection.hxx @@ -0,0 +1,142 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_CONNECTION_HXX_ +#define _CONNECTIVITY_KAB_CONNECTION_HXX_ + +#include +#include "OSubComponent.hxx" +#include "connectivity/CommonTools.hxx" +#include +#include +#include +#include +#include +#include +#include + +namespace TDEABC +{ + class StdAddressBook; + class AddressBook; +} + +namespace connectivity +{ + namespace kab + { + + typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::sdbc::XConnection, + ::com::sun::star::sdbc::XWarningsSupplier, + ::com::sun::star::lang::XServiceInfo + > OMetaConnection_BASE; + + class KabStatement_Base; + class KabDriver; + class KabDatabaseMetaData; + + typedef OMetaConnection_BASE KabConnection_BASE; // implements basics and text encoding + typedef std::vector< ::com::sun::star::uno::WeakReferenceHelper > OWeakRefArray; + + class KabConnection : public comphelper::OBaseMutex, + public KabConnection_BASE, + public OSubComponent + { + friend class OSubComponent; + + protected: + //==================================================================== + // Data attributes + //==================================================================== + ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; + + OWeakRefArray m_aStatements; // vector containing a list of all the Statement objects + // for this Connection + + ::TDEABC::StdAddressBook* m_pAddressBook; // the address book + KabDriver* m_pDriver; // pointer to the owning driver object + ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier> + m_xCatalog; // needed for the SQL interpreter + + public: + virtual void construct( const ::rtl::OUString& url,const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info) throw(::com::sun::star::sdbc::SQLException); + + KabConnection(KabDriver* _pDriver); + virtual ~KabConnection(); + + void closeAllStatements () throw( ::com::sun::star::sdbc::SQLException); + + // OComponentHelper + virtual void SAL_CALL disposing(void); + + // XInterface + virtual void SAL_CALL release() throw(); + + // XServiceInfo + DECLARE_SERVICE_INFO(); + + // XConnection + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XStatement > SAL_CALL createStatement( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > SAL_CALL prepareCall( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL nativeSQL( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL getAutoCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL commit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL rollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isClosed( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isReadOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setCatalog( const ::rtl::OUString& catalog ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getCatalog( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getTransactionIsolation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getTypeMap( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setTypeMap( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XCloseable + virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XWarningsSupplier + virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL clearWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // needed for the SQL interpreter + ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier > SAL_CALL createCatalog(); + + // accessors + inline KabDriver* getDriver() const { return m_pDriver;} + ::TDEABC::AddressBook* getAddressBook() const; + }; + } +} + +#endif // _CONNECTIVITY_KAB_CONNECTION_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx b/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx new file mode 100644 index 0000000..1bff0ea --- /dev/null +++ b/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx @@ -0,0 +1,1084 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KDatabaseMetaData.hxx" +#include "kfields.hxx" +#include "TDEInit.h" +#include +#include "FDatabaseMetaDataResultSet.hxx" +#include "OTypeInfo.hxx" +#include +#include +#include + +using namespace connectivity::kab; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::sdbc; + +KabDatabaseMetaData::KabDatabaseMetaData(KabConnection* _pCon) + : m_xConnection(_pCon), + m_bUseCatalog(sal_True) +{ + OSL_ENSURE(_pCon,"KabDatabaseMetaData::KabDatabaseMetaData: No connection set!"); + + osl_incrementInterlockedCount( &m_refCount ); + m_bUseCatalog = !(usesLocalFiles() || usesLocalFilePerTable()); + osl_decrementInterlockedCount( &m_refCount ); +} +// ------------------------------------------------------------------------- +KabDatabaseMetaData::~KabDatabaseMetaData() +{ +} +// ------------------------------------------------------------------------- +const ::rtl::OUString & KabDatabaseMetaData::getAddressBookTableName() +{ + static const ::rtl::OUString aAddressBookTableName + (::rtl::OUString::createFromAscii( i18n("Address Book") )); + + return aAddressBookTableName; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getCatalogSeparator( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aVal; + if (m_bUseCatalog) + { // do some special here for you database + } + + return aVal; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxBinaryLiteralLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxRowSize( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCatalogNameLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCharLiteralLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnNameLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInIndex( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCursorNameLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxConnections( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInTable( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxStatementLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxTableNameLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxTablesInSelect( ) throw(SQLException, RuntimeException) +{ + // MaxTablesInSelect describes how many tables can participate in the FROM part of a given SELECT statement, + // currently, the resultset/statement implementations can cope with one table only + sal_Int32 nValue = 1; + return nValue; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::doesMaxRowSizeIncludeBlobs( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::storesLowerCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::storesLowerCaseIdentifiers( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::storesMixedCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::storesMixedCaseIdentifiers( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::storesUpperCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::storesUpperCaseIdentifiers( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsAlterTableWithAddColumn( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsAlterTableWithDropColumn( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxIndexLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsNonNullableColumns( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getCatalogTerm( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aVal; + if (m_bUseCatalog) + { + } + return aVal; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getIdentifierQuoteString( ) throw(SQLException, RuntimeException) +{ + // normally this is " + ::rtl::OUString aVal = ::rtl::OUString::createFromAscii("\""); + return aVal; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getExtraNameCharacters( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aVal; + return aVal; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsDifferentTableCorrelationNames( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::isCatalogAtStart( ) throw(SQLException, RuntimeException) +{ + sal_Bool bValue = sal_False; + if (m_bUseCatalog) + { + } + return bValue; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::dataDefinitionIgnoredInTransactions( ) throw(SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::dataDefinitionCausesTransactionCommit( ) throw(SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsDataManipulationTransactionsOnly( ) throw(SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions( ) throw(SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsPositionedDelete( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsPositionedUpdate( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenStatementsAcrossRollback( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenStatementsAcrossCommit( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenCursorsAcrossCommit( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenCursorsAcrossRollback( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsTransactionIsolationLevel( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInDataManipulation( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92FullSQL( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92EntryLevelSQL( ) throw(SQLException, RuntimeException) +{ + return sal_True; // should be supported at least +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsIntegrityEnhancementFacility( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInIndexDefinitions( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInTableDefinitions( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInTableDefinitions( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInIndexDefinitions( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInDataManipulation( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsOuterJoins( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxStatements( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxProcedureNameLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxSchemaNameLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsTransactions( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::allProceduresAreCallable( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsStoredProcedures( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSelectForUpdate( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::allTablesAreSelectable( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::isReadOnly( ) throw(SQLException, RuntimeException) +{ + // for the moment, we have read-only addresses, but this might change in the future + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::usesLocalFiles( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::usesLocalFilePerTable( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsTypeConversion( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::nullPlusNonNullIsNull( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsColumnAliasing( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsTableCorrelationNames( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsConvert( sal_Int32, sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsExpressionsInOrderBy( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupBy( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupByBeyondSelect( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupByUnrelated( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsMultipleTransactions( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsMultipleResultSets( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsLikeEscapeClause( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsOrderByUnrelated( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsUnion( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsUnionAll( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsMixedCaseIdentifiers( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsMixedCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedAtEnd( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedAtStart( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedHigh( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedLow( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInProcedureCalls( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInPrivilegeDefinitions( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInProcedureCalls( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInPrivilegeDefinitions( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsCorrelatedSubqueries( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInComparisons( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInExists( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInIns( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInQuantifieds( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92IntermediateSQL( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getURL( ) throw(SQLException, RuntimeException) +{ + // if someday we support more than the default address book, + // this method should return the URL which was used to create it + ::rtl::OUString aValue = ::rtl::OUString::createFromAscii("sdbc:address:kab:"); + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getUserName( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue; + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getDriverName( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue = ::rtl::OUString::createFromAscii("kab"); + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getDriverVersion() throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue = ::rtl::OUString::createFromAscii(KAB_DRIVER_VERSION); + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getDatabaseProductVersion( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue; + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getDatabaseProductName( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue; + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getProcedureTerm( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue; + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getSchemaTerm( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue; + return aValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getDriverMajorVersion( ) throw(RuntimeException) +{ + return KAB_DRIVER_VERSION_MAJOR; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getDefaultTransactionIsolation( ) throw(SQLException, RuntimeException) +{ + return TransactionIsolation::NONE; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getDriverMinorVersion( ) throw(RuntimeException) +{ + return KAB_DRIVER_VERSION_MINOR; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getSQLKeywords( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue; + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getSearchStringEscape( ) throw(SQLException, RuntimeException) +{ + ::rtl::OUString aValue; + return aValue; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getStringFunctions( ) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getTimeDateFunctions( ) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getSystemFunctions( ) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabDatabaseMetaData::getNumericFunctions( ) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsExtendedSQLGrammar( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsCoreSQLGrammar( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsMinimumSQLGrammar( ) throw(SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsFullOuterJoins( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsLimitedOuterJoins( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInGroupBy( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInOrderBy( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInSelect( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxUserNameLength( ) throw(SQLException, RuntimeException) +{ + sal_Int32 nValue = 0; // 0 means no limit + return nValue; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsResultSetType( sal_Int32 setType ) throw(SQLException, RuntimeException) +{ + switch (setType) + { + case ResultSetType::FORWARD_ONLY: + case ResultSetType::SCROLL_INSENSITIVE: + return sal_True; + } + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 ) throw(SQLException, RuntimeException) +{ + switch (setType) + { + case ResultSetType::FORWARD_ONLY: + case ResultSetType::SCROLL_INSENSITIVE: + return sal_True; + } + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::ownUpdatesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::ownDeletesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::ownInsertsAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::othersUpdatesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::othersDeletesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::othersInsertsAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::updatesAreDetected( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::deletesAreDetected( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::insertsAreDetected( sal_Int32 ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDatabaseMetaData::supportsBatchUpdates( ) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +Reference< XConnection > SAL_CALL KabDatabaseMetaData::getConnection( ) throw(SQLException, RuntimeException) +{ + return (Reference< XConnection >) m_xConnection.get(); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTableTypes( ) throw(SQLException, RuntimeException) +{ + ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTableTypes); + Reference< XResultSet > xRef = pResult; + + static ODatabaseMetaDataResultSet::ORows aRows; + static const ::rtl::OUString aTable(::rtl::OUString::createFromAscii("TABLE")); + + if (aRows.empty()) + { + ODatabaseMetaDataResultSet::ORow aRow(2); + aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[1] = new ORowSetValueDecorator(aTable); + aRows.push_back(aRow); + } + pResult->setRows(aRows); + return xRef; +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTypeInfo( ) throw(SQLException, RuntimeException) +{ + ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo); + Reference< XResultSet > xRef = pResult; + + static ODatabaseMetaDataResultSet::ORows aRows; + if (aRows.empty()) + { + ODatabaseMetaDataResultSet::ORow aRow(19); + + aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("CHAR")); + aRow[2] = new ORowSetValueDecorator(DataType::CHAR); + aRow[3] = new ORowSetValueDecorator((sal_Int32) 254); + aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[7] = new ORowSetValueDecorator((sal_Int32) ColumnValue::NULLABLE); + aRow[8] = ODatabaseMetaDataResultSet::get1Value(); + aRow[9] = new ORowSetValueDecorator((sal_Int32) ColumnSearch::CHAR); + aRow[10] = ODatabaseMetaDataResultSet::get1Value(); + aRow[11] = ODatabaseMetaDataResultSet::get0Value(); + aRow[12] = ODatabaseMetaDataResultSet::get0Value(); + aRow[13] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[14] = ODatabaseMetaDataResultSet::get0Value(); + aRow[15] = ODatabaseMetaDataResultSet::get0Value(); + aRow[16] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[17] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[18] = new ORowSetValueDecorator((sal_Int32) 10); + aRows.push_back(aRow); +// Much more types might appear in TDE address books +// To be completed + } + pResult->setRows(aRows); + return xRef; +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getCatalogs( ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCatalogs ); +} +// ----------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getSchemas( ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eSchemas ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getColumnPrivileges( + const Any&, const ::rtl::OUString&, const ::rtl::OUString&, + const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eColumnPrivileges ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getColumns( + const Any&, + const ::rtl::OUString&, + const ::rtl::OUString& tableNamePattern, + const ::rtl::OUString& columnNamePattern) throw(SQLException, RuntimeException) +{ + ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eColumns); + Reference< XResultSet > xRef = pResult; + + ODatabaseMetaDataResultSet::ORows aRows; + + if (match(tableNamePattern, getAddressBookTableName(), '\0')) + { + ODatabaseMetaDataResultSet::ORow aRow(19); + + aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[3] = new ORowSetValueDecorator(getAddressBookTableName()); + aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[9] = ODatabaseMetaDataResultSet::get0Value(); + aRow[10] = new ORowSetValueDecorator((sal_Int32) 10); + aRow[11] = ODatabaseMetaDataResultSet::get1Value(); + aRow[12] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[13] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[14] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[15] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[16] = new ORowSetValueDecorator((sal_Int32) 254); + aRow[18] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("YES")); + + sal_Int32 nPosition = 1; + TQString aQtName; + ::rtl::OUString sName; + + aQtName = ::TDEABC::Addressee::revisionLabel(); + sName = (const sal_Unicode *) aQtName.ucs2(); + if (match(columnNamePattern, sName, '\0')) + { + aRow[4] = new ORowSetValueDecorator(sName); + aRow[5] = new ORowSetValueDecorator(DataType::TIMESTAMP); + aRow[6] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP")); + aRow[17] = new ORowSetValueDecorator(nPosition++); + aRows.push_back(aRow); + } + + ::TDEABC::Field::List aFields = ::TDEABC::Field::allFields(); + ::TDEABC::Field::List::iterator aField; + + for ( aField = aFields.begin(); + aField != aFields.end(); + ++aField, ++nPosition) + { + aQtName = (*aField)->label(); + sName = (const sal_Unicode *) aQtName.ucs2(); + if (match(columnNamePattern, sName, '\0')) + { + aRow[4] = new ORowSetValueDecorator(sName); + aRow[5] = new ORowSetValueDecorator(DataType::CHAR); + aRow[6] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("CHAR")); + aRow[7] = new ORowSetValueDecorator((sal_Int32) 256); +// Might be VARCHAR and not CHAR[256]... + aRow[17] = new ORowSetValueDecorator(nPosition); + aRows.push_back(aRow); + } + } + } + pResult->setRows(aRows); + return xRef; +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTables( + const Any&, + const ::rtl::OUString&, + const ::rtl::OUString&, + const Sequence< ::rtl::OUString >& types) throw(SQLException, RuntimeException) +{ + ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTables); + Reference< XResultSet > xRef = pResult; + + // check whether we have tables in the requested types + // for the moment, we answer only the "TABLE" table type + // when no types are given at all, we return all the tables + static const ::rtl::OUString aTable(::rtl::OUString::createFromAscii("TABLE")); + sal_Bool bTableFound = sal_False; + const ::rtl::OUString* p = types.getConstArray(), + * pEnd = p + types.getLength(); + + if (p == pEnd) + { + bTableFound = sal_True; + } + else while (p < pEnd) + { + if (match(*p, aTable, '\0')) + { + bTableFound = sal_True; + break; + } + p++; + } + if (!bTableFound) + return xRef; + + static ODatabaseMetaDataResultSet::ORows aRows; + + if (aRows.empty()) + { + ODatabaseMetaDataResultSet::ORow aRow(6); + + aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[3] = new ORowSetValueDecorator(getAddressBookTableName()); + aRow[4] = new ORowSetValueDecorator(aTable); + aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRows.push_back(aRow); + } + pResult->setRows(aRows); + return xRef; +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getProcedureColumns( + const Any&, const ::rtl::OUString&, + const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedureColumns ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getProcedures( + const Any&, const ::rtl::OUString&, + const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedures ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getVersionColumns( + const Any&, const ::rtl::OUString&, const ::rtl::OUString& table ) throw(SQLException, RuntimeException) +{ + ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eVersionColumns); + + Reference< XResultSet > xRef = pResult; + + ODatabaseMetaDataResultSet::ORows aRows; + + if (table == getAddressBookTableName()) + { + ODatabaseMetaDataResultSet::ORow aRow( 9 ); + TQString aQtName = ::TDEABC::Addressee::revisionLabel(); + ::rtl::OUString sName = (const sal_Unicode *) aQtName.ucs2(); + + aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue(); + + aRow[2] = new ORowSetValueDecorator(sName); + aRow[3] = new ORowSetValueDecorator(DataType::TIMESTAMP); + aRow[4] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP")); + + aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[7] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue(); + + aRows.push_back(aRow); + } + pResult->setRows(aRows); + return xRef; +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getExportedKeys( + const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eExportedKeys ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getImportedKeys( + const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eImportedKeys ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getPrimaryKeys( + const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::ePrimaryKeys ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getIndexInfo( + const Any&, const ::rtl::OUString&, const ::rtl::OUString&, + sal_Bool, sal_Bool ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eIndexInfo ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getBestRowIdentifier( + const Any&, const ::rtl::OUString&, const ::rtl::OUString&, sal_Int32, + sal_Bool ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eBestRowIdentifier ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTablePrivileges( + const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eTablePrivileges ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getCrossReference( + const Any&, const ::rtl::OUString&, + const ::rtl::OUString&, const Any&, + const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCrossReference ); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getUDTs( const Any&, const ::rtl::OUString&, const ::rtl::OUString&, const Sequence< sal_Int32 >& ) throw(SQLException, RuntimeException) +{ + OSL_ENSURE(0,"Not implemented yet!"); + throw SQLException(); +} +// ----------------------------------------------------------------------------- + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx b/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx new file mode 100644 index 0000000..9ddc063 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx @@ -0,0 +1,217 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_ +#define _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_ + +#include "KConnection.hxx" +#include +#include + +namespace connectivity +{ + namespace kab + { + //************************************************************** + //************ Class: KabDatabaseMetaData + //************************************************************** + + typedef ::cppu::WeakImplHelper1< ::com::sun::star::sdbc::XDatabaseMetaData> KabDatabaseMetaData_BASE; + + class KabDatabaseMetaData : public KabDatabaseMetaData_BASE + { + ::com::sun::star::uno::Reference< KabConnection > m_xConnection; + sal_Bool m_bUseCatalog; + + public: + + inline KabConnection* getOwnConnection() const { return m_xConnection.get(); } + + KabDatabaseMetaData(KabConnection* _pCon); + static const ::rtl::OUString & getAddressBookTableName(); + virtual ~KabDatabaseMetaData(); + + // this interface is really BIG + // XDatabaseMetaData + virtual sal_Bool SAL_CALL allProceduresAreCallable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL allTablesAreSelectable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getURL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getUserName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isReadOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL nullsAreSortedLow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getDatabaseProductName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getDatabaseProductVersion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getDriverName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getDriverVersion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) throw(::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) throw(::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL usesLocalFiles( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsMixedCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL storesMixedCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getIdentifierQuoteString( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getSQLKeywords( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getNumericFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getStringFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getSystemFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getTimeDateFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getSearchStringEscape( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getExtraNameCharacters( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsAlterTableWithAddColumn( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsAlterTableWithDropColumn( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsColumnAliasing( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsTypeConversion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsGroupBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getSchemaTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getProcedureTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getCatalogTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isCatalogAtStart( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getCatalogSeparator( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSchemasInDataManipulation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSchemasInTableDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsCatalogsInDataManipulation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsCatalogsInTableDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsPositionedDelete( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsStoredProcedures( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsUnion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsUnionAll( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxConnections( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxIndexLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxRowSize( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxStatementLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxStatements( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxTablesInSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getProcedures( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& procedureNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getProcedureColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& procedureNamePattern, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTables( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& types ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getSchemas( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getCatalogs( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTableTypes( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getColumnPrivileges( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTablePrivileges( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getBestRowIdentifier( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, sal_Int32 scope, sal_Bool nullable ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getVersionColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getPrimaryKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getImportedKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getExportedKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getCrossReference( const ::com::sun::star::uno::Any& primaryCatalog, const ::rtl::OUString& primarySchema, const ::rtl::OUString& primaryTable, const ::com::sun::star::uno::Any& foreignCatalog, const ::rtl::OUString& foreignSchema, const ::rtl::OUString& foreignTable ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTypeInfo( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getIndexInfo( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, sal_Bool unique, sal_Bool approximate ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsBatchUpdates( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getUDTs( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& typeNamePattern, const ::com::sun::star::uno::Sequence< sal_Int32 >& types ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KDriver.cxx b/connectivity/source/drivers/tdeab/KDriver.cxx new file mode 100644 index 0000000..cdf0463 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KDriver.cxx @@ -0,0 +1,476 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KDriver.hxx" +#include "TDEInit.h" +#include "KConnection.hxx" + +/** === begin UNO includes === **/ +#include +#include +#include +/** === end UNO includes === **/ +#include +#include +#include "resource/tdeab_res.hrc" +#include "resource/sharedresources.hxx" + +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::sdbc; +using namespace com::sun::star::sdb; +using namespace com::sun::star::frame; +using namespace connectivity::kab; + +// ======================================================================= +// = KabImplModule +// ======================================================================= +// -------------------------------------------------------------------------------- +KabImplModule::KabImplModule( const Reference< XMultiServiceFactory >& _rxFactory ) + :m_xORB(_rxFactory) + ,m_bAttemptedLoadModule(false) + ,m_bAttemptedInitialize(false) + ,m_hConnectorModule(NULL) + ,m_pConnectionFactoryFunc(NULL) + ,m_pApplicationInitFunc(NULL) + ,m_pApplicationShutdownFunc(NULL) + ,m_pTDEVersionCheckFunc(NULL) +{ + if ( !m_xORB.is() ) + throw NullPointerException(); +} + +// -------------------------------------------------------------------------------- +bool KabImplModule::isTDEPresent() +{ + if ( !impl_loadModule() ) + return false; + + return true; +} + +// -------------------------------------------------------------------------------- +KabImplModule::TDEVersionType KabImplModule::matchTDEVersion() +{ + OSL_PRECOND( m_pTDEVersionCheckFunc, "KabImplModule::matchTDEVersion: module not loaded!" ); + + int nVersionInfo = (*m_pTDEVersionCheckFunc)(); + if ( nVersionInfo < 0 ) + return eTooOld; + if ( nVersionInfo > 0 ) + return eToNew; + return eSupported; +} + +// -------------------------------------------------------------------------------- +namespace +{ + template< typename FUNCTION > + void lcl_getFunctionFromModuleOrUnload( oslModule& _rModule, const sal_Char* _pAsciiSymbolName, FUNCTION& _rFunction ) + { + _rFunction = NULL; + if ( _rModule ) + { + // + const ::rtl::OUString sSymbolName = ::rtl::OUString::createFromAscii( _pAsciiSymbolName ); + _rFunction = (FUNCTION)( osl_getSymbol( _rModule, sSymbolName.pData ) ); + + if ( !_rFunction ) + { // did not find the symbol + OSL_ENSURE( false, ::rtl::OString( "lcl_getFunctionFromModuleOrUnload: could not find the symbol " ) + ::rtl::OString( _pAsciiSymbolName ) ); + osl_unloadModule( _rModule ); + _rModule = NULL; + } + } + } +} + +// -------------------------------------------------------------------------------- +extern "C" { void SAL_CALL thisModule() {} } + +bool KabImplModule::impl_loadModule() +{ + if ( m_bAttemptedLoadModule ) + return ( m_hConnectorModule != NULL ); + m_bAttemptedLoadModule = true; + + OSL_ENSURE( !m_hConnectorModule && !m_pConnectionFactoryFunc && !m_pApplicationInitFunc && !m_pApplicationShutdownFunc && !m_pTDEVersionCheckFunc, + "KabImplModule::impl_loadModule: inconsistence: inconsistency (never attempted load before, but some values already set)!"); + + const ::rtl::OUString sModuleName = ::rtl::OUString::createFromAscii( SAL_MODULENAME( "kabdrv1" ) ); + m_hConnectorModule = osl_loadModuleRelative( &thisModule, sModuleName.pData, SAL_LOADMODULE_NOW ); // LAZY! #i61335# + OSL_ENSURE( m_hConnectorModule, "KabImplModule::impl_loadModule: could not load the implementation library!" ); + if ( !m_hConnectorModule ) + return false; + + lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "createKabConnection", m_pConnectionFactoryFunc ); + lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "initTDEApplication", m_pApplicationInitFunc ); + lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "shutdownTDEApplication", m_pApplicationShutdownFunc ); + lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "matchTDEVersion", m_pTDEVersionCheckFunc ); + + if ( !m_hConnectorModule ) + // one of the symbols did not exist + throw RuntimeException(); + + return true; +} + +// -------------------------------------------------------------------------------- +void KabImplModule::impl_unloadModule() +{ + OSL_PRECOND( m_hConnectorModule != NULL, "KabImplModule::impl_unloadModule: no module!" ); + + osl_unloadModule( m_hConnectorModule ); + m_hConnectorModule = NULL; + + m_pConnectionFactoryFunc = NULL; + m_pApplicationInitFunc = NULL; + m_pApplicationShutdownFunc = NULL; + m_pTDEVersionCheckFunc = NULL; + + m_bAttemptedLoadModule = false; +} + +// -------------------------------------------------------------------------------- +void KabImplModule::init() +{ + if ( !impl_loadModule() ) + impl_throwNoKdeException(); + + // if we're not running on a supported version, throw + KabImplModule::TDEVersionType eTDEVersion = matchTDEVersion(); + + if ( eTDEVersion == eTooOld ) + impl_throwKdeTooOldException(); + + if ( ( eTDEVersion == eToNew ) && !impl_doAllowNewTDEVersion() ) + impl_throwKdeTooNewException(); + + if ( !m_bAttemptedInitialize ) + { + m_bAttemptedInitialize = true; + (*m_pApplicationInitFunc)(); + } +} + +// -------------------------------------------------------------------------------- +bool KabImplModule::impl_doAllowNewTDEVersion() +{ + try + { + Reference< XMultiServiceFactory > xConfigProvider( + m_xORB->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider" ) ) ), + UNO_QUERY_THROW ); + Sequence< Any > aCreationArgs(1); + aCreationArgs[0] <<= PropertyValue( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ), + 0, + makeAny( KabDriver::impl_getConfigurationSettingsPath() ), + PropertyState_DIRECT_VALUE ); + Reference< XPropertySet > xSettings( xConfigProvider->createInstanceWithArguments( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" ) ), + aCreationArgs ), + UNO_QUERY_THROW ); + + sal_Bool bDisableCheck = sal_False; + xSettings->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableTDEMaximumVersionCheck" ) ) ) >>= bDisableCheck; + + return bDisableCheck != sal_False; + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return false; +} + +// -------------------------------------------------------------------------------- +void KabImplModule::impl_throwNoKdeException() +{ + ::connectivity::SharedResources aResources; + const ::rtl::OUString sError( aResources.getResourceString( + STR_NO_TDE_INST + ) ); + impl_throwGenericSQLException( sError ); +} + +// -------------------------------------------------------------------------------- +void KabImplModule::impl_throwKdeTooOldException() +{ + ::connectivity::SharedResources aResources; + const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( + STR_TDE_VERSION_TOO_OLD, + "$major$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MAJOR), + "$minor$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MINOR) + ) ); + impl_throwGenericSQLException( sError ); +} + +// -------------------------------------------------------------------------------- +void KabImplModule::impl_throwGenericSQLException( const ::rtl::OUString& _rMessage ) +{ + SQLException aError; + aError.Message = _rMessage; + aError.SQLState = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "S1000" ) ); + aError.ErrorCode = 0; + throw aError; +} + +// -------------------------------------------------------------------------------- +void KabImplModule::impl_throwKdeTooNewException() +{ + ::connectivity::SharedResources aResources; + + SQLException aError; + aError.Message = aResources.getResourceStringWithSubstitution( + STR_TDE_VERSION_TOO_NEW, + "$major$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MAJOR), + "$minor$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MINOR) + ); + aError.SQLState = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "S1000" ) ); + aError.ErrorCode = 0; + + SQLContext aDetails; + ::rtl::OUStringBuffer aMessage; + aMessage.append( aResources.getResourceString(STR_TDE_VERSION_TOO_NEW_WORK_AROUND) ); + + aMessage.appendAscii( "Sub disableTDEMaxVersionCheck\n" ); + aMessage.appendAscii( " BasicLibraries.LoadLibrary( \"Tools\" )\n" ); + + aMessage.appendAscii( " Dim configNode as Object\n" ); + aMessage.appendAscii( " configNode = GetRegistryKeyContent( \"" ); + aMessage.append( KabDriver::impl_getConfigurationSettingsPath() ); + aMessage.appendAscii( "\", true )\n" ); + + aMessage.appendAscii( " configNode.DisableTDEMaximumVersionCheck = TRUE\n" ); + aMessage.appendAscii( " configNode.commitChanges\n" ); + aMessage.appendAscii( "End Sub\n" ); + + aDetails.Message = aMessage.makeStringAndClear(); + + aError.NextException <<= aDetails; + + throw aError; +} + +// -------------------------------------------------------------------------------- +KabConnection* KabImplModule::createConnection( KabDriver* _pDriver ) const +{ + OSL_PRECOND( m_hConnectorModule, "KabImplModule::createConnection: not initialized!" ); + + void* pUntypedConnection = (*m_pConnectionFactoryFunc)( _pDriver ); + if ( !pUntypedConnection ) + throw RuntimeException(); + + return static_cast< KabConnection* >( pUntypedConnection ); +} + +// -------------------------------------------------------------------------------- +void KabImplModule::shutdown() +{ + if ( !m_hConnectorModule ) + return; + + (*m_pApplicationShutdownFunc)(); + m_bAttemptedInitialize = false; + + impl_unloadModule(); +} + +// ======================================================================= +// = KabDriver +// ======================================================================= +KabDriver::KabDriver( + const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) + : KDriver_BASE(m_aMutex), + m_xMSFactory(_rxFactory), + m_aImplModule(_rxFactory) +{ + if ( !m_xMSFactory.is() ) + throw NullPointerException(); + + osl_incrementInterlockedCount( &m_refCount ); + try + { + Reference< XDesktop > xDesktop( + m_xMSFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ) ) ), + UNO_QUERY_THROW ); + xDesktop->addTerminateListener( this ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + osl_decrementInterlockedCount( &m_refCount ); +} +// -------------------------------------------------------------------------------- +void KabDriver::disposing() +{ + ::osl::MutexGuard aGuard(m_aMutex); + + // when driver will be destroied so all our connections have to be destroied as well + for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i) + { + Reference< XComponent > xComp(i->get(), UNO_QUERY); + if (xComp.is()) + xComp->dispose(); + } + m_xConnections.clear(); + + WeakComponentImplHelperBase::disposing(); +} +// static ServiceInfo +//------------------------------------------------------------------------------ +rtl::OUString KabDriver::getImplementationName_Static( ) throw(RuntimeException) +{ + return rtl::OUString::createFromAscii( impl_getAsciiImplementationName() ); +} +//------------------------------------------------------------------------------ +Sequence< ::rtl::OUString > KabDriver::getSupportedServiceNames_Static( ) throw (RuntimeException) +{ + // which service is supported + // for more information @see com.sun.star.sdbc.Driver + Sequence< ::rtl::OUString > aSNS( 1 ); + aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.Driver"); + + return aSNS; +} +//------------------------------------------------------------------ +::rtl::OUString SAL_CALL KabDriver::getImplementationName( ) throw(RuntimeException) +{ + return getImplementationName_Static(); +} +//------------------------------------------------------------------ +sal_Bool SAL_CALL KabDriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException) +{ + Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames()); + const ::rtl::OUString* pSupported = aSupported.getConstArray(); + const ::rtl::OUString* pEnd = pSupported + aSupported.getLength(); + + while (pSupported != pEnd && !pSupported->equals(_rServiceName)) + ++pSupported; + return pSupported != pEnd; +} +//------------------------------------------------------------------ +Sequence< ::rtl::OUString > SAL_CALL KabDriver::getSupportedServiceNames( ) throw(RuntimeException) +{ + return getSupportedServiceNames_Static(); +} +// -------------------------------------------------------------------------------- +Reference< XConnection > SAL_CALL KabDriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard(m_aMutex); + + m_aImplModule.init(); + + // create a new connection with the given properties and append it to our vector + KabConnection* pConnection = m_aImplModule.createConnection( this ); + OSL_POSTCOND( pConnection, "KabDriver::connect: no connection has been created by the factory!" ); + + // by definition, the factory function returned an object which was acquired once + Reference< XConnection > xConnection = pConnection; + pConnection->release(); + + // late constructor call which can throw exception and allows a correct dtor call when so + pConnection->construct( url, info ); + + // remember it + m_xConnections.push_back( WeakReferenceHelper( *pConnection ) ); + + return xConnection; +} +// -------------------------------------------------------------------------------- +sal_Bool SAL_CALL KabDriver::acceptsURL( const ::rtl::OUString& url ) + throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard(m_aMutex); + + if ( !m_aImplModule.isTDEPresent() ) + return sal_False; + + // here we have to look whether we support this URL format + return (!url.compareTo(::rtl::OUString::createFromAscii("sdbc:address:kab:"), 16)); +} +// -------------------------------------------------------------------------------- +Sequence< DriverPropertyInfo > SAL_CALL KabDriver::getPropertyInfo( const ::rtl::OUString&, const Sequence< PropertyValue >& ) throw(SQLException, RuntimeException) +{ + // if you have something special to say, return it here :-) + return Sequence< DriverPropertyInfo >(); +} +// -------------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDriver::getMajorVersion( ) throw(RuntimeException) +{ + return KAB_DRIVER_VERSION_MAJOR; +} +// -------------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabDriver::getMinorVersion( ) throw(RuntimeException) +{ + return KAB_DRIVER_VERSION_MINOR; +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabDriver::queryTermination( const EventObject& ) throw (TerminationVetoException, RuntimeException) +{ + // nothing to do, nothing to veto +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabDriver::notifyTermination( const EventObject& ) throw (RuntimeException) +{ + m_aImplModule.shutdown(); +} +// -------------------------------------------------------------------------------- +void SAL_CALL KabDriver::disposing( const EventObject& ) throw (RuntimeException) +{ + // not interested in (this is the disposing of the desktop, if any) +} +// -------------------------------------------------------------------------------- +const sal_Char* KabDriver::impl_getAsciiImplementationName() +{ + return "com.sun.star.comp.sdbc.kab.Driver"; + // this name is referenced in the configuration and in the kab.xml + // Please be careful when changing it. +} +// -------------------------------------------------------------------------------- +::rtl::OUString KabDriver::impl_getConfigurationSettingsPath() +{ + ::rtl::OUStringBuffer aPath; + aPath.appendAscii( "/org.openoffice.Office.DataAccess/DriverSettings/" ); + aPath.appendAscii( "com.sun.star.comp.sdbc.kab.Driver" ); + return aPath.makeStringAndClear(); +} +// -------------------------------------------------------------------------------- +Reference< XInterface > SAL_CALL KabDriver::Create( const Reference< XMultiServiceFactory >& _rxFactory ) throw( Exception ) +{ + return *(new KabDriver(_rxFactory)); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KDriver.hxx b/connectivity/source/drivers/tdeab/KDriver.hxx new file mode 100644 index 0000000..b09a7d2 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KDriver.hxx @@ -0,0 +1,227 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_DRIVER_HXX_ +#define _CONNECTIVITY_KAB_DRIVER_HXX_ + +/** === begin UNO includes === **/ +#include +#include +#include +/** === end UNO includes === **/ +#include +#include + +namespace connectivity +{ + namespace kab + { + class KabConnection; + class KabDriver; + + typedef void* (SAL_CALL * ConnectionFactoryFunction)( void* _pDriver ); + typedef void (SAL_CALL * ApplicationInitFunction)( void ); + typedef void (SAL_CALL * ApplicationShutdownFunction)( void ); + typedef int (SAL_CALL * TDEVersionCheckFunction)( void ); + + typedef std::vector< ::com::sun::star::uno::WeakReferenceHelper > OWeakRefArray; + + // =============================================================== + // = KabImplModule + // =============================================================== + class KabImplModule + { + private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > + m_xORB; + + /// Did we already attempt to load the module and to retrieve the symbols? + bool m_bAttemptedLoadModule; + /// Did we already check the TDE version and initialize the impl module (or at least attempted to)? + bool m_bAttemptedInitialize; + + oslModule m_hConnectorModule; + ConnectionFactoryFunction m_pConnectionFactoryFunc; + ApplicationInitFunction m_pApplicationInitFunc; + ApplicationShutdownFunction m_pApplicationShutdownFunc; + TDEVersionCheckFunction m_pTDEVersionCheckFunc; + + public: + KabImplModule( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory ); + + /** determines whether there is a TDE present in the environment + */ + bool isTDEPresent(); + + enum TDEVersionType + { + eTooOld, + eSupported, + eToNew + }; + /** checks whether the TDE version we're running against is supported + @precond + the module is loaded, i.e impl_loadModule has successfully been called + */ + TDEVersionType matchTDEVersion(); + + /** initializes the implementation module. + + @raises ::com::sun::star::uno::RuntimeException + if the module could be loaded, but required symbols are missing + @raises ::com::sun::star::sdbc::SQLException + if the TDE version we're running against is not supported, or no TDE was found at all + */ + void init(); + + /** shuts down the impl module (and the TDE application, if we own it) + */ + void shutdown(); + + /** creates a new connection + @precond + init has been called before + @raises ::com::sun::star::uno::RuntimeException + if no connection object could be created (which is a severe error, normally impossible) + */ + KabConnection* createConnection( KabDriver* _pDriver ) const; + + private: + /** loads the implementation module and retrieves the needed symbols + + Save against being called multiple times. + + @return if the module could be loaded successfully. + + @raises ::com::sun::star::uno::RuntimeException + if the module could be loaded, but required symbols are missing + */ + bool impl_loadModule(); + + /** unloads the implementation module, and resets all function pointers to + @precond m_hConnectorModule is not + */ + void impl_unloadModule(); + + /** throws an SQLException saying than no TDE installation was found + */ + void impl_throwNoKdeException(); + + /** throws an SQLException saying that the found TDE version is too old + */ + void impl_throwKdeTooOldException(); + + /** throws an SQLException saying that the found TDE version is too new + */ + void impl_throwKdeTooNewException(); + + /** throws a generic SQL exception with SQLState S1000 and error code 0 + */ + void impl_throwGenericSQLException( const ::rtl::OUString& _rMessage ); + + /** determines whether it's allowed to run on a too-new (not confirmed to work) version + */ + bool impl_doAllowNewTDEVersion(); + }; + + // =============================================================== + // = KabDriver + // =============================================================== + typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::sdbc::XDriver, + ::com::sun::star::lang::XServiceInfo, + ::com::sun::star::frame::XTerminateListener > KDriver_BASE; + class KabDriver : public KDriver_BASE + { + protected: + ::osl::Mutex m_aMutex; // mutex is need to control member access + OWeakRefArray m_xConnections; // vector containing a list of all the + // KabConnection objects for this Driver + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > + m_xMSFactory; // the multi-service factory + KabImplModule m_aImplModule; + + public: + static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception ); + + // XServiceInfo - static versions + static ::rtl::OUString getImplementationName_Static( ) throw(::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static( ) throw (::com::sun::star::uno::RuntimeException); + + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& + getMSFactory() const { return m_xMSFactory; } + + /** returns the driver's implementation name (being pure ASCII) for reference in various places + */ + static const sal_Char* impl_getAsciiImplementationName(); + + /** returns the path of our configuration settings + */ + static ::rtl::OUString impl_getConfigurationSettingsPath(); + + protected: + KabDriver(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory); + + // OComponentHelper + virtual void SAL_CALL disposing(void); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException); + + // XDriver + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL connect( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL acceptsURL( const ::rtl::OUString& url ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMajorVersion() throw(::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getMinorVersion() throw(::com::sun::star::uno::RuntimeException); + + // XTerminateListener + virtual void SAL_CALL queryTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::frame::TerminationVetoException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL notifyTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::uno::RuntimeException); + + // XEventListener + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); + + private: + /** shuts down the library which contains the real implementations + + This method is safe against being called multiple times + + @precond our mutex is locked + */ + void impl_shutdownImplementationModule(); + }; + } + +} + +#endif // _CONNECTIVITY_KAB_DRIVER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KPreparedStatement.cxx b/connectivity/source/drivers/tdeab/KPreparedStatement.cxx new file mode 100644 index 0000000..12816c2 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KPreparedStatement.cxx @@ -0,0 +1,394 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KPreparedStatement.hxx" +#include "propertyids.hxx" +#include +#include +#include "resource/tdeab_res.hrc" +#include "resource/sharedresources.hxx" + +using namespace connectivity::kab; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::sdbc; +using namespace com::sun::star::util; + +IMPLEMENT_SERVICE_INFO(KabPreparedStatement, "com.sun.star.sdbc.drivers.KabPreparedStatement", "com.sun.star.sdbc.PreparedStatement"); +// ------------------------------------------------------------------------- +void KabPreparedStatement::checkAndResizeParameters(sal_Int32 nParams) throw(SQLException) +{ + if ( !m_aParameterRow.is() ) + m_aParameterRow = new OValueVector(); + + if (nParams < 1) + ::dbtools::throwInvalidIndexException(*(KabPreparedStatement *) this,Any()); + + if (nParams >= (sal_Int32) (m_aParameterRow->get()).size()) + (m_aParameterRow->get()).resize(nParams); +} +// ------------------------------------------------------------------------- +void KabPreparedStatement::setKabFields() const throw(SQLException) +{ + ::rtl::Reference xColumns; // selected columns + + xColumns = m_aSQLIterator.getSelectColumns(); + if (!xColumns.is()) + { + ::connectivity::SharedResources aResources; + const ::rtl::OUString sError( aResources.getResourceString( + STR_INVALID_COLUMN_SELECTION + ) ); + ::dbtools::throwGenericSQLException(sError,NULL); + } + m_xMetaData->setKabFields(xColumns); +} +// ------------------------------------------------------------------------- +void KabPreparedStatement::resetParameters() const throw(SQLException) +{ + m_nParameterIndex = 0; +} +// ------------------------------------------------------------------------- +void KabPreparedStatement::getNextParameter(::rtl::OUString &rParameter) const throw(SQLException) +{ + if (m_nParameterIndex >= (sal_Int32) (m_aParameterRow->get()).size()) + { + ::connectivity::SharedResources aResources; + const ::rtl::OUString sError( aResources.getResourceString( + STR_INVALID_PARA_COUNT + ) ); + ::dbtools::throwGenericSQLException(sError,*(KabPreparedStatement *) this); + } // if (m_nParameterIndex >= (sal_Int32) (*m_aParameterRow).size()) + + rParameter = (m_aParameterRow->get())[m_nParameterIndex]; + + m_nParameterIndex++; +} +// ------------------------------------------------------------------------- +KabPreparedStatement::KabPreparedStatement( + KabConnection* _pConnection, + const ::rtl::OUString& sql) + : KabPreparedStatement_BASE(_pConnection), + m_sSqlStatement(sql), + m_bPrepared(sal_False), + m_nParameterIndex(0), + m_aParameterRow() +{ +} +// ------------------------------------------------------------------------- +KabPreparedStatement::~KabPreparedStatement() +{ +} +// ------------------------------------------------------------------------- +void KabPreparedStatement::disposing() +{ + KabPreparedStatement_BASE::disposing(); + + if (m_aParameterRow.is()) + { + m_aParameterRow->get().clear(); + m_aParameterRow = NULL; + } +} +// ------------------------------------------------------------------------- +Reference< XResultSetMetaData > SAL_CALL KabPreparedStatement::getMetaData() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + if (!m_xMetaData.is()) + { + m_xMetaData = new KabResultSetMetaData(getOwnConnection()); + setKabFields(); + } + Reference< XResultSetMetaData > xMetaData = m_xMetaData.get(); + return xMetaData; +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::close() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + // Reset last warning message + try { + clearWarnings (); + KabCommonStatement::close(); + } + catch (SQLException &) { + // If we get an error, ignore + } + + // Remove this Statement object from the Connection object's + // list +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabPreparedStatement::execute() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + Reference< XResultSet> xRS = KabCommonStatement::executeQuery(m_sSqlStatement); + + return xRS.is(); +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabPreparedStatement::executeUpdate() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + // same as in statement with the difference that this statement also can contain parameter + return 0; +} +// ------------------------------------------------------------------------- +Reference< XConnection > SAL_CALL KabPreparedStatement::getConnection() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + return (Reference< XConnection >) m_pConnection; +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabPreparedStatement::executeQuery() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + Reference< XResultSet > rs = KabCommonStatement::executeQuery(m_sSqlStatement); + + return rs; +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setNull(sal_Int32 parameterIndex, sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + checkAndResizeParameters(parameterIndex); + + (m_aParameterRow->get())[parameterIndex - 1].setNull(); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setObjectNull(sal_Int32, sal_Int32, const ::rtl::OUString&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setObjectNull", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setBoolean(sal_Int32, sal_Bool) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setBoolean", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setByte(sal_Int32, sal_Int8) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setByte", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setShort(sal_Int32, sal_Int16) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setShort", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setInt(sal_Int32, sal_Int32) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setInt", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setLong(sal_Int32, sal_Int64) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setFloat(sal_Int32, float) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setFloat", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setDouble(sal_Int32, double) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setDouble", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setString(sal_Int32 parameterIndex, const ::rtl::OUString &x) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + checkAndResizeParameters(parameterIndex); + + (m_aParameterRow->get())[parameterIndex - 1] = x; +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setBytes(sal_Int32, const Sequence< sal_Int8 >&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setBytes", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setDate(sal_Int32, const Date&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setDate", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setTime(sal_Int32, const Time&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setTime", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setTimestamp(sal_Int32, const DateTime&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setTimestamp", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setBinaryStream(sal_Int32, const Reference< ::com::sun::star::io::XInputStream >&, sal_Int32) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setBinaryStream", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setCharacterStream(sal_Int32, const Reference< ::com::sun::star::io::XInputStream >&, sal_Int32) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setCharacterStream", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setObject(sal_Int32 parameterIndex, const Any& x) throw(SQLException, RuntimeException) +{ + if(!::dbtools::implSetObject(this,parameterIndex,x)) + { + throw SQLException(); + } +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setObjectWithInfo(sal_Int32, const Any&, sal_Int32, sal_Int32) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setObjectWithInfo", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setRef(sal_Int32, const Reference< XRef >&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setRef", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setBlob(sal_Int32, const Reference< XBlob >&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setBlob", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setClob(sal_Int32, const Reference< XClob >&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setClob", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::setArray(sal_Int32, const Reference< XArray >&) throw(SQLException, RuntimeException) +{ + + + +::dbtools::throwFunctionNotSupportedException("setArray", NULL); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabPreparedStatement::clearParameters() throw(SQLException, RuntimeException) +{ +::dbtools::throwFunctionNotSupportedException("clearParameters", NULL); +} +// ------------------------------------------------------------------------- +void KabPreparedStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) throw (Exception) +{ + switch (nHandle) + { + case PROPERTY_ID_RESULTSETCONCURRENCY: + break; + case PROPERTY_ID_RESULTSETTYPE: + break; + case PROPERTY_ID_FETCHDIRECTION: + break; + case PROPERTY_ID_USEBOOKMARKS: + break; + default: + KabCommonStatement::setFastPropertyValue_NoBroadcast(nHandle,rValue); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KPreparedStatement.hxx b/connectivity/source/drivers/tdeab/KPreparedStatement.hxx new file mode 100644 index 0000000..25a7a01 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KPreparedStatement.hxx @@ -0,0 +1,123 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_ +#define _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_ + +#include "KStatement.hxx" +#include "KResultSetMetaData.hxx" +#include +#include +#include +#include + +namespace connectivity +{ + namespace kab + { + + class OBoundParam; + typedef ::cppu::ImplInheritanceHelper4< KabCommonStatement, + ::com::sun::star::sdbc::XPreparedStatement, + ::com::sun::star::sdbc::XParameters, + ::com::sun::star::sdbc::XResultSetMetaDataSupplier, + ::com::sun::star::lang::XServiceInfo> KabPreparedStatement_BASE; + + class KabPreparedStatement : public KabPreparedStatement_BASE + { + protected: + ::rtl::OUString m_sSqlStatement; + ::rtl::Reference< KabResultSetMetaData > + m_xMetaData; + sal_Bool m_bPrepared; + mutable sal_Int32 m_nParameterIndex; + OValueRow m_aParameterRow; + + void checkAndResizeParameters(sal_Int32 nParams) throw(::com::sun::star::sdbc::SQLException); + void setKabFields() const throw(::com::sun::star::sdbc::SQLException); + + protected: + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::uno::Exception); + + virtual void resetParameters() const throw(::com::sun::star::sdbc::SQLException); + virtual void getNextParameter(::rtl::OUString &rParameter) const throw(::com::sun::star::sdbc::SQLException); + virtual ~KabPreparedStatement(); + + public: + DECLARE_SERVICE_INFO(); + KabPreparedStatement(KabConnection* _pConnection, const ::rtl::OUString& sql); + + // OComponentHelper + virtual void SAL_CALL disposing(); + + // XPreparedStatement + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL executeUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL execute( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XParameters + virtual void SAL_CALL setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& typeName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setBoolean( sal_Int32 parameterIndex, sal_Bool x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setByte( sal_Int32 parameterIndex, sal_Int8 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setShort( sal_Int32 parameterIndex, sal_Int16 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setInt( sal_Int32 parameterIndex, sal_Int32 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setLong( sal_Int32 parameterIndex, sal_Int64 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const ::com::sun::star::util::Date& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const ::com::sun::star::util::Time& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const ::com::sun::star::util::DateTime& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL clearParameters( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XCloseable + virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XResultSetMetaDataSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KResultSet.cxx b/connectivity/source/drivers/tdeab/KResultSet.cxx new file mode 100644 index 0000000..a0d6b07 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KResultSet.cxx @@ -0,0 +1,991 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KResultSet.hxx" +#include "KResultSetMetaData.hxx" +#include "KConnection.hxx" +#include "kcondition.hxx" +#include "korder.hxx" +#include "kfields.hxx" +#include +#include +#include "TConnection.hxx" +#include +#include "resource/tdeab_res.hrc" +#include "resource/sharedresources.hxx" + +using namespace connectivity::kab; +using namespace cppu; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::sdbc; +using namespace com::sun::star::sdbcx; +using namespace com::sun::star::io; +using namespace com::sun::star::util; + +IMPLEMENT_SERVICE_INFO(KabResultSet, "com.sun.star.sdbc.drivers.KabResultSet", "com.sun.star.sdbc.ResultSet"); +// ------------------------------------------------------------------------- +KabResultSet::KabResultSet(KabCommonStatement* pStmt) + : KabResultSet_BASE(m_aMutex), + OPropertySetHelper(KabResultSet_BASE::rBHelper), + m_xStatement(pStmt), + m_xMetaData(NULL), + m_aKabAddressees(), + m_nRowPos(-1), + m_bWasNull(sal_True) +{ +} +// ------------------------------------------------------------------------- +KabResultSet::~KabResultSet() +{ +} +// ------------------------------------------------------------------------- +void KabResultSet::allKabAddressees() +{ + KabConnection* pConnection = static_cast< KabConnection *>(m_xStatement->getConnection().get()); + TDEABC::AddressBook* pAddressBook = pConnection->getAddressBook(); + + m_aKabAddressees = pAddressBook->allAddressees(); +} +// ------------------------------------------------------------------------- +void KabResultSet::someKabAddressees(const KabCondition *pCondition) +{ + KabConnection* pConnection = static_cast< KabConnection *>(m_xStatement->getConnection().get()); + TDEABC::AddressBook* pAddressBook = pConnection->getAddressBook(); + + TDEABC::AddressBook::Iterator iterator; + + for (iterator = pAddressBook->begin(); + iterator != pAddressBook->end(); + ++iterator) + { + if (pCondition->eval(*iterator)) + m_aKabAddressees.push_back(*iterator); + } +} +// ------------------------------------------------------------------------- +void KabResultSet::sortKabAddressees(const KabOrder *pOrder) +{ + // We do not use class KAddresseeList, which has a sorting algorithm in it, because + // it uses templates. It would expand to more or less the same code as the one + // which follows, but it would need not be called in a much less convenient way. + + TDEABC::Addressee::List::Iterator + begin = m_aKabAddressees.begin(), + end = m_aKabAddressees.end(), + iterator; + + // Bubble sort. Feel free to implement a better algorithm. + while (begin != end) + { + end--; + for (iterator = begin; iterator != end; ++iterator) + { + if (pOrder->compare(*iterator, *end) > 0) + qSwap(*iterator, *end); + } + } +} +// ------------------------------------------------------------------------- +void KabResultSet::disposing() +{ + OPropertySetHelper::disposing(); + + ::osl::MutexGuard aGuard(m_aMutex); + +m_xStatement.clear(); +m_xMetaData.clear(); +} +// ------------------------------------------------------------------------- +Any SAL_CALL KabResultSet::queryInterface(const Type & rType) throw(RuntimeException) +{ + Any aRet = OPropertySetHelper::queryInterface(rType); + if (!aRet.hasValue()) + aRet = KabResultSet_BASE::queryInterface(rType); + return aRet; +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::acquire() throw() +{ + KabResultSet_BASE::acquire(); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::release() throw() +{ + KabResultSet_BASE::release(); +} +// ------------------------------------------------------------------------- +Sequence< Type > SAL_CALL KabResultSet::getTypes() throw(RuntimeException) +{ + OTypeCollection aTypes( + ::getCppuType( (const Reference< ::com::sun::star::beans::XMultiPropertySet >*) 0), + ::getCppuType( (const Reference< ::com::sun::star::beans::XFastPropertySet >*) 0), + ::getCppuType( (const Reference< ::com::sun::star::beans::XPropertySet >*) 0)); + + return comphelper::concatSequences(aTypes.getTypes(), KabResultSet_BASE::getTypes()); +} +// ------------------------------------------------------------------------- +::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL KabResultSet::getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException) +{ + return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSet::findColumn(const ::rtl::OUString& columnName) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + // find the first column with the name columnName + Reference< XResultSetMetaData > xMeta = getMetaData(); + sal_Int32 nLen = xMeta->getColumnCount(); + + for (sal_Int32 i = 1; i <= nLen; ++i) + if (xMeta->isCaseSensitive(i) ? + columnName == xMeta->getColumnName(i) : + columnName.equalsIgnoreAsciiCase(xMeta->getColumnName(i))) + return i; + + ::connectivity::SharedResources aResources; + const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( + STR_INVALID_COLUMNNAME, + "$columnname$",columnName + ) ); + ::dbtools::throwGenericSQLException(sError,NULL); + + // Unreachable: + OSL_ASSERT(false); + return 0; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabResultSet::getString(sal_Int32 columnIndex) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + ::rtl::OUString aRet; + sal_Int32 nAddressees = m_aKabAddressees.size(); + ::TDEABC::Field::List aFields = ::TDEABC::Field::allFields(); + + if (m_nRowPos != -1 && m_nRowPos != nAddressees && m_xMetaData.is()) + { + sal_Int32 nFieldNumber = m_xMetaData->fieldAtColumn(columnIndex); + TQString aQtName; + + switch (nFieldNumber) + { + case KAB_FIELD_REVISION: +// trigger an exception here +m_bWasNull = true; +return aRet; + default: + aQtName = aFields[nFieldNumber - KAB_DATA_FIELDS]->value(m_aKabAddressees[m_nRowPos]); + } +// TDE address book currently does not use NULL values. +// But it might do it someday + if (!aQtName.isNull()) + { + m_bWasNull = false; + aRet = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); + return aRet; + } + } +// Trigger an exception ? + m_bWasNull = true; + return aRet; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::getBoolean(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getBoolean", NULL); + + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Int8 SAL_CALL KabResultSet::getByte(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getByte", NULL); + + sal_Int8 nRet = 0; + return nRet; +} +// ------------------------------------------------------------------------- +sal_Int16 SAL_CALL KabResultSet::getShort(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getShort", NULL); + + sal_Int16 nRet = 0; + return nRet; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSet::getInt(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getInt", NULL); + + sal_Int32 nRet = 0; + return nRet; +} +// ------------------------------------------------------------------------- +sal_Int64 SAL_CALL KabResultSet::getLong(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getLong", NULL); + + return sal_Int64(); +} +// ------------------------------------------------------------------------- +float SAL_CALL KabResultSet::getFloat(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getFloat", NULL); + + float nVal(0); + return nVal; +} +// ------------------------------------------------------------------------- +double SAL_CALL KabResultSet::getDouble(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getDouble", NULL); + + double nRet = 0; + return nRet; +} +// ------------------------------------------------------------------------- +Sequence< sal_Int8 > SAL_CALL KabResultSet::getBytes(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("", NULL); + + return Sequence< sal_Int8 >(); +} +// ------------------------------------------------------------------------- +Date SAL_CALL KabResultSet::getDate(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getDate", NULL); + + Date aRet; + return aRet; +} +// ------------------------------------------------------------------------- +Time SAL_CALL KabResultSet::getTime(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getTime", NULL); + + Time nRet; + return nRet; +} +// ------------------------------------------------------------------------- +DateTime SAL_CALL KabResultSet::getTimestamp(sal_Int32 columnIndex) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + DateTime nRet; + sal_Int32 nAddressees = m_aKabAddressees.size(); + + if (m_nRowPos != -1 && m_nRowPos != nAddressees && m_xMetaData.is()) + { + KabResultSetMetaData *pMeta = static_cast(m_xMetaData.get()); + sal_Int32 nFieldNumber = pMeta->fieldAtColumn(columnIndex); + + if (nFieldNumber == KAB_FIELD_REVISION) + { + TQDateTime nRevision(m_aKabAddressees[m_nRowPos].revision()); + + if (!nRevision.isNull()) + { + m_bWasNull = false; + nRet.Year = nRevision.date().year(); + nRet.Month = nRevision.date().month(); + nRet.Day = nRevision.date().day(); + nRet.Hours = nRevision.time().hour(); + nRet.Minutes = nRevision.time().minute(); + nRet.Seconds = nRevision.time().second(); + nRet.HundredthSeconds = nRevision.time().msec() / 10; + return nRet; + } + } + else { + ; + } +// trigger an exception here + } +// Trigger an exception ? + m_bWasNull = true; + return nRet; +} +// ------------------------------------------------------------------------- +Reference< XInputStream > SAL_CALL KabResultSet::getBinaryStream(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getBinaryStream", NULL); + + return NULL; +} +// ------------------------------------------------------------------------- +Reference< XInputStream > SAL_CALL KabResultSet::getCharacterStream(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getCharacterStream", NULL); + + return NULL; +} +// ------------------------------------------------------------------------- +Any SAL_CALL KabResultSet::getObject(sal_Int32, const Reference< ::com::sun::star::container::XNameAccess >&) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getObject", NULL); + + return Any(); +} +// ------------------------------------------------------------------------- +Reference< XRef > SAL_CALL KabResultSet::getRef(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getRef", NULL); + + return NULL; +} +// ------------------------------------------------------------------------- +Reference< XBlob > SAL_CALL KabResultSet::getBlob(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getBlob", NULL); + + return NULL; +} +// ------------------------------------------------------------------------- +Reference< XClob > SAL_CALL KabResultSet::getClob(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getClob", NULL); + + return NULL; +} +// ------------------------------------------------------------------------- +Reference< XArray > SAL_CALL KabResultSet::getArray(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + +::dbtools::throwFunctionNotSupportedException("getArray", NULL); + + return NULL; +} +// ------------------------------------------------------------------------- +Reference< XResultSetMetaData > SAL_CALL KabResultSet::getMetaData() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + if (!m_xMetaData.is()) + m_xMetaData = new KabResultSetMetaData(m_xStatement->getOwnConnection()); + + Reference< XResultSetMetaData > xMetaData = m_xMetaData.get(); + return xMetaData; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::isBeforeFirst() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + if (m_nRowPos == -1) + return sal_True; + + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::isAfterLast() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + sal_Int32 nAddressees = m_aKabAddressees.size(); + if (m_nRowPos == nAddressees) + return sal_True; + + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::isFirst() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + if (m_nRowPos == 0) + return sal_True; + + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::isLast() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + sal_Int32 nAddressees = m_aKabAddressees.size(); + if (m_nRowPos == nAddressees - 1) + return sal_True; + + return sal_False; +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::beforeFirst() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + // move before the first row + m_nRowPos = -1; +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::afterLast() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + // move after the last row + sal_Int32 nAddressees = m_aKabAddressees.size(); + m_nRowPos = nAddressees; +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::close() throw(SQLException, RuntimeException) +{ + { + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + } + dispose(); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::first() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + sal_Int32 nAddressees = m_aKabAddressees.size(); + if (nAddressees == 0) + return sal_False; + + m_nRowPos = 0; + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::last() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + sal_Int32 nAddressees = m_aKabAddressees.size(); + if (nAddressees == 0) + return sal_False; + + m_nRowPos = nAddressees - 1; + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSet::getRow() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return m_nRowPos; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::absolute(sal_Int32 row) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + sal_Int32 nAddressees = m_aKabAddressees.size(); + if (row <= -1 || + row >= nAddressees) + return sal_False; + + m_nRowPos = row; + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::relative(sal_Int32 row) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return absolute(m_nRowPos + row); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::next() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return absolute(m_nRowPos + 1); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::previous() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return absolute(m_nRowPos - 1); +} +// ------------------------------------------------------------------------- +Reference< XInterface > SAL_CALL KabResultSet::getStatement() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + Reference< XStatement > xStatement = m_xStatement.get(); + return xStatement; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::rowDeleted() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::rowInserted() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::rowUpdated() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::wasNull() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return m_bWasNull; +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::cancel() throw(RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::clearWarnings() throw(SQLException, RuntimeException) +{ +} +// ------------------------------------------------------------------------- +Any SAL_CALL KabResultSet::getWarnings() throw(SQLException, RuntimeException) +{ + return Any(); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::insertRow() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + // you only have to implement this if you want to insert new rows +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateRow() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + // only when you allow updates +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::deleteRow() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::cancelRowUpdates() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::moveToInsertRow() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + // only when you allow inserts +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::moveToCurrentRow() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateNull(sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateBoolean(sal_Int32, sal_Bool) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateByte(sal_Int32, sal_Int8) throw(SQLException, RuntimeException) +{ + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + ::osl::MutexGuard aGuard( m_aMutex ); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateShort(sal_Int32, sal_Int16) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateInt(sal_Int32, sal_Int32) throw(SQLException, RuntimeException) +{ + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + ::osl::MutexGuard aGuard( m_aMutex ); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateLong(sal_Int32, sal_Int64) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ----------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateFloat(sal_Int32, float) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateDouble(sal_Int32, double) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateString(sal_Int32, const ::rtl::OUString&) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateBytes(sal_Int32, const Sequence< sal_Int8 >&) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateDate(sal_Int32, const Date&) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateTime(sal_Int32, const Time&) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateTimestamp(sal_Int32, const DateTime&) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateBinaryStream(sal_Int32, const Reference< XInputStream >&, sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateCharacterStream(sal_Int32, const Reference< XInputStream >&, sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::refreshRow() throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateObject(sal_Int32, const Any&) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabResultSet::updateNumericObject(sal_Int32, const Any&, sal_Int32) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); +} +// ------------------------------------------------------------------------- +// XRowLocate +Any SAL_CALL KabResultSet::getBookmark() throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + sal_Int32 nAddressees = m_aKabAddressees.size(); + + if (m_nRowPos != -1 && m_nRowPos != nAddressees) + { + TQString aQtName = m_aKabAddressees[m_nRowPos].uid(); + ::rtl::OUString sUniqueIdentifier = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); + return makeAny(sUniqueIdentifier); + } + return Any(); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::moveToBookmark(const Any& bookmark) throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + ::rtl::OUString sBookmark = comphelper::getString(bookmark); + sal_Int32 nAddressees = m_aKabAddressees.size(); + + for (sal_Int32 nRow = 0; nRow < nAddressees; nRow++) + { + TQString aQtName = m_aKabAddressees[nRow].uid(); + ::rtl::OUString sUniqueIdentifier = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); + + if (sUniqueIdentifier == sBookmark) + { + m_nRowPos = nRow; + return sal_True; + } + } + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::moveRelativeToBookmark(const Any& bookmark, sal_Int32 rows) throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + sal_Int32 nRowSave = m_nRowPos; + + if (moveToBookmark(bookmark)) + { + sal_Int32 nAddressees = m_aKabAddressees.size(); + + m_nRowPos += rows; + + if (-1 < m_nRowPos && m_nRowPos < nAddressees) + return sal_True; + } + + m_nRowPos = nRowSave; + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSet::compareBookmarks(const Any& firstItem, const Any& secondItem) throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + ::rtl::OUString sFirst = comphelper::getString(firstItem); + ::rtl::OUString sSecond = comphelper::getString(secondItem); + + if (sFirst < sSecond) + return CompareBookmark::LESS; + if (sFirst > sSecond) + return CompareBookmark::GREATER; + return CompareBookmark::EQUAL; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSet::hasOrderedBookmarks() throw( SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSet::hashBookmark(const Any& bookmark) throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + ::rtl::OUString sBookmark = comphelper::getString(bookmark); + + return sBookmark.hashCode(); +} +// ------------------------------------------------------------------------- +// XDeleteRows +Sequence< sal_Int32 > SAL_CALL KabResultSet::deleteRows(const Sequence< Any >&) throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); + + return Sequence< sal_Int32 >(); +} +// ------------------------------------------------------------------------- +IPropertyArrayHelper* KabResultSet::createArrayHelper() const +{ + Sequence< Property > aProps(6); + Property* pProperties = aProps.getArray(); + sal_Int32 nPos = 0; + DECL_PROP1IMPL(CURSORNAME, ::rtl::OUString) PropertyAttribute::READONLY); + DECL_PROP0(FETCHDIRECTION, sal_Int32); + DECL_PROP0(FETCHSIZE, sal_Int32); + DECL_BOOL_PROP1IMPL(ISBOOKMARKABLE) PropertyAttribute::READONLY); + DECL_PROP1IMPL(RESULTSETCONCURRENCY,sal_Int32) PropertyAttribute::READONLY); + DECL_PROP1IMPL(RESULTSETTYPE, sal_Int32) PropertyAttribute::READONLY); + + return new OPropertyArrayHelper(aProps); +} +// ------------------------------------------------------------------------- +IPropertyArrayHelper & KabResultSet::getInfoHelper() +{ + return *static_cast(this)->getArrayHelper(); +} +// ------------------------------------------------------------------------- +sal_Bool KabResultSet::convertFastPropertyValue( + Any &, + Any &, + sal_Int32 nHandle, + const Any& ) + throw (::com::sun::star::lang::IllegalArgumentException) +{ + switch (nHandle) + { + case PROPERTY_ID_ISBOOKMARKABLE: + case PROPERTY_ID_CURSORNAME: + case PROPERTY_ID_RESULTSETCONCURRENCY: + case PROPERTY_ID_RESULTSETTYPE: + throw ::com::sun::star::lang::IllegalArgumentException(); + break; + case PROPERTY_ID_FETCHDIRECTION: + case PROPERTY_ID_FETCHSIZE: + default: + ; + } + return sal_False; +} +// ------------------------------------------------------------------------- +void KabResultSet::setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const Any& ) + throw (Exception) +{ + switch (nHandle) + { + case PROPERTY_ID_ISBOOKMARKABLE: + case PROPERTY_ID_CURSORNAME: + case PROPERTY_ID_RESULTSETCONCURRENCY: + case PROPERTY_ID_RESULTSETTYPE: + throw Exception(); + break; + case PROPERTY_ID_FETCHDIRECTION: + break; + case PROPERTY_ID_FETCHSIZE: + break; + default: + ; + } +} +// ------------------------------------------------------------------------- +void KabResultSet::getFastPropertyValue( + Any& _rValue, + sal_Int32 nHandle) const +{ + switch (nHandle) + { + case PROPERTY_ID_ISBOOKMARKABLE: + _rValue <<= (sal_Bool)sal_False; + break; + case PROPERTY_ID_CURSORNAME: + case PROPERTY_ID_RESULTSETCONCURRENCY: + case PROPERTY_ID_RESULTSETTYPE: + case PROPERTY_ID_FETCHDIRECTION: + case PROPERTY_ID_FETCHSIZE: + ; + } +} +// ----------------------------------------------------------------------------- + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KResultSet.hxx b/connectivity/source/drivers/tdeab/KResultSet.hxx new file mode 100644 index 0000000..d68f676 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KResultSet.hxx @@ -0,0 +1,228 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_RESULTSET_HXX_ +#define _CONNECTIVITY_KAB_RESULTSET_HXX_ + +#include "KStatement.hxx" +#include "KResultSetMetaData.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace connectivity +{ + namespace kab + { + /* + ** KabResultSet + */ + typedef ::cppu::WeakComponentImplHelper12< ::com::sun::star::sdbc::XResultSet, + ::com::sun::star::sdbc::XRow, + ::com::sun::star::sdbc::XResultSetMetaDataSupplier, + ::com::sun::star::util::XCancellable, + ::com::sun::star::sdbc::XWarningsSupplier, + ::com::sun::star::sdbc::XResultSetUpdate, + ::com::sun::star::sdbc::XRowUpdate, + ::com::sun::star::sdbcx::XRowLocate, + ::com::sun::star::sdbcx::XDeleteRows, + ::com::sun::star::sdbc::XCloseable, + ::com::sun::star::sdbc::XColumnLocate, + ::com::sun::star::lang::XServiceInfo> KabResultSet_BASE; + + class KabResultSet : public comphelper::OBaseMutex, + public KabResultSet_BASE, + public ::cppu::OPropertySetHelper, + public comphelper::OPropertyArrayUsageHelper + { + protected: + ::rtl::Reference< KabCommonStatement > m_xStatement; // the statement that has created this result set + ::rtl::Reference< KabResultSetMetaData > m_xMetaData; // the description of the columns in this result set + ::TDEABC::Addressee::List m_aKabAddressees; // address book entries matching the query + sal_Int32 m_nRowPos; // the current row within the result set + sal_Bool m_bWasNull; // last entry retrieved from this result set was NULL + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; + + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + + virtual sal_Bool SAL_CALL convertFastPropertyValue( + ::com::sun::star::uno::Any & rConvertedValue, + ::com::sun::star::uno::Any & rOldValue, + sal_Int32 nHandle, + const ::com::sun::star::uno::Any& rValue) + throw (::com::sun::star::lang::IllegalArgumentException); + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const ::com::sun::star::uno::Any& rValue) + throw (::com::sun::star::uno::Exception); + virtual void SAL_CALL getFastPropertyValue( + ::com::sun::star::uno::Any& rValue, + sal_Int32 nHandle) const; + + // you can't delete objects of this type + virtual ~KabResultSet(); + + public: + DECLARE_SERVICE_INFO(); + + KabResultSet(KabCommonStatement *pStmt); + + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > operator *() + { + return ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(*(KabResultSet_BASE*) this); + } + + void allKabAddressees(); + void someKabAddressees(const class KabCondition *pCondition); + void sortKabAddressees(const class KabOrder *pOrder); + + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + + // XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + + // XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + + // XResultSet + virtual sal_Bool SAL_CALL isBeforeFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isAfterLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL beforeFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL afterLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL first( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL last( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL next( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL previous( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL refreshRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL rowUpdated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL rowInserted( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL rowDeleted( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getStatement( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XRow + virtual sal_Bool SAL_CALL wasNull( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getString( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XResultSetMetaDataSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XCancellable + virtual void SAL_CALL cancel( ) throw(::com::sun::star::uno::RuntimeException); + + // XCloseable + virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XWarningsSupplier + virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL clearWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XResultSetUpdate + virtual void SAL_CALL insertRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL deleteRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL cancelRowUpdates( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL moveToInsertRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL moveToCurrentRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + // XRowUpdate + virtual void SAL_CALL updateNull( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateBoolean( sal_Int32 columnIndex, sal_Bool x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateByte( sal_Int32 columnIndex, sal_Int8 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateShort( sal_Int32 columnIndex, sal_Int16 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateInt( sal_Int32 columnIndex, sal_Int32 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateLong( sal_Int32 columnIndex, sal_Int64 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateFloat( sal_Int32 columnIndex, float x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateDouble( sal_Int32 columnIndex, double x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateString( sal_Int32 columnIndex, const ::rtl::OUString& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateBytes( sal_Int32 columnIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateDate( sal_Int32 columnIndex, const ::com::sun::star::util::Date& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateTime( sal_Int32 columnIndex, const ::com::sun::star::util::Time& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateTimestamp( sal_Int32 columnIndex, const ::com::sun::star::util::DateTime& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateBinaryStream( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateCharacterStream( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateNumericObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x, sal_Int32 scale ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XColumnLocate + virtual sal_Int32 SAL_CALL findColumn( const ::rtl::OUString& columnName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XRowLocate + virtual ::com::sun::star::uno::Any SAL_CALL getBookmark( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL moveToBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL moveRelativeToBookmark( const ::com::sun::star::uno::Any& bookmark, sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL compareBookmarks( const ::com::sun::star::uno::Any& firstItem, const ::com::sun::star::uno::Any& secondItem ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL hasOrderedBookmarks( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL hashBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XDeleteRows + virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL deleteRows( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_KAB_RESULTSET_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx b/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx new file mode 100644 index 0000000..08dfb05 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx @@ -0,0 +1,191 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KResultSetMetaData.hxx" +#include "kfields.hxx" +#include "KDatabaseMetaData.hxx" +#include + +using namespace connectivity::kab; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::sdbc; + +KabResultSetMetaData::KabResultSetMetaData(KabConnection* _pConnection) + : m_pConnection(_pConnection), + m_aKabFields() +{ +} +// ------------------------------------------------------------------------- +KabResultSetMetaData::~KabResultSetMetaData() +{ +} +// ------------------------------------------------------------------------- +void KabResultSetMetaData::setKabFields(const ::rtl::Reference &xColumns) throw(SQLException) +{ + OSQLColumns::Vector::const_iterator aIter; + static const ::rtl::OUString aName(::rtl::OUString::createFromAscii("Name")); + + for (aIter = xColumns->get().begin(); aIter != xColumns->get().end(); ++aIter) + { + ::rtl::OUString aFieldName; + sal_uInt32 nFieldNumber; + + (*aIter)->getPropertyValue(aName) >>= aFieldName; + nFieldNumber = findKabField(aFieldName); + m_aKabFields.push_back(nFieldNumber); + } +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSetMetaData::getColumnDisplaySize(sal_Int32 column) throw(SQLException, RuntimeException) +{ + return m_aKabFields[column - 1] < KAB_DATA_FIELDS? 20: 50; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSetMetaData::getColumnType(sal_Int32 column) throw(SQLException, RuntimeException) +{ + return m_aKabFields[column - 1] == KAB_FIELD_REVISION? DataType::TIMESTAMP: DataType::CHAR; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSetMetaData::getColumnCount() throw(SQLException, RuntimeException) +{ + return m_aKabFields.size(); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSetMetaData::isCaseSensitive(sal_Int32) throw(SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabResultSetMetaData::getSchemaName(sal_Int32) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnName(sal_Int32 column) throw(SQLException, RuntimeException) +{ + sal_uInt32 nFieldNumber = m_aKabFields[column - 1]; + ::TDEABC::Field::List aFields = ::TDEABC::Field::allFields(); + TQString aQtName; + + switch (nFieldNumber) + { + case KAB_FIELD_REVISION: + aQtName = TDEABC::Addressee::revisionLabel(); + break; + default: + aQtName = aFields[nFieldNumber - KAB_DATA_FIELDS]->label(); + } + ::rtl::OUString aName((const sal_Unicode *) aQtName.ucs2()); + + return aName; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabResultSetMetaData::getTableName(sal_Int32) throw(SQLException, RuntimeException) +{ + return KabDatabaseMetaData::getAddressBookTableName(); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabResultSetMetaData::getCatalogName(sal_Int32) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnTypeName(sal_Int32) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnLabel(sal_Int32) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnServiceName(sal_Int32) throw(SQLException, RuntimeException) +{ + return ::rtl::OUString(); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSetMetaData::isCurrency(sal_Int32) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSetMetaData::isAutoIncrement(sal_Int32) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSetMetaData::isSigned(sal_Int32) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSetMetaData::getPrecision(sal_Int32) throw(SQLException, RuntimeException) +{ + return 0; +} +// ----------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSetMetaData::getScale(sal_Int32) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) +{ + return 0; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabResultSetMetaData::isNullable(sal_Int32) throw(SQLException, RuntimeException) +{ + return (sal_Int32) sal_True; +// TDE address book currently does not use NULL values. +// But it might do it someday +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSetMetaData::isSearchable(sal_Int32) throw(SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSetMetaData::isReadOnly(sal_Int32) throw(SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSetMetaData::isDefinitelyWritable(sal_Int32) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabResultSetMetaData::isWritable(sal_Int32) throw(SQLException, RuntimeException) +{ + return sal_False; +} +// ------------------------------------------------------------------------- + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx b/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx new file mode 100644 index 0000000..8a04fc0 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx @@ -0,0 +1,95 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_ +#define _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_ + +#include "KConnection.hxx" +#include +#include +#include +#include + +namespace connectivity +{ + namespace kab + { + /* + ** KabResultSetMetaData + */ + typedef ::cppu::WeakImplHelper1< ::com::sun::star::sdbc::XResultSetMetaData> KabResultSetMetaData_BASE; + + class KabResultSetMetaData : public KabResultSetMetaData_BASE + { + KabConnection* m_pConnection; + ::std::vector m_aKabFields; // for each selected column, contains the number + // of the corresponding KAddressBook field + + protected: + virtual ~KabResultSetMetaData(); + + public: + KabResultSetMetaData(KabConnection* _pConnection); + + // avoid ambigous cast error from the compiler + inline operator ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > () throw() + { return this; } + + void setKabFields( + const ::rtl::Reference &xColumns) throw(::com::sun::star::sdbc::SQLException); + inline sal_uInt32 fieldAtColumn(sal_Int32 columnIndex) const + { return m_aKabFields[columnIndex - 1]; } + + virtual sal_Int32 SAL_CALL getColumnCount( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isAutoIncrement( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isCaseSensitive( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isSearchable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isCurrency( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL isNullable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isSigned( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getColumnDisplaySize( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getColumnLabel( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getColumnName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getSchemaName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getPrecision( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getScale( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getTableName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getCatalogName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getColumnType( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getColumnTypeName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isReadOnly( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isWritable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isDefinitelyWritable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getColumnServiceName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KServices.cxx b/connectivity/source/drivers/tdeab/KServices.cxx new file mode 100644 index 0000000..a82b756 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KServices.cxx @@ -0,0 +1,180 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KDriver.hxx" +#include +#include + +using namespace connectivity::kab; +using ::rtl::OUString; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::registry::XRegistryKey; +using ::com::sun::star::lang::XSingleServiceFactory; +using ::com::sun::star::lang::XMultiServiceFactory; + +typedef Reference< XSingleServiceFactory > (SAL_CALL *createFactoryFunc) + ( + const Reference< XMultiServiceFactory > & rServiceManager, + const OUString & rComponentName, + ::cppu::ComponentInstantiation pCreateFunction, + const Sequence< OUString > & rServiceNames, + rtl_ModuleCount* _pTemp + ); + +//*************************************************************************************** +// +// The following C Api must be provided! +// It consists in three functions that must be exported by the module +// + +//--------------------------------------------------------------------------------------- +void REGISTER_PROVIDER( + const OUString& aServiceImplName, + const Sequence< OUString>& Services, + const Reference< ::com::sun::star::registry::XRegistryKey > & xKey) +{ + OUString aMainKeyName; + aMainKeyName = OUString::createFromAscii("/"); + aMainKeyName += aServiceImplName; + aMainKeyName += OUString::createFromAscii("/UNO/SERVICES"); + + Reference< ::com::sun::star::registry::XRegistryKey > xNewKey( xKey->createKey(aMainKeyName) ); + OSL_ENSURE(xNewKey.is(), "KAB::component_writeInfo : could not create a registry key !"); + + for (sal_Int32 i=0; icreateKey(Services[i]); +} + + +//--------------------------------------------------------------------------------------- +struct ProviderRequest +{ + Reference< XSingleServiceFactory > xRet; + Reference< XMultiServiceFactory > const xServiceManager; + OUString const sImplementationName; + + ProviderRequest( + void* pServiceManager, + sal_Char const* pImplementationName + ) + : xServiceManager(reinterpret_cast(pServiceManager)) + , sImplementationName(OUString::createFromAscii(pImplementationName)) + { + } + + inline + sal_Bool CREATE_PROVIDER( + const OUString& Implname, + const Sequence< OUString > & Services, + ::cppu::ComponentInstantiation Factory, + createFactoryFunc creator + ) + { + if (!xRet.is() && (Implname == sImplementationName)) + try + { + xRet = creator( xServiceManager, sImplementationName,Factory, Services,0); + } + catch(...) + { + } + return xRet.is(); + } + + void* getProvider() const { return xRet.get(); } +}; + +//--------------------------------------------------------------------------------------- + +extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( + const sal_Char **ppEnvTypeName, + uno_Environment ** + ) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +//--------------------------------------------------------------------------------------- +extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo( + void*, + void* pRegistryKey + ) +{ + if (pRegistryKey) + try + { + Reference< ::com::sun::star::registry::XRegistryKey > xKey(reinterpret_cast< ::com::sun::star::registry::XRegistryKey*>(pRegistryKey)); + + REGISTER_PROVIDER( + KabDriver::getImplementationName_Static(), + KabDriver::getSupportedServiceNames_Static(), xKey); + + return sal_True; + } + catch (::com::sun::star::registry::InvalidRegistryException& ) + { + OSL_ENSURE(sal_False, "KAB::component_writeInfo : could not create a registry key ! ## InvalidRegistryException !"); + } + + return sal_False; +} + +//--------------------------------------------------------------------------------------- +extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( + const sal_Char* pImplementationName, + void* pServiceManager, + void*) +{ + void* pRet = 0; + if (pServiceManager) + { + ProviderRequest aReq(pServiceManager,pImplementationName); + + aReq.CREATE_PROVIDER( + KabDriver::getImplementationName_Static(), + KabDriver::getSupportedServiceNames_Static(), + &KabDriver::Create, + ::cppu::createSingleFactory) + ; + + if (aReq.xRet.is()) + aReq.xRet->acquire(); + + pRet = aReq.getProvider(); + } + + return pRet; +}; + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KStatement.cxx b/connectivity/source/drivers/tdeab/KStatement.cxx new file mode 100644 index 0000000..1301349 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KStatement.cxx @@ -0,0 +1,588 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KStatement.hxx" +#include "KConnection.hxx" +#include "KDriver.hxx" +#include "KResultSet.hxx" +#include "KResultSetMetaData.hxx" +#include "kcondition.hxx" +#include "korder.hxx" +#include "TConnection.hxx" +#include +#include "resource/tdeab_res.hrc" +#include "resource/sharedresources.hxx" + + +#if OSL_DEBUG_LEVEL > 0 +# define OUtoCStr( x ) ( ::rtl::OUStringToOString ( (x), RTL_TEXTENCODING_ASCII_US).getStr()) +#else /* OSL_DEBUG_LEVEL */ +# define OUtoCStr( x ) ("dummy") +#endif /* OSL_DEBUG_LEVEL */ + +using namespace connectivity::kab; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::sdbc; +using namespace com::sun::star::sdbcx; +using namespace com::sun::star::container; +using namespace com::sun::star::io; +using namespace com::sun::star::util; + +namespace +{ + void lcl_throwError(sal_uInt16 _nErrorId) + { + ::connectivity::SharedResources aResources; + const ::rtl::OUString sError( aResources.getResourceString(_nErrorId) ); + ::dbtools::throwGenericSQLException(sError,NULL); + } +} + +IMPLEMENT_SERVICE_INFO(KabStatement, "com.sun.star.sdbc.drivers.KabStatement", "com.sun.star.sdbc.Statement"); +//------------------------------------------------------------------------------ +KabCommonStatement::KabCommonStatement(KabConnection* _pConnection ) + : KabCommonStatement_BASE(m_aMutex), + OPropertySetHelper(KabCommonStatement_BASE::rBHelper), + m_aParser(_pConnection->getDriver()->getMSFactory()), + m_aSQLIterator(_pConnection, _pConnection->createCatalog()->getTables(), m_aParser, NULL ), + m_pParseTree(NULL), + m_pConnection(_pConnection), + rBHelper(KabCommonStatement_BASE::rBHelper) +{ + m_pConnection->acquire(); +} +// ----------------------------------------------------------------------------- +KabCommonStatement::~KabCommonStatement() +{ +} +// ----------------------------------------------------------------------------- +void KabCommonStatement::disposing() +{ + KabCommonStatement_BASE::disposing(); +} +// ----------------------------------------------------------------------------- +void KabCommonStatement::resetParameters() const throw(::com::sun::star::sdbc::SQLException) +{ + lcl_throwError(STR_PARA_ONLY_PREPARED); +} +// ----------------------------------------------------------------------------- +void KabCommonStatement::getNextParameter(::rtl::OUString &) const throw(::com::sun::star::sdbc::SQLException) +{ + lcl_throwError(STR_PARA_ONLY_PREPARED); +} +// ----------------------------------------------------------------------------- +KabCondition *KabCommonStatement::analyseWhereClause(const OSQLParseNode *pParseNode) const throw(SQLException) +{ + if (pParseNode->count() == 3) + { + const OSQLParseNode *pLeft = pParseNode->getChild(0), + *pMiddle = pParseNode->getChild(1), + *pRight = pParseNode->getChild(2); + + // WHERE ( ... ) ? + if (SQL_ISPUNCTUATION(pLeft, "(") && SQL_ISPUNCTUATION(pRight, ")")) + { + return analyseWhereClause(pMiddle); + } + else if (SQL_ISRULE(pParseNode, comparison_predicate)) + { + if (pLeft->isToken() && pRight->isToken()) + { + switch (pMiddle->getNodeType()) + { + case SQL_NODE_EQUAL: + // WHERE 0 = 1 + return new KabConditionConstant(pLeft->getTokenValue() == pRight->getTokenValue()); + + case SQL_NODE_NOTEQUAL: + // WHERE 0 <> 1 + // (might not be correct SQL... don't care, handling anyway) + return new KabConditionConstant(pLeft->getTokenValue() != pRight->getTokenValue()); + + default: + break; + } + } + else if (SQL_ISRULE(pLeft, column_ref)) + { + ::rtl::OUString sColumnName, + sTableRange; + + m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); + + if (pRight->isToken() || SQL_ISRULE(pRight, parameter)) + { + ::rtl::OUString sMatchString; + + if (pRight->isToken()) // WHERE Name = 'Doe' + sMatchString = pRight->getTokenValue(); + else if (SQL_ISRULE(pRight, parameter)) // WHERE Name = ? + getNextParameter(sMatchString); + + switch (pMiddle->getNodeType()) + { + case SQL_NODE_EQUAL: + // WHERE Name = 'Smith' + return new KabConditionEqual(sColumnName, sMatchString); + + case SQL_NODE_NOTEQUAL: + // WHERE Name <> 'Jones' + return new KabConditionDifferent(sColumnName, sMatchString); + + default: + break; + } + } + } + } + else if (SQL_ISRULE(pParseNode, search_condition)) + { + if (SQL_ISTOKEN(pMiddle, OR)) + { + // WHERE Name = 'Smith' OR Name = 'Jones' + return new KabConditionOr( + analyseWhereClause(pLeft), + analyseWhereClause(pRight)); + } + } + else if (SQL_ISRULE(pParseNode, boolean_term)) + { + if (SQL_ISTOKEN(pMiddle, AND)) + { + // WHERE Name = 'Smith' AND "Given Name" = 'Peter' + return new KabConditionAnd( + analyseWhereClause(pLeft), + analyseWhereClause(pRight)); + } + } + } + else if (SQL_ISRULE(pParseNode, test_for_null) || SQL_ISRULE(pParseNode, like_predicate)) + { + const OSQLParseNode *pLeft = pParseNode->getChild(0); + const OSQLParseNode* pPart2 = pParseNode->getChild(1); + const OSQLParseNode *pMiddleLeft = pPart2->getChild(0), + *pMiddleRight = pPart2->getChild(1), + *pRight = pPart2->getChild(2); + + if (SQL_ISRULE(pParseNode, test_for_null)) + { + if (SQL_ISRULE(pLeft, column_ref) && + SQL_ISTOKEN(pMiddleLeft, IS) && + SQL_ISTOKEN(pRight, NULL)) + { + ::rtl::OUString sColumnName, + sTableRange; + + m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); + + if (SQL_ISTOKEN(pMiddleRight, NOT)) + { + // WHERE "Mobile Phone" IS NOT NULL + return new KabConditionNotNull(sColumnName); + } + else + { + // WHERE "Mobile Phone" IS NULL + return new KabConditionNull(sColumnName); + } + } + } + else if (SQL_ISRULE(pParseNode, like_predicate)) + { + if (SQL_ISRULE(pLeft, column_ref)) + { + ::rtl::OUString sColumnName, + sTableRange; + + m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); + + if (pMiddleRight->isToken() || SQL_ISRULE(pMiddleRight, parameter)) + { + ::rtl::OUString sMatchString; + + if (pMiddleRight->isToken()) // WHERE Name LIKE 'Sm%' + sMatchString = pMiddleRight->getTokenValue(); + else if (SQL_ISRULE(pMiddleRight, parameter)) // WHERE Name LIKE ? + getNextParameter(sMatchString); + + return new KabConditionSimilar(sColumnName, sMatchString); + } + } + } + } + + lcl_throwError(STR_QUERY_TOO_COMPLEX); + + // Unreachable: + OSL_ASSERT(false); + return 0; +} +// ----------------------------------------------------------------------------- +KabOrder *KabCommonStatement::analyseOrderByClause(const OSQLParseNode *pParseNode) const throw(SQLException) +{ + if (SQL_ISRULE(pParseNode, ordering_spec_commalist)) + { + KabComplexOrder *list = new KabComplexOrder(); + sal_uInt32 n = pParseNode->count(); + + // Iterate through the ordering columns + for (sal_uInt32 i = 0; i < n; i++) + { + list->addOrder + (analyseOrderByClause(pParseNode->getChild(i))); + } + + return list; + } + else if (SQL_ISRULE(pParseNode, ordering_spec)) + { + if (pParseNode->count() == 2) + { + OSQLParseNode* pColumnRef = pParseNode->getChild(0); + OSQLParseNode* pAscendingDescending = pParseNode->getChild(1); + + if (SQL_ISRULE(pColumnRef, column_ref)) + { + if (pColumnRef->count() == 3) + pColumnRef = pColumnRef->getChild(2); + + if (pColumnRef->count() == 1) + { + ::rtl::OUString sColumnName = + pColumnRef->getChild(0)->getTokenValue(); + sal_Bool bAscending = + SQL_ISTOKEN(pAscendingDescending, DESC)? + sal_False: + sal_True; + + return new KabSimpleOrder(sColumnName, bAscending); + } + } + } + } + lcl_throwError(STR_QUERY_TOO_COMPLEX); + // Unreachable: + OSL_ASSERT(false); + return 0; +} +//------------------------------------------------------------------------------ +sal_Bool KabCommonStatement::isTableKnown(KabResultSet *pResult) const +{ + // can handle requests like SELECT * FROM addresses addresses + // but cannot handle requests like SELECT * FROM addresses persons + if (m_aSQLIterator.getTables().size() != 1) + return sal_False; + + if (m_aSQLIterator.getTables().begin()->first != pResult->getMetaData()->getTableName(0)) + return sal_False; + + return sal_True; +} +//------------------------------------------------------------------------------ +void KabCommonStatement::setKabFields(KabResultSet *pResult) const throw(SQLException) +{ + ::rtl::Reference xColumns; // selected columns + KabResultSetMetaData *pMeta; // meta information - holds the list of KAddressBook fields + + xColumns = m_aSQLIterator.getSelectColumns(); + if (!xColumns.is()) + { + lcl_throwError(STR_INVALID_COLUMN_SELECTION); + } + pMeta = static_cast(pResult->getMetaData().get()); + pMeta->setKabFields(xColumns); +} +// ------------------------------------------------------------------------- +void KabCommonStatement::selectAddressees(KabResultSet *pResult) const throw(SQLException) +{ + const OSQLParseNode *pParseNode; + KabCondition *pCondition; + + pParseNode = m_aSQLIterator.getWhereTree(); + if (pParseNode != NULL) + { + if (SQL_ISRULE(pParseNode, where_clause)) + { + resetParameters(); + pParseNode = pParseNode->getChild(1); + pCondition = analyseWhereClause(pParseNode); + if (pCondition->isAlwaysTrue()) + pResult->allKabAddressees(); + else if (!pCondition->isAlwaysFalse()) + pResult->someKabAddressees(pCondition); + delete pCondition; + return; + } + } + + // no WHERE clause: get all rows + pResult->allKabAddressees(); +} +// ------------------------------------------------------------------------- +void KabCommonStatement::sortAddressees(KabResultSet *pResult) const throw(SQLException) +{ + const OSQLParseNode *pParseNode; + KabOrder *pOrder; + + pParseNode = m_aSQLIterator.getOrderTree(); + if (pParseNode != NULL) + { + if (SQL_ISRULE(pParseNode, opt_order_by_clause)) + { + pParseNode = pParseNode->getChild(2); + pOrder = analyseOrderByClause(pParseNode); + pResult->sortKabAddressees(pOrder); + delete pOrder; + } + } +} +//----------------------------------------------------------------------------- +Any SAL_CALL KabCommonStatement::queryInterface( const Type & rType ) throw(RuntimeException) +{ + Any aRet = KabCommonStatement_BASE::queryInterface(rType); + if (!aRet.hasValue()) + aRet = OPropertySetHelper::queryInterface(rType); + return aRet; +} +// ------------------------------------------------------------------------- +Sequence< Type > SAL_CALL KabCommonStatement::getTypes( ) throw(RuntimeException) +{ + ::cppu::OTypeCollection aTypes( ::getCppuType( (const Reference< XMultiPropertySet > *)0 ), + ::getCppuType( (const Reference< XFastPropertySet > *)0 ), + ::getCppuType( (const Reference< XPropertySet > *)0 )); + + return comphelper::concatSequences(aTypes.getTypes(),KabCommonStatement_BASE::getTypes()); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabCommonStatement::cancel( ) throw(RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + // cancel the current sql statement +} +// ------------------------------------------------------------------------- +void SAL_CALL KabCommonStatement::close( ) throw(SQLException, RuntimeException) +{ + { + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + } + dispose(); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL KabCommonStatement::execute( + const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + Reference< XResultSet > xRS = executeQuery(sql); + + return xRS.is(); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL KabCommonStatement::executeQuery( + const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + +OSL_TRACE("TDE Address book - SQL Request: %s", OUtoCStr(sql)); + + KabResultSet* pResult = new KabResultSet(this); + Reference< XResultSet > xRS = pResult; + ::rtl::OUString aErr; + + m_pParseTree = m_aParser.parseTree(aErr, sql); + if (m_pParseTree == NULL) + throw SQLException(aErr, *this, aErr, 0, Any()); + + m_aSQLIterator.setParseTree(m_pParseTree); + m_aSQLIterator.traverseAll(); + switch (m_aSQLIterator.getStatementType()) + { + case SQL_STATEMENT_SELECT: + if (isTableKnown(pResult)) // FROM which table ? + { + setKabFields(pResult); // SELECT which columns ? + selectAddressees(pResult); // WHERE which condition ? + sortAddressees(pResult); // ORDER BY which columns ? +// To be continued: DISTINCT +// etc... + } + break; + + default: +// To be continued: UPDATE +// DELETE +// etc... + lcl_throwError(STR_QUERY_TOO_COMPLEX); + } + + return xRS; +} +// ------------------------------------------------------------------------- +Reference< XConnection > SAL_CALL KabCommonStatement::getConnection( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + // just return our connection here + return (Reference< XConnection >) m_pConnection; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL KabCommonStatement::executeUpdate( const ::rtl::OUString& ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + // the return values gives information about how many rows are affected by executing the sql statement + return 0; +} +// ------------------------------------------------------------------------- +Any SAL_CALL KabCommonStatement::getWarnings( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + return makeAny(m_aLastWarning); +} +// ------------------------------------------------------------------------- +void SAL_CALL KabCommonStatement::clearWarnings( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); + + m_aLastWarning = SQLWarning(); +} +// ------------------------------------------------------------------------- +::cppu::IPropertyArrayHelper* KabCommonStatement::createArrayHelper( ) const +{ + // this properties are defined by the service statement + // they must be in alphabetic order + Sequence< Property > aProps(10); + Property* pProperties = aProps.getArray(); + sal_Int32 nPos = 0; + DECL_PROP0(CURSORNAME, ::rtl::OUString); + DECL_BOOL_PROP0(ESCAPEPROCESSING); + DECL_PROP0(FETCHDIRECTION,sal_Int32); + DECL_PROP0(FETCHSIZE, sal_Int32); + DECL_PROP0(MAXFIELDSIZE,sal_Int32); + DECL_PROP0(MAXROWS, sal_Int32); + DECL_PROP0(QUERYTIMEOUT,sal_Int32); + DECL_PROP0(RESULTSETCONCURRENCY,sal_Int32); + DECL_PROP0(RESULTSETTYPE,sal_Int32); + DECL_BOOL_PROP0(USEBOOKMARKS); + + return new ::cppu::OPropertyArrayHelper(aProps); +} +// ------------------------------------------------------------------------- +::cppu::IPropertyArrayHelper & KabCommonStatement::getInfoHelper() +{ + return *const_cast(this)->getArrayHelper(); +} +// ------------------------------------------------------------------------- +sal_Bool KabCommonStatement::convertFastPropertyValue( + Any &, + Any &, + sal_Int32, + const Any&) throw (::com::sun::star::lang::IllegalArgumentException) +{ + sal_Bool bConverted = sal_False; + // here we have to try to convert + return bConverted; +} +// ------------------------------------------------------------------------- +void KabCommonStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any&) throw (Exception) +{ + // set the value to whatever is nescessary + switch (nHandle) + { + case PROPERTY_ID_QUERYTIMEOUT: + case PROPERTY_ID_MAXFIELDSIZE: + case PROPERTY_ID_MAXROWS: + case PROPERTY_ID_CURSORNAME: + case PROPERTY_ID_RESULTSETCONCURRENCY: + case PROPERTY_ID_RESULTSETTYPE: + case PROPERTY_ID_FETCHDIRECTION: + case PROPERTY_ID_FETCHSIZE: + case PROPERTY_ID_ESCAPEPROCESSING: + case PROPERTY_ID_USEBOOKMARKS: + default: + ; + } +} +// ------------------------------------------------------------------------- +void KabCommonStatement::getFastPropertyValue(Any&,sal_Int32 nHandle) const +{ + switch (nHandle) + { + case PROPERTY_ID_QUERYTIMEOUT: + case PROPERTY_ID_MAXFIELDSIZE: + case PROPERTY_ID_MAXROWS: + case PROPERTY_ID_CURSORNAME: + case PROPERTY_ID_RESULTSETCONCURRENCY: + case PROPERTY_ID_RESULTSETTYPE: + case PROPERTY_ID_FETCHDIRECTION: + case PROPERTY_ID_FETCHSIZE: + case PROPERTY_ID_ESCAPEPROCESSING: + case PROPERTY_ID_USEBOOKMARKS: + default: + ; + } +} +// ----------------------------------------------------------------------------- +void SAL_CALL KabCommonStatement::acquire() throw() +{ + KabCommonStatement_BASE::acquire(); +} +// ----------------------------------------------------------------------------- +void SAL_CALL KabCommonStatement::release() throw() +{ + KabCommonStatement_BASE::release(); +} +// ----------------------------------------------------------------------------- +Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL KabCommonStatement::getPropertySetInfo( ) throw(RuntimeException) +{ + return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); +} +// ----------------------------------------------------------------------------- +KabStatement::KabStatement(KabConnection* _pConnection) + : KabStatement_BASE(_pConnection) +{ +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KStatement.hxx b/connectivity/source/drivers/tdeab/KStatement.hxx new file mode 100644 index 0000000..c5f6564 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KStatement.hxx @@ -0,0 +1,174 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_STATEMENT_HXX_ +#define _CONNECTIVITY_KAB_STATEMENT_HXX_ + +#include "KConnection.hxx" +#include +#include "connectivity/sqliterator.hxx" +#include "connectivity/sqlparse.hxx" +#include +#include +#include +#include +#include + +namespace connectivity +{ + namespace kab + { + typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::sdbc::XStatement, + ::com::sun::star::sdbc::XWarningsSupplier, + ::com::sun::star::util::XCancellable, + ::com::sun::star::sdbc::XCloseable> KabCommonStatement_BASE; + + //************************************************************** + // Class KabCommonStatement + // is a base class for the normal statement and for the prepared statement + //************************************************************** + class KabCommonStatement : public comphelper::OBaseMutex, + public KabCommonStatement_BASE, + public ::cppu::OPropertySetHelper, + public comphelper::OPropertyArrayUsageHelper + + { + ::com::sun::star::sdbc::SQLWarning m_aLastWarning; + + protected: + ::std::list< ::rtl::OUString> m_aBatchList; + connectivity::OSQLParser m_aParser; + connectivity::OSQLParseTreeIterator m_aSQLIterator; + connectivity::OSQLParseNode* m_pParseTree; + KabConnection* m_pConnection; // The owning Connection object + + protected: + class KabCondition *analyseWhereClause( + const OSQLParseNode *pParseNode) const throw(::com::sun::star::sdbc::SQLException); + class KabOrder *analyseOrderByClause( + const OSQLParseNode *pParseNode) const throw(::com::sun::star::sdbc::SQLException); + sal_Bool isTableKnown(class KabResultSet *pResult) const; + void setKabFields(class KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException); + void selectAddressees(KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException); + void sortAddressees(KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException); + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const; + + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + virtual sal_Bool SAL_CALL convertFastPropertyValue( + ::com::sun::star::uno::Any & rConvertedValue, + ::com::sun::star::uno::Any & rOldValue, + sal_Int32 nHandle, + const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::lang::IllegalArgumentException); + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::uno::Exception); + virtual void SAL_CALL getFastPropertyValue( + ::com::sun::star::uno::Any& rValue, + sal_Int32 nHandle) const; + + virtual void resetParameters() const throw(::com::sun::star::sdbc::SQLException); + virtual void getNextParameter(::rtl::OUString &rParameter) const throw(::com::sun::star::sdbc::SQLException); + virtual ~KabCommonStatement(); + + public: + ::cppu::OBroadcastHelper& rBHelper; + + KabCommonStatement(KabConnection *_pConnection); + using KabCommonStatement_BASE::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >; + + // OComponentHelper + virtual void SAL_CALL disposing(); + + // XInterface + virtual void SAL_CALL release() throw(); + virtual void SAL_CALL acquire() throw(); + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( + const ::com::sun::star::uno::Type & rType + ) throw(::com::sun::star::uno::RuntimeException); + + // XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( + ) throw(::com::sun::star::uno::RuntimeException); + + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( + ) throw(::com::sun::star::uno::RuntimeException); + + // XStatement + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery( + const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL executeUpdate( + const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL execute( + const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( + ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XWarningsSupplier + virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( + ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL clearWarnings( + ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XCancellable + virtual void SAL_CALL cancel( + ) throw(::com::sun::star::uno::RuntimeException); + + // XCloseable + virtual void SAL_CALL close( + ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // other methods + inline KabConnection* getOwnConnection() const { return m_pConnection; } + }; + + //************************************************************** + // Class KabStatement + //************************************************************** + typedef ::cppu::ImplInheritanceHelper1< + KabCommonStatement, ::com::sun::star::lang::XServiceInfo > KabStatement_BASE; + + class KabStatement : public KabStatement_BASE + { + protected: + virtual ~KabStatement() { } + + public: + KabStatement(KabConnection* _pConnection); + DECLARE_SERVICE_INFO(); + }; + } +} + +#endif // _CONNECTIVITY_KAB_STATEMENT_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KTable.cxx b/connectivity/source/drivers/tdeab/KTable.cxx new file mode 100644 index 0000000..6103ce9 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KTable.cxx @@ -0,0 +1,100 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KTable.hxx" +#include "KTables.hxx" +#include "KColumns.hxx" +#include "KCatalog.hxx" + +using namespace connectivity::kab; +using namespace connectivity; +using namespace ::comphelper; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; + +// ------------------------------------------------------------------------- +KabTable::KabTable( sdbcx::OCollection* _pTables, KabConnection* _pConnection) + : KabTable_TYPEDEF(_pTables, sal_True), + m_pConnection(_pConnection) +{ + construct(); +} +// ------------------------------------------------------------------------- +KabTable::KabTable( sdbcx::OCollection* _pTables, + KabConnection* _pConnection, + const ::rtl::OUString& _Name, + const ::rtl::OUString& _Type, + const ::rtl::OUString& _Description , + const ::rtl::OUString& _SchemaName, + const ::rtl::OUString& _CatalogName + ) : KabTable_TYPEDEF(_pTables,sal_True, + _Name, + _Type, + _Description, + _SchemaName, + _CatalogName), + m_pConnection(_pConnection) +{ + construct(); +} +// ------------------------------------------------------------------------- +void KabTable::refreshColumns() +{ + TStringVector aVector; + + if (!isNew()) + { + Reference< XResultSet > xResult = m_pConnection->getMetaData()->getColumns( + Any(), + m_SchemaName, + m_Name, + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%"))); + + if (xResult.is()) + { + Reference< XRow > xRow(xResult, UNO_QUERY); + while (xResult->next()) + aVector.push_back(xRow->getString(4)); + } + } + + if (m_pColumns) + m_pColumns->reFill(aVector); + else + m_pColumns = new KabColumns(this,m_aMutex,aVector); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KTable.hxx b/connectivity/source/drivers/tdeab/KTable.hxx new file mode 100644 index 0000000..608cf18 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KTable.hxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_TABLE_HXX_ +#define _CONNECTIVITY_KAB_TABLE_HXX_ + +#include "KConnection.hxx" +#include "connectivity/sdbcx/VTable.hxx" + +namespace connectivity +{ + namespace kab + { + typedef connectivity::sdbcx::OTable KabTable_TYPEDEF; + + ::rtl::OUString getTypeString(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xColProp); + + class KabTable : public KabTable_TYPEDEF + { + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; + KabConnection* m_pConnection; + + public: + KabTable( sdbcx::OCollection* _pTables, KabConnection* _pConnection); + KabTable( sdbcx::OCollection* _pTables, + KabConnection* _pConnection, + const ::rtl::OUString& _Name, + const ::rtl::OUString& _Type, + const ::rtl::OUString& _Description = ::rtl::OUString(), + const ::rtl::OUString& _SchemaName = ::rtl::OUString(), + const ::rtl::OUString& _CatalogName = ::rtl::OUString() + ); + + KabConnection* getConnection() { return m_pConnection;} + + virtual void refreshColumns(); + + ::rtl::OUString getTableName() const { return m_Name; } + ::rtl::OUString getSchema() const { return m_SchemaName; } + }; + } +} + +#endif // _CONNECTIVITY_KAB_TABLE_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KTables.cxx b/connectivity/source/drivers/tdeab/KTables.cxx new file mode 100644 index 0000000..f63aaa9 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KTables.cxx @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "KTables.hxx" +#include "KTable.hxx" +#include "KCatalog.hxx" +#include "KConnection.hxx" +#include + +using namespace connectivity::kab; +using namespace connectivity; +using namespace ::comphelper; +using namespace ::cppu; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; + +sdbcx::ObjectType KabTables::createObject(const ::rtl::OUString& _rName) +{ + ::rtl::OUString aName,aSchema; + aSchema = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")); + aName = _rName; + + Sequence< ::rtl::OUString > aTypes(1); + aTypes[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")); + ::rtl::OUString sEmpty; + + Reference< XResultSet > xResult = m_xMetaData->getTables(Any(), aSchema, aName, aTypes); + + sdbcx::ObjectType xRet = NULL; + if (xResult.is()) + { + Reference< XRow > xRow(xResult, UNO_QUERY); + if (xResult->next()) // there can be only one table with this name + { + KabTable* pRet = new KabTable( + this, + static_cast(m_rParent).getConnection(), + aName, + xRow->getString(4), + xRow->getString(5), + sEmpty); + xRet = pRet; + } + } + ::comphelper::disposeComponent(xResult); + + return xRet; +} +// ------------------------------------------------------------------------- +void KabTables::impl_refresh( ) throw(RuntimeException) +{ + static_cast(m_rParent).refreshTables(); +} +// ------------------------------------------------------------------------- +void KabTables::disposing(void) +{ +m_xMetaData.clear(); + OCollection::disposing(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/KTables.hxx b/connectivity/source/drivers/tdeab/KTables.hxx new file mode 100644 index 0000000..8c1c036 --- /dev/null +++ b/connectivity/source/drivers/tdeab/KTables.hxx @@ -0,0 +1,65 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_TABLES_HXX_ +#define _CONNECTIVITY_KAB_TABLES_HXX_ + +#include "connectivity/sdbcx/VCollection.hxx" +#include + +namespace connectivity +{ + namespace kab + { + class KabTables : public sdbcx::OCollection + { + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; + + protected: + virtual sdbcx::ObjectType createObject(const ::rtl::OUString& _rName); + virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); + + public: + KabTables( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rMetaData, + ::cppu::OWeakObject& _rParent, + ::osl::Mutex& _rMutex, + const TStringVector &_rVector) + : sdbcx::OCollection(_rParent,sal_True,_rMutex,_rVector), + m_xMetaData(_rMetaData) + { } + + virtual void SAL_CALL disposing(void); + }; + } +} + +#endif // _CONNECTIVITY_KAB_TABLES_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/TDEInit.cxx b/connectivity/source/drivers/tdeab/TDEInit.cxx new file mode 100644 index 0000000..375b158 --- /dev/null +++ b/connectivity/source/drivers/tdeab/TDEInit.cxx @@ -0,0 +1,158 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "TDEInit.h" +#include +#include +#include + +namespace connectivity +{ + namespace kab + { + // =============================================================== + // = TDEInit + // =============================================================== + class TDEInit + { + private: + /// TDE application if we own it + static TDEApplication* s_pTDEApplication; + static bool s_bDidInsertCatalogue; + + public: + static void Init(); + static void Shutdown(); + }; + + // --------------------------------------------------------------- + TDEApplication* TDEInit::s_pTDEApplication = NULL; + bool TDEInit::s_bDidInsertCatalogue = false; + + // --------------------------------------------------------------- + void TDEInit::Init() + { + // TODO: All this is not thread-safe + + // we create a TDE application only if it is not already done + if (TDEApplication::kApplication() == NULL) + { + OSL_ENSURE(s_pTDEApplication == NULL, "TDEInit::Init: inconsistency in the application pointers!"); + + char *kabargs[1] = {(char*)"libkab1"}; + TDECmdLineArgs::init(1, kabargs, "KAddressBook", *kabargs, "Address Book driver", KAB_DRIVER_VERSION); + + s_pTDEApplication = new TDEApplication(false, false); + } + + // set language + rtl_Locale *pProcessLocale; + osl_getProcessLocale(&pProcessLocale); + // sal_Unicode and TQChar are (currently) both 16 bits characters + TQString aLanguage( + (const TQChar *) pProcessLocale->Language->buffer, + (int) pProcessLocale->Language->length); + TDEGlobal::locale()->setLanguage(aLanguage); + + // load TDE address book's localized messages + TDEGlobal::locale()->insertCatalogue("kaddressbook"); + s_bDidInsertCatalogue = true; + } + + // --------------------------------------------------------------- + void TDEInit::Shutdown() + { + if ( s_bDidInsertCatalogue ) + // this guard is necessary, since TDE 3.3 seems to crash if we remove a catalogue + // which we did not previously insert + TDEGlobal::locale()->removeCatalogue("kaddressbook"); + + if ( s_pTDEApplication != NULL ) + { + delete s_pTDEApplication; + s_pTDEApplication = NULL; + } + } + } +} + +// ======================================================================= +namespace +{ + double normalizeVersion( unsigned int major, unsigned int minor ) + { + return major + 1.0 * minor / 1000; + } +} + +// ----------------------------------------------------------------------- +extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL initTDEApplication() +{ + ::connectivity::kab::TDEInit::Init(); +} + +// ----------------------------------------------------------------------- +extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL shutdownTDEApplication() +{ + ::connectivity::kab::TDEInit::Shutdown(); +} +// ----------------------------------------------------------------------- +/** checks whether the TDE version on the system we're running at is supported + by the driver + + Has to be called before any other code from this library, in particular, + it has to be called before initTDEApplication() + + If this function returns 0, then no other code from this library + has to be called, else the results are unpredictable. + + @return +
  • 0 if the TDE version is supportednon
  • +
  • a negative value if the version is too old
  • +
  • a positive value if the version is too new to know whether it works with this driver
  • +
+ + #i60062# / 2006-01-06 / frank.schoenheit@sun.com +*/ +extern "C" SAL_DLLPUBLIC_EXPORT int SAL_CALL matchTDEVersion() +{ + double nMinVersion = normalizeVersion( MIN_TDE_VERSION_MAJOR, MIN_TDE_VERSION_MINOR ); + double nCurVersion = normalizeVersion( ::KDE::versionMajor(), ::KDE::versionMinor() ); + double nMaxVersion = normalizeVersion( MAX_TDE_VERSION_MAJOR, MAX_TDE_VERSION_MINOR ); + + if ( nCurVersion < nMinVersion ) + return -1; + if ( nCurVersion > nMaxVersion ) + return 1; + + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/TDEInit.h b/connectivity/source/drivers/tdeab/TDEInit.h new file mode 100644 index 0000000..350502d --- /dev/null +++ b/connectivity/source/drivers/tdeab/TDEInit.h @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef CONNECTIVITY_KAB_TDEINIT_H +#define CONNECTIVITY_KAB_TDEINIT_H + +// the address book driver's version +#define KAB_DRIVER_VERSION "0.2" +#define KAB_DRIVER_VERSION_MAJOR 0 +#define KAB_DRIVER_VERSION_MINOR 2 + +// the minimum TDE version which is required at runtime +#define MIN_TDE_VERSION_MAJOR 3 +#define MIN_TDE_VERSION_MINOR 2 + +#define MAX_TDE_VERSION_MAJOR 3 +#define MAX_TDE_VERSION_MINOR 6 + + +#endif // CONNECTIVITY_KAB_TDEINIT_H + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/exports.dxp b/connectivity/source/drivers/tdeab/exports.dxp new file mode 100644 index 0000000..9630d7e --- /dev/null +++ b/connectivity/source/drivers/tdeab/exports.dxp @@ -0,0 +1,3 @@ +component_getImplementationEnvironment +component_writeInfo +component_getFactory diff --git a/connectivity/source/drivers/tdeab/kcondition.cxx b/connectivity/source/drivers/tdeab/kcondition.cxx new file mode 100644 index 0000000..57d2745 --- /dev/null +++ b/connectivity/source/drivers/tdeab/kcondition.cxx @@ -0,0 +1,233 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "kcondition.hxx" +#include "kfields.hxx" +#include "connectivity/CommonTools.hxx" + +using namespace ::connectivity::kab; +using namespace ::com::sun::star::sdbc; +// ----------------------------------------------------------------------------- +KabCondition::~KabCondition() +{ +} +// ----------------------------------------------------------------------------- +KabConditionConstant::KabConditionConstant(const sal_Bool bValue) + : KabCondition(), + m_bValue(bValue) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionConstant::isAlwaysTrue() const +{ + return m_bValue; +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionConstant::isAlwaysFalse() const +{ + return !m_bValue; +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionConstant::eval(const ::TDEABC::Addressee &) const +{ + return m_bValue; +} +// ----------------------------------------------------------------------------- +KabConditionColumn::KabConditionColumn(const ::rtl::OUString &sColumnName) throw(SQLException) + : KabCondition(), + m_nFieldNumber(findKabField(sColumnName)) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionColumn::isAlwaysTrue() const +{ + // Sometimes true, sometimes false + return sal_False; +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionColumn::isAlwaysFalse() const +{ + // Sometimes true, sometimes false + return sal_False; +} +// ----------------------------------------------------------------------------- +KabConditionNull::KabConditionNull(const ::rtl::OUString &sColumnName) throw(SQLException) + : KabConditionColumn(sColumnName) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionNull::eval(const ::TDEABC::Addressee &aAddressee) const +{ + TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); + + return aQtName.isNull(); +// TDE address book currently does not use NULL values. +// But it might do it someday +} +// ----------------------------------------------------------------------------- +KabConditionNotNull::KabConditionNotNull(const ::rtl::OUString &sColumnName) throw(SQLException) + : KabConditionColumn(sColumnName) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionNotNull::eval(const ::TDEABC::Addressee &aAddressee) const +{ + TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); + + return !aQtName.isNull(); +// TDE address book currently does not use NULL values. +// But it might do it someday +} +// ----------------------------------------------------------------------------- +KabConditionCompare::KabConditionCompare(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException) + : KabConditionColumn(sColumnName), + m_sMatchString(sMatchString) +{ +} +// ----------------------------------------------------------------------------- +KabConditionEqual::KabConditionEqual(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException) + : KabConditionCompare(sColumnName, sMatchString) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionEqual::eval(const ::TDEABC::Addressee &aAddressee) const +{ + TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); +// Timestamps should not be compared according to their string value +// The syntax for such queries should be like +// {ts '2004-03-29 12:55:00.000000'} +// They should also support operators like '<' or '>=' + + if (aQtName.isNull()) return sal_False; + + ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2()); + return sValue == m_sMatchString; +} +// ----------------------------------------------------------------------------- +KabConditionDifferent::KabConditionDifferent(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException) + : KabConditionCompare(sColumnName, sMatchString) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionDifferent::eval(const ::TDEABC::Addressee &aAddressee) const +{ + TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); + + if (aQtName.isNull()) return sal_False; + + ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2()); + return sValue != m_sMatchString; +} +// ----------------------------------------------------------------------------- +KabConditionSimilar::KabConditionSimilar(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException) + : KabConditionCompare(sColumnName, sMatchString) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionSimilar::eval(const ::TDEABC::Addressee &aAddressee) const +{ + TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); + + if (aQtName.isNull()) return sal_False; + + ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2()); + return match(m_sMatchString, sValue, '\0'); +} +// ----------------------------------------------------------------------------- +KabConditionBoolean::KabConditionBoolean(KabCondition *pLeft, KabCondition *pRight) + : KabCondition(), + m_pLeft(pLeft), + m_pRight(pRight) +{ +} +// ----------------------------------------------------------------------------- +KabConditionBoolean::~KabConditionBoolean() +{ + delete m_pLeft; + delete m_pRight; +} +// ----------------------------------------------------------------------------- +KabConditionOr::KabConditionOr(KabCondition *pLeft, KabCondition *pRight) + : KabConditionBoolean(pLeft, pRight) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionOr::isAlwaysTrue() const +{ + return m_pLeft->isAlwaysTrue() || m_pRight->isAlwaysTrue(); +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionOr::isAlwaysFalse() const +{ + return m_pLeft->isAlwaysFalse() && m_pRight->isAlwaysFalse(); +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionOr::eval(const ::TDEABC::Addressee &aAddressee) const +{ + // We avoid evaluating terms as much as we can + if (m_pLeft->isAlwaysTrue() || m_pRight->isAlwaysTrue()) return sal_True; + if (m_pLeft->isAlwaysFalse() && m_pRight->isAlwaysFalse()) return sal_False; + + if (m_pLeft->eval(aAddressee)) return sal_True; + if (m_pRight->eval(aAddressee)) return sal_True; + + return sal_False; +} +// ----------------------------------------------------------------------------- +KabConditionAnd::KabConditionAnd(KabCondition *pLeft, KabCondition *pRight) + : KabConditionBoolean(pLeft, pRight) +{ +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionAnd::isAlwaysTrue() const +{ + return m_pLeft->isAlwaysTrue() && m_pRight->isAlwaysTrue(); +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionAnd::isAlwaysFalse() const +{ + return m_pLeft->isAlwaysFalse() || m_pRight->isAlwaysFalse(); +} +// ----------------------------------------------------------------------------- +sal_Bool KabConditionAnd::eval(const ::TDEABC::Addressee &aAddressee) const +{ + // We avoid evaluating terms as much as we can + if (m_pLeft->isAlwaysFalse() || m_pRight->isAlwaysFalse()) return sal_False; + if (m_pLeft->isAlwaysTrue() && m_pRight->isAlwaysTrue()) return sal_True; + + if (!m_pLeft->eval(aAddressee)) return sal_False; + if (!m_pRight->eval(aAddressee)) return sal_False; + + return sal_True; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/kcondition.hxx b/connectivity/source/drivers/tdeab/kcondition.hxx new file mode 100644 index 0000000..a8b729f --- /dev/null +++ b/connectivity/source/drivers/tdeab/kcondition.hxx @@ -0,0 +1,164 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_CONDITION_HXX_ +#define _CONNECTIVITY_KAB_CONDITION_HXX_ + +#include +#include +#include + +namespace connectivity +{ + namespace kab + { +// ----------------------------------------------------------------------------- +class KabCondition +{ + public: + virtual ~KabCondition(); + virtual sal_Bool isAlwaysTrue() const = 0; + virtual sal_Bool isAlwaysFalse() const = 0; + virtual sal_Bool eval(const ::TDEABC::Addressee &aAddressee) const = 0; +}; +// ----------------------------------------------------------------------------- +class KabConditionConstant : public KabCondition +{ + protected: + sal_Bool m_bValue; + + public: + KabConditionConstant(const sal_Bool bValue); + virtual sal_Bool isAlwaysTrue() const; + virtual sal_Bool isAlwaysFalse() const; + virtual sal_Bool eval(const ::TDEABC::Addressee &aAddressee) const; +}; +// ----------------------------------------------------------------------------- +class KabConditionColumn : public KabCondition +{ + protected: + sal_Int32 m_nFieldNumber; + + TQString value(const ::TDEABC::Addressee &aAddressee) const; + + public: + KabConditionColumn( + const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException); + virtual sal_Bool isAlwaysTrue() const; + virtual sal_Bool isAlwaysFalse() const; +}; +// ----------------------------------------------------------------------------- +class KabConditionNull : public KabConditionColumn +{ + public: + KabConditionNull( + const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException); + virtual sal_Bool eval(const ::TDEABC::Addressee &aAddressee) const; +}; +// ----------------------------------------------------------------------------- +class KabConditionNotNull : public KabConditionColumn +{ + public: + KabConditionNotNull( + const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException); + virtual sal_Bool eval(const ::TDEABC::Addressee &aAddressee) const; +}; +// ----------------------------------------------------------------------------- +class KabConditionCompare : public KabConditionColumn +{ + protected: + const ::rtl::OUString m_sMatchString; + + public: + KabConditionCompare( + const ::rtl::OUString &sColumnName, + const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException); +}; +// ----------------------------------------------------------------------------- +class KabConditionEqual : public KabConditionCompare +{ + public: + KabConditionEqual( + const ::rtl::OUString &sColumnName, + const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException); + virtual sal_Bool eval(const ::TDEABC::Addressee &aAddressee) const; +}; +// ----------------------------------------------------------------------------- +class KabConditionDifferent : public KabConditionCompare +{ + public: + KabConditionDifferent( + const ::rtl::OUString &sColumnName, + const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException); + virtual sal_Bool eval(const ::TDEABC::Addressee &aAddressee) const; +}; +// ----------------------------------------------------------------------------- +class KabConditionSimilar : public KabConditionCompare +{ + public: + KabConditionSimilar( + const ::rtl::OUString &sColumnName, + const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException); + virtual sal_Bool eval(const ::TDEABC::Addressee &aAddressee) const; +}; +// ----------------------------------------------------------------------------- +class KabConditionBoolean : public KabCondition +{ + protected: + KabCondition *m_pLeft, *m_pRight; + + public: + KabConditionBoolean(KabCondition *pLeft, KabCondition *pRight); + virtual ~KabConditionBoolean(); +}; +// ----------------------------------------------------------------------------- +class KabConditionOr : public KabConditionBoolean +{ + public: + KabConditionOr(KabCondition *pLeft, KabCondition *pRight); + virtual sal_Bool isAlwaysTrue() const; + virtual sal_Bool isAlwaysFalse() const; + virtual sal_Bool eval(const ::TDEABC::Addressee &aAddressee) const; +}; +// ----------------------------------------------------------------------------- +class KabConditionAnd : public KabConditionBoolean +{ + public: + KabConditionAnd(KabCondition *pLeft, KabCondition *pRight); + virtual sal_Bool isAlwaysTrue() const; + virtual sal_Bool isAlwaysFalse() const; + virtual sal_Bool eval(const ::TDEABC::Addressee &addressee) const; +}; +// ----------------------------------------------------------------------------- + } +} + +#endif // _CONNECTIVITY_KAB_CONDITION_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/kfields.cxx b/connectivity/source/drivers/tdeab/kfields.cxx new file mode 100644 index 0000000..2d375d7 --- /dev/null +++ b/connectivity/source/drivers/tdeab/kfields.cxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "kfields.hxx" +#include "resource/common_res.hrc" +#include "resource/sharedresources.hxx" + +using namespace ::connectivity::kab; +using namespace ::com::sun::star::sdbc; + +namespace connectivity +{ + namespace kab + { +// ----------------------------------------------------------------------------- +// return the value of a TDE address book field, given an addressee and a field number +TQString valueOfKabField(const ::TDEABC::Addressee &aAddressee, sal_Int32 nFieldNumber) +{ + switch (nFieldNumber) + { + case KAB_FIELD_REVISION: + return aAddressee.revision().toString("yyyy-MM-dd hh:mm:ss"); + default: + ::TDEABC::Field::List aFields = ::TDEABC::Field::allFields(); + return aFields[nFieldNumber - KAB_DATA_FIELDS]->value(aAddressee); + } +} +// ------------------------------------------------------------------------------ +// search the TDE address book field number of a given column name +sal_uInt32 findKabField(const ::rtl::OUString& columnName) throw(SQLException) +{ + TQString aQtName; + ::rtl::OUString aName; + + aQtName = TDEABC::Addressee::revisionLabel(); + aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); + if (columnName == aName) + return KAB_FIELD_REVISION; + + ::TDEABC::Field::List aFields = ::TDEABC::Field::allFields(); + ::TDEABC::Field::List::iterator aField; + sal_uInt32 nResult; + + for ( aField = aFields.begin(), nResult = KAB_DATA_FIELDS; + aField != aFields.end(); + ++aField, ++nResult) + { + aQtName = (*aField)->label(); + aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); + + if (columnName == aName) + return nResult; + } + + ::connectivity::SharedResources aResources; + const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( + STR_INVALID_COLUMNNAME, + "$columnname$",columnName + ) ); + ::dbtools::throwGenericSQLException(sError,NULL); + // Unreachable: + OSL_ASSERT(false); + return 0; +} +// ------------------------------------------------------------------------------ + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/kfields.hxx b/connectivity/source/drivers/tdeab/kfields.hxx new file mode 100644 index 0000000..2c5c63b --- /dev/null +++ b/connectivity/source/drivers/tdeab/kfields.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_FIELDS_HXX_ +#define _CONNECTIVITY_KAB_FIELDS_HXX_ + +#include +#include +#include + +#define KAB_FIELD_REVISION 0 +#define KAB_DATA_FIELDS 1 + +namespace connectivity +{ + namespace kab + { + TQString valueOfKabField(const ::TDEABC::Addressee &aAddressee, sal_Int32 nFieldNumber); + sal_uInt32 findKabField(const ::rtl::OUString& columnName) throw(::com::sun::star::sdbc::SQLException); + } +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/korder.cxx b/connectivity/source/drivers/tdeab/korder.cxx new file mode 100644 index 0000000..994c41f --- /dev/null +++ b/connectivity/source/drivers/tdeab/korder.cxx @@ -0,0 +1,92 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "korder.hxx" +#include "kfields.hxx" + +using namespace ::connectivity::kab; + +KabOrder::~KabOrder() +{ +} +// ----------------------------------------------------------------------------- +KabSimpleOrder::KabSimpleOrder(::rtl::OUString &sColumnName, sal_Bool bAscending) + : KabOrder(), + m_nFieldNumber(findKabField(sColumnName)), + m_bAscending(bAscending) +{ +} +// ----------------------------------------------------------------------------- +sal_Int32 KabSimpleOrder::compare(const ::TDEABC::Addressee &aAddressee1, const ::TDEABC::Addressee &aAddressee2) const +{ + sal_Int32 result; + + result = TQString::compare( + valueOfKabField(aAddressee1, m_nFieldNumber), + valueOfKabField(aAddressee2, m_nFieldNumber)); +// Timestamps should be compared differently than with their string value + + if (!m_bAscending) result = -result; + + return result; +} +// ----------------------------------------------------------------------------- +KabComplexOrder::KabComplexOrder() + : KabOrder(), + m_aOrders() +{ +} +// ----------------------------------------------------------------------------- +KabComplexOrder::~KabComplexOrder() +{ + for (sal_uInt32 i = 0; i < m_aOrders.size(); i++) + delete m_aOrders[i]; +} +// ----------------------------------------------------------------------------- +void KabComplexOrder::addOrder(KabOrder *pOrder) +{ + m_aOrders.push_back(pOrder); +} +// ----------------------------------------------------------------------------- +sal_Int32 KabComplexOrder::compare(const ::TDEABC::Addressee &aAddressee1, const ::TDEABC::Addressee &aAddressee2) const +{ + for (sal_uInt32 i = 0; i < m_aOrders.size(); i++) + { + const KabOrder *pOrder = m_aOrders[i]; + sal_Int32 result = pOrder->compare(aAddressee1, aAddressee2); + + if (result) return result; + } + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/korder.hxx b/connectivity/source/drivers/tdeab/korder.hxx new file mode 100644 index 0000000..8e62b79 --- /dev/null +++ b/connectivity/source/drivers/tdeab/korder.hxx @@ -0,0 +1,78 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_KAB_ORDER_HXX_ +#define _CONNECTIVITY_KAB_ORDER_HXX_ + +#include "rtl/ustring.hxx" +#include + +#include + +namespace connectivity +{ + namespace kab + { + class KabOrder + { + public: + virtual ~KabOrder(); + + virtual sal_Int32 compare(const ::TDEABC::Addressee &aAddressee1, const ::TDEABC::Addressee &aAddressee2) const = 0; + }; + + class KabSimpleOrder : public KabOrder + { + sal_Int32 m_nFieldNumber; + sal_Bool m_bAscending; + + TQString value(const ::TDEABC::Addressee &aAddressee) const; + public: + KabSimpleOrder(::rtl::OUString &sColumnName, sal_Bool bAscending); + + virtual sal_Int32 compare(const ::TDEABC::Addressee &aAddressee1, const ::TDEABC::Addressee &aAddressee2) const; + }; + + class KabComplexOrder : public KabOrder + { + ::std::vector m_aOrders; + + public: + KabComplexOrder(); + virtual ~KabComplexOrder(); + + void addOrder(KabOrder *pOrder); + virtual sal_Int32 compare(const ::TDEABC::Addressee &aAddressee1, const ::TDEABC::Addressee &aAddressee2) const; + }; + } +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/tdeab/makefile.mk b/connectivity/source/drivers/tdeab/makefile.mk new file mode 100644 index 0000000..cde838a --- /dev/null +++ b/connectivity/source/drivers/tdeab/makefile.mk @@ -0,0 +1,139 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# Copyright 2011 Timothy Pearson +# +# 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 +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/..$/.. +PRJINC=..$/.. +PRJNAME=connectivity +TARGET=tdeab +TARGET2=$(TARGET)drv + +ENABLE_EXCEPTIONS=TRUE +VISIBILITY_HIDDEN=TRUE + +# --- Settings ---------------------------------- + +.INCLUDE : $(PRJ)$/makefile.pmk +.INCLUDE : $(PRJ)$/version.mk + +.IF "$(GUI)" == "UNX" +.IF "$(ENABLE_TDEAB)" == "TRUE" + +CFLAGS+=$(TDE_CFLAGS) + +.IF "$(TDE_ROOT)"!="" +EXTRALIBPATHS+=-L$(TDE_ROOT)$/lib +.ENDIF + +# === TDEAB base library ========================== + +# --- Files ------------------------------------- + +SLOFILES= \ + $(SLO)$/KDriver.obj \ + $(SLO)$/KServices.obj + +DEPOBJFILES= \ + $(SLO2FILES) + +# --- Library ----------------------------------- + +SHL1VERSIONMAP=$(SOLARENV)/src/component.map + +SHL1TARGET= $(TARGET)$(TDEAB_MAJOR) +SHL1OBJS=$(SLOFILES) +SHL1STDLIBS=\ + $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(DBTOOLSLIB) \ + $(SALLIB) \ + $(SALHELPERLIB) + +SHL1DEPN= +SHL1IMPLIB= i$(TARGET) + +SHL1DEF= $(MISC)$/$(SHL1TARGET).def + +DEF1NAME= $(SHL1TARGET) + +# === TDEAB impl library ========================== + +# --- Files ------------------------------------- + +SLO2FILES=\ + $(SLO)$/KColumns.obj \ + $(SLO)$/KTable.obj \ + $(SLO)$/KTables.obj \ + $(SLO)$/KCatalog.obj \ + $(SLO)$/KResultSet.obj \ + $(SLO)$/KStatement.obj \ + $(SLO)$/KPreparedStatement.obj \ + $(SLO)$/KDatabaseMetaData.obj \ + $(SLO)$/KConnection.obj \ + $(SLO)$/KResultSetMetaData.obj \ + $(SLO)$/kcondition.obj \ + $(SLO)$/korder.obj \ + $(SLO)$/kfields.obj \ + $(SLO)$/TDEInit.obj + +TDEAB_LIB=$(TDE_LIBS) -ltdeabc + +# --- Library ----------------------------------- + +SHL2VERSIONMAP=$(TARGET2).map + +SHL2TARGET= $(TARGET2)$(TDEAB_MAJOR) +SHL2OBJS=$(SLO2FILES) +SHL2LINKFLAGS+=$(TDEAB_LIB) +SHL2STDLIBS=\ + $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(SALLIB) \ + $(SALHELPERLIB) \ + $(DBTOOLSLIB) \ + $(COMPHELPERLIB) + +SHL2DEPN= +SHL2IMPLIB= i$(TARGET2) + +SHL2DEF= $(MISC)$/$(SHL2TARGET).def + +DEF2NAME= $(SHL2TARGET) + +# --- Targets ----------------------------------- +.ELSE # "$(ENABLE_TDEAB)" == "TRUE" +dummy: + @echo TDE Addressbook disabled - nothing to build +.ENDIF + +.ELSE # "$(GUI)" == "UNX" +dummy: + @echo "Nothing to build for GUI $(GUI)" +.ENDIF + +.INCLUDE : $(PRJ)$/target.pmk + diff --git a/connectivity/source/drivers/tdeab/tdeab.xcu b/connectivity/source/drivers/tdeab/tdeab.xcu new file mode 100644 index 0000000..63b2761 --- /dev/null +++ b/connectivity/source/drivers/tdeab/tdeab.xcu @@ -0,0 +1,47 @@ + + + + + + + com.sun.star.comp.sdbc.kab.Driver + + + TDE Address Book + + + + + true + + + + + + diff --git a/connectivity/source/drivers/tdeab/tdeab.xml b/connectivity/source/drivers/tdeab/tdeab.xml new file mode 100644 index 0000000..4deb1d1 --- /dev/null +++ b/connectivity/source/drivers/tdeab/tdeab.xml @@ -0,0 +1,77 @@ + + + + kab1 + + Eric Bischoff + com.sun.star.comp.sdbc.kab.Driver + This library implements the database driver for TDE address book formats. + com.sun.star.loader.SharedLibrary + c++ + + com.sun.star.sdbc.Driver + ... + + cppuhelper + cppu + sal + + cppuhelper + cppu1 + sal1 + + com.sun.star.registry.XRegistryKey + com.sun.star.util.XCancellable + com.sun.star.util.XNumberFormatter + com.sun.star.uno.TypeClass + com.sun.star.uno.XWeak + com.sun.star.uno.XAggregation + com.sun.star.uno.XComponentContext + com.sun.star.beans.PropertyAttribute + com.sun.star.beans.XPropertyState + com.sun.star.beans.XPropertySet + com.sun.star.beans.PropertyValue + com.sun.star.beans.XMultiPropertySet + com.sun.star.beans.XFastPropertySet + com.sun.star.lang.XSingleServiceFactory + com.sun.star.lang.XTypeProvider + com.sun.star.lang.XSingleComponentFactory + com.sun.star.lang.EventObject + com.sun.star.lang.XComponent + com.sun.star.lang.IllegalArgumentException + com.sun.star.lang.DisposedException + com.sun.star.lang.XMultiServiceFactory + com.sun.star.lang.XServiceInfo + com.sun.star.lang.XUnoTunnel + com.sun.star.java.XJavaThreadRegister_11 + com.sun.star.java.XJavaVM + com.sun.star.sdbc.FetchDirection + com.sun.star.sdbc.XConnection + com.sun.star.sdbc.XStatement + com.sun.star.sdbc.XResultSet + com.sun.star.sdbc.XResultSetMetaDataSupplier + com.sun.star.sdbc.XColumnLocate + com.sun.star.sdbc.XResultSetUpdate + com.sun.star.sdbc.XWarningsSupplier + com.sun.star.sdbc.XRowUpdate + com.sun.star.sdbc.XMultipleResults + com.sun.star.sdbc.XBatchExecution + com.sun.star.sdbc.XPreparedBatchExecution + com.sun.star.sdbc.XParameters + com.sun.star.sdbc.XOutParameters + com.sun.star.sdbc.DriverPropertyInfo + com.sun.star.sdbc.SQLWarning + com.sun.star.sdbc.XRow + com.sun.star.sdbc.ColumnSearch + com.sun.star.sdbc.ColumnValue + com.sun.star.sdbc.DataType + com.sun.star.sdbc.XDriver + com.sun.star.sdbc.TransactionIsolation + com.sun.star.sdbc.ResultSetType + com.sun.star.sdbc.ResultSetConcurrency + com.sun.star.sdbcx.XRowLocate + com.sun.star.sdbcx.XDeleteRows + com.sun.star.sdbcx.CompareBookmark + com.sun.star.sdb.XColumnUpdate + com.sun.star.sdb.XColumn + diff --git a/connectivity/source/drivers/tdeab/tdeabdrv.map b/connectivity/source/drivers/tdeab/tdeabdrv.map new file mode 100644 index 0000000..2c828d8 --- /dev/null +++ b/connectivity/source/drivers/tdeab/tdeabdrv.map @@ -0,0 +1,9 @@ +UDK_3_0_0 { + global: + createKabConnection; + initTDEApplication; + shutdownTDEApplication; + matchTDEVersion; + local: + *; +}; diff --git a/connectivity/source/inc/resource/tdeab_res.hrc b/connectivity/source/inc/resource/tdeab_res.hrc new file mode 100644 index 0000000..ff6a7b2 --- /dev/null +++ b/connectivity/source/inc/resource/tdeab_res.hrc @@ -0,0 +1,44 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef CONNECTIVITY_RESOURCE_KAB_HRC +#define CONNECTIVITY_RESOURCE_KAB_HRC + +#include "resource/conn_shared_res.hrc" +#include "resource/common_res.hrc" +// ============================================================================ +// = the tdeab driver's resource strings +// ============================================================================ + +#define STR_NO_TDE_INST ( STR_KAB_BASE + 0 ) +#define STR_TDE_VERSION_TOO_OLD ( STR_KAB_BASE + 1 ) +#define STR_TDE_VERSION_TOO_NEW ( STR_KAB_BASE + 2 ) +#define STR_TDE_VERSION_TOO_NEW_WORK_AROUND ( STR_KAB_BASE + 3 ) + +#endif // CONNECTIVITY_RESOURCE_KAB_HRC + diff --git a/connectivity/version.mk b/connectivity/version.mk index fd2235c..9ff6151 100755 --- a/connectivity/version.mk +++ b/connectivity/version.mk @@ -101,6 +101,16 @@ KAB_MINOR=0 # the micro KAB_MICRO=0 +# ----------------------------Tdeab settings-------------------------------------# +# target +TDEAB_TARGET=tdeab + +# the major +TDEAB_MAJOR=1 +# the minor +TDEAB_MINOR=0 +# the micro +TDEAB_MICRO=0 # ----------------------------Macab settings-------------------------------------# # target diff --git a/cui/Library_cui.mk b/cui/Library_cui.mk index 94d8a4a..1113ab0 100644 --- a/cui/Library_cui.mk +++ b/cui/Library_cui.mk @@ -41,6 +41,7 @@ $(eval $(call gb_Library_set_include,cui,\ $(eval $(call gb_Library_add_defs,cui,\ $(if $(filter TRUE,$(ENABLE_GTK)),-DENABLE_GTK) \ $(if $(filter TRUE,$(ENABLE_KDE)),-DENABLE_KDE) \ + $(if $(filter TRUE,$(ENABLE_TDE)),-DENABLE_TDE) \ $(if $(filter TRUE,$(ENABLE_KDE4)),-DENABLE_KDE4) \ )) diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx index e08dcc7..8237c02 100644 --- a/cui/source/options/optgdlg.cxx +++ b/cui/source/options/optgdlg.cxx @@ -153,6 +153,14 @@ namespace return rtl::OUString(); #endif } + else if ( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) ) + { + #ifdef ENABLE_TDE + return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.TDEFilePicker" ); + #else + return rtl::OUString(); + #endif + } #if defined WNT return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ui.dialogs.SystemFilePicker") ); #elif (defined MACOSX && defined QUARTZ) diff --git a/desktop/Pagein_common.mk b/desktop/Pagein_common.mk index 3b0330c..e119474 100644 --- a/desktop/Pagein_common.mk +++ b/desktop/Pagein_common.mk @@ -46,6 +46,7 @@ $(eval $(call desktop_Pagein_add_libs,common,\ vclplug_gen \ $(if $(findstring TRUE,$(ENABLE_GTK)),vclplug_gtk) \ $(if $(findstring TRUE,$(ENABLE_KDE)),vclplug_kde) \ + $(if $(findstring TRUE,$(ENABLE_TDE)),vclplug_tde) \ basegfx \ sot \ xcr \ diff --git a/fpicker/prj/build.lst b/fpicker/prj/build.lst index 114a301..b4f0898f 100644 --- a/fpicker/prj/build.lst +++ b/fpicker/prj/build.lst @@ -7,8 +7,10 @@ fp fpicker\source\unx\gnome nmake - u fp_gnome_filepicker fp_inc NULL fp fpicker\source\unx\kde4 nmake - u fp_kde4_filepicker fp_inc NULL fp fpicker\source\unx\kde_unx nmake - u fp_unx_common fp_inc NULL fp fpicker\source\unx\kde nmake - u fp_unx_kde_filepicker fp_inc NULL +fp fpicker\source\unx\tde_unx nmake - u fp_unx_tdecommon fp_inc NULL +fp fpicker\source\unx\tde nmake - u fp_unx_tde_filepicker fp_inc NULL fp fpicker\source\aqua nmake - u fp_macosx_filepicker NULL fp fpicker\source\win32\filepicker nmake - w fp_win32_filepicker fp_inc NULL fp fpicker\source\win32\folderpicker nmake - w fp_win32_folderpicker fp_inc NULL fp fpicker\source\win32\misc nmake - w fp_win32_misc fp_win32_filepicker.w fp_win32_folderpicker.w fp_inc NULL -fp fpicker\util nmake - all fp_util fp_gnome_filepicker.u fp_unx_common.u fp_unx_kde_filepicker.u fp_win32_filepicker.w fp_win32_misc.w fp_win32_folderpicker.w NULL +fp fpicker\util nmake - all fp_util fp_gnome_filepicker.u fp_unx_common.u fp_unx_kde_filepicker.u fp_unx_tdecommon.u fp_unx_tde_filepicker.u fp_win32_filepicker.w fp_win32_misc.w fp_win32_folderpicker.w NULL diff --git a/fpicker/prj/d.lst b/fpicker/prj/d.lst index 71ec565..bef8b71 100644 --- a/fpicker/prj/d.lst +++ b/fpicker/prj/d.lst @@ -5,6 +5,7 @@ mkdir: %COMMON_DEST%\bin\hid ..\%__SRC%\bin\f*.res %_DEST%\bin\ ..\%__SRC%\bin\f*.dll %_DEST%\bin\ ..\%__SRC%\bin\kdefilepicker %_DEST%\bin\kdefilepicker +..\%__SRC%\bin\tdefilepicker %_DEST%\bin\tdefilepicker ..\%__SRC%\lib\f*.so %_DEST%\lib\ ..\%__SRC%\lib\*.dylib %_DEST%\lib\*.dylib diff --git a/fpicker/source/generic/fpicker.cxx b/fpicker/source/generic/fpicker.cxx index 1444fde..fa5b2ec 100644 --- a/fpicker/source/generic/fpicker.cxx +++ b/fpicker/source/generic/fpicker.cxx @@ -65,6 +65,8 @@ static OUString FilePicker_getSystemPickerServiceName() return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDEFilePicker")); else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("kde4")) return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDE4FilePicker")); + else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("tde")) + return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.TDEFilePicker")); else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("macosx")) return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.AquaFilePicker")); else @@ -141,6 +143,8 @@ static OUString FolderPicker_getSystemPickerServiceName() return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.GtkFolderPicker")); else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("kde")) return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDEFolderPicker")); + else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("tde")) + return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.TDEFolderPicker")); else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("macosx")) return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.AquaFolderPicker")); #endif diff --git a/fpicker/source/unx/kde/makefile.mk b/fpicker/source/unx/kde/makefile.mk index 1548d7b..768c946 100644 --- a/fpicker/source/unx/kde/makefile.mk +++ b/fpicker/source/unx/kde/makefile.mk @@ -29,8 +29,8 @@ PRJ=..$/..$/.. PRJNAME=fpicker TARGET=kdefilepicker -LIBTARGET=NO ENABLE_EXCEPTIONS=TRUE +LIBTARGET=NO EXTERNAL_WARNINGS_NOT_ERRORS=TRUE # --- Settings ----------------------------------------------------- @@ -63,7 +63,7 @@ SLOFILES =\ APP1TARGET=$(TARGET) APP1OBJS=$(SLOFILES) -APP1RPATH=OOO +APP1RPATH=BRAND APP1LINKFLAGS=$(KDE_LIBS) -ltdeio -lX11 APP1STDLIBS=$(SALLIB) diff --git a/fpicker/source/unx/tde/makefile.mk b/fpicker/source/unx/tde/makefile.mk new file mode 100644 index 0000000..26d7979 --- /dev/null +++ b/fpicker/source/unx/tde/makefile.mk @@ -0,0 +1,78 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2010 Novell, Inc. +# Copyright 2011 Timothy Pearson +# +# 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 +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/..$/.. + +PRJNAME=fpicker +TARGET=tdefilepicker +ENABLE_EXCEPTIONS=TRUE +LIBTARGET=NO +EXTERNAL_WARNINGS_NOT_ERRORS=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# ------------------------------------------------------------------ + +.IF "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE" + +dummy: + @echo "Nothing to build. GUIBASE == $(GUIBASE), ENABLE_TDE is not set" + +.ELSE # we build for TDE + +CFLAGS+= $(TDE_CFLAGS) + +.IF "$(COM)" == "GCC" +CFLAGSCXX+=-Wno-shadow +.ENDIF + +# --- Files -------------------------------------------------------- + +SLOFILES =\ + $(SLO)$/tdecommandthread.obj \ + $(SLO)$/tdefilepicker.obj \ + $(SLO)$/tdefilepicker.moc.obj \ + $(SLO)$/tdefpmain.obj \ + $(SLO)$/tdemodalityfilter.obj + +APP1TARGET=$(TARGET) +APP1OBJS=$(SLOFILES) +APP1RPATH=OOO +APP1LINKFLAGS=$(TDE_LIBS) -ltdeio -lX11 +APP1STDLIBS=$(SALLIB) + +.ENDIF # "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE" + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + +$(MISC)$/tdefilepicker.moc.cxx : tdefilepicker.hxx + $(MOC) $< -o $@ diff --git a/fpicker/source/unx/tde/tdecommandthread.cxx b/fpicker/source/unx/tde/tdecommandthread.cxx new file mode 100644 index 0000000..8da50d2 --- /dev/null +++ b/fpicker/source/unx/tde/tdecommandthread.cxx @@ -0,0 +1,183 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include + +#include + +#include + +#include + +#if OSL_DEBUG_LEVEL > 1 +#include +#endif + +////////////////////////////////////////////////////////////////////////// +// CommandEvent +////////////////////////////////////////////////////////////////////////// + +TDECommandEvent::TDECommandEvent( const TQString &qCommand, TQStringList *pStringList ) + : TQCustomEvent( TypeId, pStringList ), + m_eCommand( Unknown ) +{ + struct { + const char *pName; + CommandEventType eType; + } *pIdx, pMapping[] = + { + { "appendControl", AppendControl }, + { "enableControl", EnableControl }, + { "getValue", GetValue }, + { "setValue", SetValue }, + { "appendFilter", AppendFilter }, + { "appendFilterGroup", AppendFilterGroup }, + { "getCurrentFilter", GetCurrentFilter }, + { "setCurrentFilter", SetCurrentFilter }, + { "getDirectory", GetDirectory }, + { "setDirectory", SetDirectory }, + { "getFiles", GetFiles }, + { "setTitle", SetTitle }, + { "setType", SetType }, + { "setDefaultName", SetDefaultName }, + { "setMultiSelection", SetMultiSelection }, + { "exec", Exec }, + { 0, Unknown } + }; + + for ( pIdx = pMapping; pIdx->pName && qCommand != pIdx->pName; ++pIdx ) + ; + + m_eCommand = pIdx->eType; +} + +////////////////////////////////////////////////////////////////////////// +// CommandThread +////////////////////////////////////////////////////////////////////////// + +TDECommandThread::TDECommandThread( TQWidget *pObject ) + : m_pObject( pObject ) +{ +} + +TDECommandThread::~TDECommandThread() +{ +} + +void TDECommandThread::run() +{ + TQTextIStream qStream( stdin ); + qStream.setEncoding( TQTextStream::UnicodeUTF8 ); + + TQString qLine; + bool bQuit = false; + while ( !bQuit && !qStream.atEnd() ) + { + qLine = qStream.readLine(); + handleCommand( qLine, bQuit ); + } +} + +void TDECommandThread::handleCommand( const TQString &rString, bool &bQuit ) +{ + TQMutexLocker qMutexLocker( &m_aMutex ); + +#if OSL_DEBUG_LEVEL > 1 + ::std::cerr << "tdefilepicker received: " << rString.latin1() << ::std::endl; +#endif + + bQuit = false; + TQStringList *pTokens = tokenize( rString ); + + if ( !pTokens ) + return; + if ( pTokens->empty() ) + { + delete pTokens, pTokens = NULL; + return; + } + + TQString qCommand = pTokens->front(); + pTokens->pop_front(); + + if ( qCommand == "exit" ) + { + bQuit = true; + kapp->exit(); + kapp->wakeUpGuiThread(); + _exit(0); // FIXME This prevents a SIGABRT on some systems Why? + } + else + kapp->postEvent( m_pObject, new TDECommandEvent( qCommand, pTokens ) ); +} + +TQStringList* TDECommandThread::tokenize( const TQString &rString ) +{ + // Commands look like: + // command arg1 arg2 arg3 ... + // Args may be enclosed in '"', if they contain spaces. + + TQStringList *pList = new TQStringList(); + + TQString qBuffer; + qBuffer.reserve( 1024 ); + + const TQChar *pUnicode = rString.unicode(); + const TQChar *pEnd = pUnicode + rString.length(); + bool bQuoted = false; + + for ( ; pUnicode != pEnd; ++pUnicode ) + { + if ( *pUnicode == '\\' ) + { + ++pUnicode; + if ( pUnicode != pEnd ) + { + if ( *pUnicode == 'n' ) + qBuffer.append( '\n' ); + else + qBuffer.append( *pUnicode ); + } + } + else if ( *pUnicode == '"' ) + bQuoted = !bQuoted; + else if ( *pUnicode == ' ' && !bQuoted ) + { + pList->push_back( qBuffer ); + qBuffer.setLength( 0 ); + } + else + qBuffer.append( *pUnicode ); + } + pList->push_back( qBuffer ); + + return pList; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde/tdecommandthread.hxx b/fpicker/source/unx/tde/tdecommandthread.hxx new file mode 100644 index 0000000..8697de9 --- /dev/null +++ b/fpicker/source/unx/tde/tdecommandthread.hxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _TDECOMMANDTHREAD_HXX_ +#define _TDECOMMANDTHREAD_HXX_ + +#include +#include +#include + +class TDECommandEvent : public TQCustomEvent +{ +public: + enum CommandEventType { + Unknown = 0, + + AppendControl, + EnableControl, + GetValue, + SetValue, + + AppendFilter, + AppendFilterGroup, + UpdateFilters, + GetCurrentFilter, + SetCurrentFilter, + + GetDirectory, + SetDirectory, + + GetFiles, + + SetTitle, + SetType, + SetDefaultName, + SetMultiSelection, + + Exec + }; + static const TQEvent::Type TypeId = (TQEvent::Type) ( (int) TQEvent::User + 42 /*random magic value*/ ); + +protected: + CommandEventType m_eCommand; + +public: + TDECommandEvent( const TQString &qCommand, TQStringList *pStringList ); + + CommandEventType command() const { return m_eCommand; } + TQStringList* stringList() { return static_cast< TQStringList* >( data() ); } +}; + +class TDECommandThread : public TQThread +{ +protected: + TQObject *m_pObject; + + TQMutex m_aMutex; + +public: + TDECommandThread( TQWidget *pObject ); + virtual ~TDECommandThread(); + + virtual void run(); + +protected: + void handleCommand( const TQString &rString, bool &bQuit ); + TQStringList* tokenize( const TQString &rString ); +}; + +#endif // _TDECOMMANDTHREAD_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde/tdefilepicker.cxx b/fpicker/source/unx/tde/tdefilepicker.cxx new file mode 100644 index 0000000..46ab20d --- /dev/null +++ b/fpicker/source/unx/tde/tdefilepicker.cxx @@ -0,0 +1,735 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef TQT_NO_EMIT +#define emit +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +////////////////////////////////////////////////////////////////////////// +// TDEFileDialog +////////////////////////////////////////////////////////////////////////// + +TDEFileDialog::TDEFileDialog( const TQString &startDir, const TQString &filter, + TQWidget *parent, const char *name ) + : KFileDialog( startDir, filter, parent, name, true, m_pCustomWidget = new TQVBox() ), + m_pCombosAndButtons( new TQHBox( m_pCustomWidget ) ), + m_pLabels( new TQVBox( m_pCombosAndButtons ) ), + m_pComboBoxes( new TQVBox( m_pCombosAndButtons ) ), + m_pPushButtons( new TQVBox( m_pCombosAndButtons ) ), + m_pCheckBoxes( new TQGrid( 2, m_pCustomWidget ) ), + m_bIsSave( false ), + m_bIsExecuting( false ), + m_bCanNotifySelection( true ) +{ + connect( this, TQT_SIGNAL( fileHighlighted( const TQString & ) ), + this, TQT_SLOT( fileHighlightedCommand( const TQString & ) ) ); + + connect( this, TQT_SIGNAL( selectionChanged() ), + this, TQT_SLOT( selectionChangedCommand() ) ); + + m_pCustomWidget->setSpacing( KDialog::spacingHint() ); + m_pCombosAndButtons->setSpacing( KDialog::spacingHint() ); + + updateCustomWidgetLayout(); +} + +TDEFileDialog::~TDEFileDialog() +{ +} + +void TDEFileDialog::resizeEvent( TQResizeEvent *pEvent ) +{ + KFileDialog::resizeEvent( pEvent ); + + updateCustomWidgetLayout(); +} + +void TDEFileDialog::showEvent( TQShowEvent *pEvent ) +{ + KFileDialog::showEvent( pEvent ); + + updateCustomWidgetLayout(); +} + +void TDEFileDialog::updateCustomWidgetLayout() +{ + TQPoint qReferencePoint = filterWidget->mapTo( this, TQPoint( 0, 0 ) ); + TQPoint qCustomPoint = m_pCustomWidget->mapTo( this, TQPoint( 0, 0 ) ); + + int nLeft = qReferencePoint.x() - qCustomPoint.x(); + int nRight = m_pCustomWidget->width() - filterWidget->width() - nLeft; + + nLeft -= KDialog::spacingHint(); + nRight -= KDialog::spacingHint(); + m_pLabels->setFixedWidth( ( nLeft > 0 )? nLeft: 80 ); + // FIXME The following call sets the width of m_pPushButtons all right, + // but it also increases the width of m_pComboBoxes rapidly. Can we do + // anything about it? + m_pPushButtons->setFixedWidth( ( nRight > 0 )? nRight: 100 ); +} + +void TDEFileDialog::customEvent( TQCustomEvent *pEvent ) +{ + if ( pEvent && pEvent->type() == TDECommandEvent::TypeId ) + { + TDECommandEvent *pCommandEvent = static_cast< TDECommandEvent* >( pEvent ); + TQStringList *pStringList = pCommandEvent->stringList(); + + int nListSize = -1; + if ( pStringList ) + nListSize = pStringList->size(); + + switch ( pCommandEvent->command() ) + { + case TDECommandEvent::AppendControl: + if ( nListSize >= 3 ) + { + appendControl( (*pStringList)[0], (*pStringList)[1], (*pStringList)[2] ); + } + break; + case TDECommandEvent::EnableControl: + if ( nListSize >= 2 ) + { + enableControl( (*pStringList)[0], (*pStringList)[1] ); + } + break; + case TDECommandEvent::GetValue: + if ( nListSize >= 2 ) + { + getValue( (*pStringList)[0], (*pStringList)[1] ); + } + break; + case TDECommandEvent::SetValue: + if ( nListSize >= 2 ) + { + TQStringList qStringList = (*pStringList); + qStringList.pop_front(); + qStringList.pop_front(); + + setValue( (*pStringList)[0], (*pStringList)[1], qStringList ); + } + break; + case TDECommandEvent::AppendFilter: + if ( nListSize >= 2 ) + { + appendFilter( (*pStringList)[0], (*pStringList)[1] ); + + // update the filters widget + setFilter( filters() ); + } + break; + case TDECommandEvent::AppendFilterGroup: + if ( nListSize >= 1 ) + { + TQStringList::const_iterator it = pStringList->begin(); + ++it; // We ignore the filter group name + + while ( it != pStringList->end() ) + { + TQString qTitle = *it; + ++it; + if ( it != pStringList->end() ) + { + appendFilter( qTitle, (*it) ); + ++it; + } + } + + // update the filters widget + setFilter( filters() ); + } + break; + case TDECommandEvent::GetCurrentFilter: + { + TQString qCurrentFilter = filterWidget->currentText(); + sendCommand( "currentFilter " + escapeString( qCurrentFilter ) ); + } + break; + case TDECommandEvent::SetCurrentFilter: + if ( nListSize >= 1 ) + { + static_cast< TDEFileFilterComboHack* >( filterWidget )->setCurrentFilter( pStringList->front() ); + } + break; + case TDECommandEvent::GetDirectory: + { + TQString qDirectory = baseURL().url(); + if ( qDirectory.startsWith( "file:/" ) && qDirectory.mid( 6, 1 ) != "/" ) + qDirectory.replace( "file:/", "file:///" ); + sendCommand( "currentDirectory " + escapeString( qDirectory ) ); + } + break; + case TDECommandEvent::SetDirectory: + if ( nListSize >= 1 ) + { + setURL( pStringList->front() ); + } + break; + case TDECommandEvent::GetFiles: + { + TQString qString; + qString.reserve( 1024 ); + + qString.append( "files" ); + + if ( result() == TQDialog::Accepted ) + { + KURL::List qList( selectedURLs() ); + for ( KURL::List::const_iterator it = qList.begin(); it != qList.end(); ++it ) + appendURL( qString, (*it) ); + } + else + { + // we have to return the selected files anyway + const KFileItemList *pItems = ops->selectedItems(); + for ( KFileItemListIterator it( *pItems ); it.current(); ++it ) + appendURL( qString, (*it)->url() ); + } + + sendCommand( qString ); + setCanNotifySelection( true ); + } + break; + case TDECommandEvent::SetTitle: + if ( nListSize >= 1 ) + { + setCaption( pStringList->front() ); + } + break; + case TDECommandEvent::SetType: + if ( nListSize >= 1 ) + { + TQString qType( pStringList->front() ); + if ( qType == "open" ) + { + setIsSave( false ); + setCaption( i18n( "Open" ) ); + } + else if ( qType == "save" ) + { + setIsSave( true ); + setCaption( i18n( "Save As" ) ); + } + } + break; + case TDECommandEvent::SetDefaultName: + if ( nListSize >= 1 ) + { + setKeepLocation( true ); + setSelection( pStringList->front() ); + } + break; + case TDECommandEvent::SetMultiSelection: + if ( nListSize >= 1 ) + { + if ( pStringList->front() == "true" ) + setMode( KFile::Files ); + else + setMode( KFile::File ); + } + break; + case TDECommandEvent::Exec: + { + filterWidget->setEditable( false ); + setIsExecuting( true ); + bool bCanExit = false; + do { + setCanNotifySelection( true ); + exec(); + + KURL qLocalSelectedURL = mostLocalURL( selectedURL() ); + TQString qProtocol( qLocalSelectedURL.protocol() ); + + if ( isSave() && result() == TQDialog::Accepted ) + { + if ( qProtocol == "file" ) + { + TQString qFileName( addExtension( qLocalSelectedURL.path() ) ); + bCanExit = + !QFile::exists( qFileName ) || + ( KMessageBox::warningYesNo( 0, + i18n( "A file named \"%1\" already exists. " + "Are you sure you want to overwrite it?" ).arg( qFileName ), + i18n( "Overwrite File?" ), + i18n( "Overwrite" ), KStdGuiItem::cancel() ) == KMessageBox::Yes ); + } + else if ( !isSupportedProtocol( qProtocol ) ) + { + KMessageBox::sorry( 0, + i18n( "Saving using protocol \"%1\" is not supported." ).arg( qProtocol ) ); + bCanExit = false; + } + else + bCanExit = true; + } + else if ( !isSave() && result() == TQDialog::Accepted && !isSupportedProtocol( qProtocol ) ) + { + KMessageBox::information( 0, + i18n( "Protocol \"%1\" is supported only partially. " + "Local copy of the file will be created." ).arg( qProtocol ) ); + bCanExit = true; + } + else + bCanExit = true; + } while ( !bCanExit ); + setIsExecuting( false ); + + if ( result() == TQDialog::Accepted ) + sendCommand( "accept" ); + else + sendCommand( "reject" ); + } + break; + default: + break; + } + + // FIXME Some cleanup of pEvent? delete something, etc.? + } +} + +void TDEFileDialog::appendControl( const TQString &rId, const TQString &rType, const TQString &rTitle ) +{ + TQString qLabel( rTitle ); + qLabel.replace( '~', '&' ); + + if ( rType == "checkbox" ) + { + TQCheckBox *pCheckBox = new TQCheckBox( qLabel, m_pCheckBoxes, rId.utf8() ); + + pCheckBox->setEnabled( true ); + pCheckBox->setChecked( false ); + } + else if ( rType == "listbox" ) + { + TQLabel *pComboLabel = new TQLabel( qLabel, m_pLabels ); + TQComboBox *pComboBox = new TQComboBox( m_pComboBoxes, rId.utf8() ); + + pComboLabel->setBuddy( pComboBox ); + pComboBox->setEnabled( true ); + } + else if ( rType == "pushbutton" ) + { + TQPushButton *pPushButton = new TQPushButton( qLabel, m_pPushButtons, rId.utf8() ); + pPushButton->setEnabled( true ); + } +} + +TQWidget* TDEFileDialog::findControl( const TQString &rId ) const +{ + TQObjectList *pList = m_pCustomWidget->queryList(); + TQCString qName( rId.utf8() ); + TQObjectList::const_iterator it = pList->begin(); + + for ( ; it != pList->end() && qName != (*it)->name(); ++it ) + ; + + TQWidget *pWidget = NULL; + if ( it != pList->end() ) + pWidget = static_cast< TQWidget* >( *it ); + + delete pList; + + return pWidget; +} + +void TDEFileDialog::enableControl( const TQString &rId, const TQString &rValue ) +{ + TQWidget *pWidget = findControl( rId ); + + if ( pWidget ) + pWidget->setEnabled( rValue.lower() == "true" ); +} + +void TDEFileDialog::getValue( const TQString &rId, const TQString &rAction ) +{ + TQWidget *pWidget = findControl( rId ); + TQString qString; + qString.reserve( 1024 ); + qString.append( "value" ); + + if ( pWidget ) + { + TQCString qClassName = pWidget->className(); + if ( qClassName == TQCHECKBOX_OBJECT_NAME_STRING ) + { + TQCheckBox *pCheckBox = static_cast< TQCheckBox* >( pWidget ); + + if ( pCheckBox->isChecked() ) + qString.append( " bool true" ); + else + qString.append( " bool false" ); + } + else if ( qClassName == TQCOMBOBOX_OBJECT_NAME_STRING ) + { + TQComboBox *pComboBox = static_cast< TQComboBox* >( pWidget ); + if ( rAction == "getItems" ) + { + qString.append( " stringList" ); + for ( int nIdx = 0; nIdx < pComboBox->count(); ++nIdx ) + { + qString.append( ' ' ); + appendEscaped( qString, pComboBox->text( nIdx ) ); + } + } + else if ( rAction == "getSelectedItem" ) + { + qString.append( " string " ); + appendEscaped( qString, pComboBox->currentText() ); + } + else if ( rAction == "getSelectedItemIndex" ) + { + qString.append( " int " ); + qString.append( TQString().setNum( pComboBox->currentItem() ) ); + } + // TODO getHelpURL + } + // TODO push button + } + + sendCommand( qString ); +} + +void TDEFileDialog::setValue( const TQString &rId, const TQString &rAction, const TQStringList &rValue ) +{ + TQWidget *pWidget = findControl( rId ); + + if ( pWidget ) + { + TQCString qClassName = pWidget->className(); + if ( qClassName == TQCHECKBOX_OBJECT_NAME_STRING ) + { + TQCheckBox *pCheckBox = static_cast< TQCheckBox* >( pWidget ); + + bool bValue = ( !rValue.isEmpty() ) && ( rValue.front().lower() == "true" ); + pCheckBox->setChecked( bValue ); + } + else if ( qClassName == TQCOMBOBOX_OBJECT_NAME_STRING ) + { + TQComboBox *pComboBox = static_cast< TQComboBox* >( pWidget ); + if ( rAction == "addItem" ) + { + if ( !rValue.isEmpty() ) + pComboBox->insertItem( rValue.front() ); + } + else if ( rAction == "addItems" ) + { + pComboBox->insertStringList( rValue ); + } + else if ( rAction == "deleteItem" ) + { + if ( !rValue.isEmpty() ) + pComboBox->removeItem( rValue.front().toInt() ); + } + else if ( rAction == "deleteItems" ) + { + pComboBox->clear(); + } + else if ( rAction == "setSelectedItem" ) + { + if ( !rValue.isEmpty() ) + pComboBox->setCurrentItem( rValue.front().toInt() ); + } + // FIXME setHelpURL is ignored + } + // TODO push button + } +} + +void TDEFileDialog::appendFilter( const TQString &rTitle, const TQString &rFilter ) +{ + // Filters are separated by ';' + TQString qFilter( rFilter ); + qFilter.replace( TQChar( ';' ), TQChar( ' ' ) ).replace( "*.*", "*" ); + + // Workaround for too wide (*.bmp;...) entry + TQString qTitle( rTitle ); + qTitle.replace( TQRegExp( "^<([^>]*)> \\(.*" ), "<\\1>" ); + + m_aFilters.push_back( qMakePair( qTitle, qFilter ) ); +} + +TQString TDEFileDialog::filters() const +{ + TQString qString, qTmp; + bool bFirstFilter = true; + + for ( FilterList::const_iterator it = m_aFilters.begin(); it != m_aFilters.end(); ++it ) + { + if ( bFirstFilter ) + bFirstFilter = false; + else + qString.append( '\n' ); + + qString.append( (*it).second ); + qString.append( '|' ); + + qTmp = (*it).first; + qString.append( qTmp.replace( '/', "\\/" ) ); + } + + return qString; +} + +TQString TDEFileDialog::addExtension( const TQString &rFileName ) const +{ + if ( !isSave() ) + return rFileName; + + TQString qExtension; + + TQWidget *pExtensionWidget = findControl( "100" ); // CHECKBOX_AUTOEXTENSION + TQCheckBox *pExtensionCB = pExtensionWidget? static_cast< TQCheckBox* >( pExtensionWidget->qt_cast( TQCHECKBOX_OBJECT_NAME_STRING ) ): NULL; + if ( pExtensionCB && pExtensionCB->isChecked() ) + { + // FIXME: qFilter can be a MIME; we ignore it now... + TQStringList qFilterList = TQStringList::split( " ", currentFilter() ); + for ( TQStringList::const_iterator it = qFilterList.begin(); + qExtension.isEmpty() && it != qFilterList.end(); + ++it ) + { + int nUnwanted = (*it).findRev( '*' ); + if ( nUnwanted < 0 ) + nUnwanted = (*it).findRev( '?' ); + else + nUnwanted = ::std::max( nUnwanted, (*it).find( '?', nUnwanted ) ); + + int nIdx = (*it).find( '.', ::std::max( nUnwanted, 0 ) ); + if ( nIdx >= 0 ) + qExtension = (*it).mid( nIdx ).lower(); + } + } + + if ( qExtension.isEmpty() || qExtension == "." || rFileName.endsWith( qExtension ) ) + return rFileName; + else + return rFileName + qExtension; +} + +bool TDEFileDialog::isSupportedProtocol( const TQString &rProtocol ) const +{ + // TODO Get this information directly from OOo + const char * pOOoProtocols[] = { "", "smb", "ftp", "http", "file", "mailto", + "vnd.sun.star.webdav", "news", "private", "vnd.sun.star.help", + "https", "slot", "macro", "javascript", "imap", "pop3", "data", + "cid", "out", "vnd.sun.star.wfs", "vnd.sun.star.hier", "vim", + ".uno", ".component", "vnd.sun.star.pkg", "ldap", "db", + "vnd.sun.star.cmd", "vnd.sun.star.script", "vnd.sun.star.odma", + "telnet", + NULL }; + + for ( const char **pIndex = pOOoProtocols; *pIndex != NULL; ++pIndex ) + { + if ( rProtocol == *pIndex ) + return true; + } + + // TODO gnome-vfs bits here + + return false; +} + +KURL TDEFileDialog::mostLocalURL( const KURL &rURL ) const +{ +#if KDE_IS_VERSION(3,5,0) + KURL qMostLocalURL( TDEIO::NetAccess::mostLocalURL( rURL, const_cast( this ) ) ); + if ( qMostLocalURL.isLocalFile() ) + return qMostLocalURL; + else + { + // Terrible hack to get even non-existing media:// files right + qMostLocalURL.cd( ".." ); + KURL qMostLocalPath( TDEIO::NetAccess::mostLocalURL( qMostLocalURL, const_cast( this ) ) ); + if ( qMostLocalPath.isLocalFile() ) + { + qMostLocalPath.addPath( rURL.fileName() ); + return qMostLocalPath; + } + } +#endif + + return rURL; +} + +TQString TDEFileDialog::localCopy( const TQString &rFileName ) const +{ + // 106 == MIB enum for UTF-8 + KURL qLocalURL = mostLocalURL( KURL( rFileName, 106 ) ); + if ( qLocalURL.isLocalFile() ) + return qLocalURL.url(); + + int nExtensionPos = rFileName.findRev( '/' ); + if ( nExtensionPos >= 0 ) + nExtensionPos = rFileName.find( '.', nExtensionPos ); + else + nExtensionPos = rFileName.find( '.' ); + + KTempFile qTempFile( TQString::null, ( nExtensionPos < 0 )? TQString(): rFileName.mid( nExtensionPos ) ); + KURL qDestURL; + qDestURL.setPath( qTempFile.name() ); + + if ( !TDEIO::NetAccess::file_copy( rFileName, qDestURL, 0600, true, false, NULL ) ) + { + KMessageBox::error( 0, TDEIO::NetAccess::lastErrorString() ); + return TQString::null; + } + + return qDestURL.url(); +} + +void TDEFileDialog::fileHighlightedCommand( const TQString & ) +{ + if ( canNotifySelection() ) + { + sendCommand( "fileSelectionChanged" ); + setCanNotifySelection( false ); + } +} + +void TDEFileDialog::selectionChangedCommand() +{ + if ( canNotifySelection() ) + { + sendCommand( "fileSelectionChanged" ); + setCanNotifySelection( false ); + } +} + +void TDEFileDialog::sendCommand( const TQString &rCommand ) +{ +#if OSL_DEBUG_LEVEL > 1 + ::std::cerr << "tdefilepicker sent: " << rCommand.latin1() << ::std::endl; +#endif + + //m_aOutputStream << rCommand << endl; + ::std::cout << rCommand.utf8() << ::std::endl; +} + +void TDEFileDialog::appendURL( TQString &rBuffer, const KURL &rURL ) +{ + // From Martin Kretzschmar: + // file:///path/to/test%E0.odt is not a valid URL from OOo's point of + // view. (?Most modern parts of?) OOo assume(s) that the URL contains only + // ASCII characters (which test%E0.odt does) and is UTF-8 after unescaping + // (which file:///path/test%E0.odt is not). + // Cf. the comment in sal/inc/osl/file.h. + // 106 == MIB enum for UTF-8 + TQString qUrlStr = addExtension( rURL.url( 0, 106 ) ); + + if ( !isExecuting() && !isSupportedProtocol( rURL.protocol() ) ) + qUrlStr = localCopy( qUrlStr ); + + if ( qUrlStr.startsWith( "file:/" ) && qUrlStr.mid( 6, 1 ) != "/" ) + qUrlStr.replace( "file:/", "file:///" ); + + rBuffer.append( " " ); + if ( !qUrlStr.isEmpty() ) + appendEscaped( rBuffer, qUrlStr ); +} + +void TDEFileDialog::appendEscaped( TQString &rBuffer, const TQString &rString ) +{ + const TQChar *pUnicode = rString.unicode(); + const TQChar *pEnd = pUnicode + rString.length(); + + rBuffer.append( '"' ); + for ( ; pUnicode != pEnd; ++pUnicode ) + { + if ( *pUnicode == '\\' ) + rBuffer.append( "\\\\" ); + else if ( *pUnicode == '"' ) + rBuffer.append( "\\\"" ); + else if ( *pUnicode == '\n' ) + rBuffer.append( "\\\n" ); + else + rBuffer.append( *pUnicode ); + } + rBuffer.append( '"' ); +} + +TQString TDEFileDialog::escapeString( const TQString &rString ) +{ + TQString qString; + qString.reserve( 2*rString.length() + 2 ); // every char escaped + quotes + + appendEscaped( qString, rString ); + + return qString; +} + + +void TDEFileFilterComboHack::setCurrentFilter( const TQString& filter ) +{ + setCurrentText( filter ); + filterChanged(); + + // Workaround for 'Filter name (*.blah)' vs. 'Filter name' + if ( currentText() != text( currentItem() ) ) + { + int nItem = 0; + for ( ; nItem < count() && !text( nItem ).startsWith( filter ); ++nItem ); + + if ( nItem < count() ) + setCurrentItem( nItem ); + else + setCurrentItem( 0 ); + + filterChanged(); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde/tdefilepicker.hxx b/fpicker/source/unx/tde/tdefilepicker.hxx new file mode 100644 index 0000000..f411db5 --- /dev/null +++ b/fpicker/source/unx/tde/tdefilepicker.hxx @@ -0,0 +1,128 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _TDEFILEPICKER_HXX_ +#define _TDEFILEPICKER_HXX_ + +#include + +#include +#include + +class TQGrid; +class TQHBox; +class TQVBox; + +class TDEFileDialog : public KFileDialog +{ + Q_OBJECT + +protected: + typedef TQPair< TQString, TQString > FilterEntry; + typedef TQValueList< FilterEntry > FilterList; + + TQVBox *m_pCustomWidget; + TQHBox *m_pCombosAndButtons; + + TQVBox *m_pLabels; + TQVBox *m_pComboBoxes; + TQVBox *m_pPushButtons; + + TQGrid *m_pCheckBoxes; + + FilterList m_aFilters; + + /** Are we a "Save As" dialog? + * + * We cannot use KFileDialog::setOperationMode() here, because then + * it automatically adds an "Automatically select filename extension" + * check box, and completely destroys the dialog's layout + * (custom list boxes are under this check box, which looks ugly). + */ + bool m_bIsSave; + bool m_bIsExecuting; + + bool m_bCanNotifySelection; + +public: + TDEFileDialog( const TQString &startDir, const TQString &filter, + TQWidget *parent, const char *name ); + virtual ~TDEFileDialog(); + +protected: + virtual void resizeEvent( TQResizeEvent *pEvent ); + virtual void showEvent( TQShowEvent *pEvent ); + void updateCustomWidgetLayout(); + + virtual void customEvent( TQCustomEvent *pEvent ); + +protected: + void appendControl( const TQString &rId, const TQString &rType, const TQString &rTitle ); + TQWidget* findControl( const TQString &rId ) const; + void enableControl( const TQString &rId, const TQString &rValue ); + void getValue( const TQString &rId, const TQString &rAction ); + void setValue( const TQString &rId, const TQString &rAction, const TQStringList &rValue ); + + void appendFilter( const TQString &rTitle, const TQString &rFilter ); + TQString filters() const; + TQString addExtension( const TQString &rFileName ) const; + + void setIsSave( bool bIsSave ) { m_bIsSave = bIsSave; } + bool isSave( void ) const { return m_bIsSave; } + + void setIsExecuting( bool bIsExecuting ) { m_bIsExecuting = bIsExecuting; } + bool isExecuting( void ) const { return m_bIsExecuting; } + + bool isSupportedProtocol( const TQString &rProtocol ) const; + KURL mostLocalURL( const KURL &rURL ) const; + TQString localCopy( const TQString &rFileName ) const; + + void setCanNotifySelection( bool bCanNotifySelection ) { m_bCanNotifySelection = bCanNotifySelection; } + bool canNotifySelection( void ) const { return m_bCanNotifySelection; } + +protected slots: + void fileHighlightedCommand( const TQString & ); + void selectionChangedCommand(); + +protected: + void sendCommand( const TQString &rCommand ); + void appendURL( TQString &rBuffer, const KURL &rURL ); + void appendEscaped( TQString &rBuffer, const TQString &rString ); + TQString escapeString( const TQString &rString ); +}; + +class TDEFileFilterComboHack : public KFileFilterCombo +{ +public: + void setCurrentFilter( const TQString& filter ); +}; + +#endif // _TDEFILEPICKER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde/tdefpmain.cxx b/fpicker/source/unx/tde/tdefpmain.cxx new file mode 100644 index 0000000..eb20aa3 --- /dev/null +++ b/fpicker/source/unx/tde/tdefpmain.cxx @@ -0,0 +1,95 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +////////////////////////////////////////////////////////////////////////// +// Main +////////////////////////////////////////////////////////////////////////// + +static TDECmdLineOptions sOptions[] = +{ + { "winid ", I18N_NOOP("Window ID to which is the fpicker modal"), "0" }, + TDECmdLineLastOption +}; + +int main( int argc, char* argv[] ) +{ + // we fake the name of the application to have "OpenOffice.org" in the + // title + TDEAboutData qAboutData( "tdefilepicker", I18N_NOOP( "OpenOffice.org" ), + "0.1", I18N_NOOP( "tdefilepicker is an implementation of the TDE file dialog for OpenOffice.org." ), + TDEAboutData::License_LGPL, + "(c) 2004, Jan Holesovsky" ); + qAboutData.addAuthor( "Jan Holesovsky", I18N_NOOP("Original author and current maintainer"), "kendy@openoffice.org" ); + + // Let the user see that this does something... + ::std::cerr << "tdefilepicker, an implementation of TDE file dialog for OOo." << ::std::endl + << "Type 'exit' and press Enter to finish." << ::std::endl; + + TDECmdLineArgs::addCmdLineOptions( sOptions ); + TDECmdLineArgs::init( argc, argv, &qAboutData ); + + TDELocale::setMainCatalogue( "kdialog" ); + + TDEApplication kApplication; + + // Setup the modality + TDECmdLineArgs *pArgs = TDECmdLineArgs::parsedArgs(); + long nWinId = atol( pArgs->getOption( "winid" ) ); + pArgs->clear(); + + TDEModalityFilter qModalityFilter( nWinId ); + + TDEFileDialog aFileDialog( NULL, TQString(), NULL, "tdefiledialog" ); + + TDECommandThread qCommandThread( &aFileDialog ); + qCommandThread.start(); + + kApplication.exec(); + + qCommandThread.wait(); + + ::std::cout << "exited" << ::std::endl; + + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde/tdemodalityfilter.cxx b/fpicker/source/unx/tde/tdemodalityfilter.cxx new file mode 100644 index 0000000..6ced314 --- /dev/null +++ b/fpicker/source/unx/tde/tdemodalityfilter.cxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include + +#include + +#include +#include + +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// +// Modality filter +////////////////////////////////////////////////////////////////////////// + +TDEModalityFilter::TDEModalityFilter( WId nWinId ) + : m_nWinId( nWinId ) +{ + kapp->installEventFilter( this ); +} + +TDEModalityFilter::~TDEModalityFilter() +{ + kapp->removeEventFilter( this ); +} + +bool TDEModalityFilter::eventFilter( TQObject *pObject, TQEvent *pEvent ) +{ + if ( pObject->isWidgetType() && pEvent->type() == TQEvent::Show ) + { + KDialogBase* pDlg = ::qt_cast< KDialogBase* >( pObject ); + if ( pDlg != NULL && m_nWinId != 0 ) + { + XSetTransientForHint( qt_xdisplay(), pDlg->winId(), m_nWinId ); + m_nWinId = 0; + } + } + return false; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde/tdemodalityfilter.hxx b/fpicker/source/unx/tde/tdemodalityfilter.hxx new file mode 100644 index 0000000..b00f9a3 --- /dev/null +++ b/fpicker/source/unx/tde/tdemodalityfilter.hxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _TDEMODALITYFILTER_HXX_ +#define _TDEMODALITYFILTER_HXX_ + +#include + +class TDEModalityFilter : public TQObject +{ +private: + WId m_nWinId; + +public: + TDEModalityFilter( WId nWinId ); + virtual ~TDEModalityFilter(); + + virtual bool eventFilter( TQObject *pObject, TQEvent *pEvent ); +}; + +#endif // _TDEMODALITYFILTER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/FPServiceInfo.hxx b/fpicker/source/unx/tde_unx/FPServiceInfo.hxx new file mode 100644 index 0000000..2dcbe6d --- /dev/null +++ b/fpicker/source/unx/tde_unx/FPServiceInfo.hxx @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _FPSERVICEINFO_HXX_ +#define _FPSERVICEINFO_HXX_ + +// the service names +#define FILE_PICKER_SERVICE_NAME "com.sun.star.ui.dialogs.TDEFilePicker" + +// the implementation names +#define FILE_PICKER_IMPL_NAME "com.sun.star.ui.dialogs.UnxFilePicker" + +// the registry key names +// a key under which this service will be registered, +// Format: -> "/ImplName/UNO/SERVICES/ServiceName" +// +#define FILE_PICKER_REGKEY_NAME "/com.sun.star.ui.dialogs.UnxFilePicker/UNO/SERVICES/com.sun.star.ui.dialogs.TDEFilePicker" + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/UnxCommandThread.cxx b/fpicker/source/unx/tde_unx/UnxCommandThread.cxx new file mode 100644 index 0000000..e6ae0bb --- /dev/null +++ b/fpicker/source/unx/tde_unx/UnxCommandThread.cxx @@ -0,0 +1,315 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include +#include + +#include +#include + +#include +#include +#include + +using namespace ::com::sun::star; + +////////////////////////////////////////////////////////////////////////// +// UnxFilePickerCommandThread +////////////////////////////////////////////////////////////////////////// + +UnxFilePickerCommandThread::UnxFilePickerCommandThread( UnxFilePickerNotifyThread *pNotifyThread, int nReadFD ) + : m_pNotifyThread( pNotifyThread ), + m_nReadFD( nReadFD ) +{ +} + +UnxFilePickerCommandThread::~UnxFilePickerCommandThread() +{ +} + +sal_Bool SAL_CALL UnxFilePickerCommandThread::result() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_aResult; +} + +::rtl::OUString SAL_CALL UnxFilePickerCommandThread::getCurrentFilter() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_aGetCurrentFilter; +} + +::rtl::OUString SAL_CALL UnxFilePickerCommandThread::getDirectory() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_aGetDirectory; +} + +uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePickerCommandThread::getFiles() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + sal_Int32 nSize = m_aGetFiles.size(); + uno::Sequence< ::rtl::OUString > aFiles( ( nSize > 1 )? nSize + 1: nSize ); + + if ( nSize == 1 ) + aFiles[0] = m_aGetFiles.front(); + else if ( nSize > 1 ) + { + // First entry in the sequence must be the dirname, the others are the + // filenames, so we have to rearrange the list... + + ::rtl::OUString aFront = m_aGetFiles.front(); + sal_Int32 nLastSlash = aFront.lastIndexOf( '/' ); + + aFiles[0] = ( nLastSlash >= 0 )? aFront.copy( 0, nLastSlash ): ::rtl::OUString(); + ++nLastSlash; + + sal_Int32 nIdx = 1; + for ( ::std::list< ::rtl::OUString >::const_iterator it = m_aGetFiles.begin(); + it != m_aGetFiles.end(); ++it, ++nIdx ) + { + sal_Int32 nLength = (*it).getLength() - nLastSlash; + aFiles[nIdx] = ( nLength >= 0 )? (*it).copy( nLastSlash, nLength ): ::rtl::OUString(); + } + } + + return aFiles; +} + +uno::Any SAL_CALL UnxFilePickerCommandThread::getValue() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_aGetValue; +} + +void SAL_CALL UnxFilePickerCommandThread::run() +{ + if ( m_nReadFD < 0 ) + return; + + sal_Int32 nBufferSize = 1024; // 1 is for testing, 1024 for real use + sal_Char *pBuffer = new sal_Char[nBufferSize]; + sal_Char *pBufferEnd = pBuffer + nBufferSize; + + sal_Char *pWhereToRead = pBuffer; + sal_Char *pEntryBegin = pBuffer; + sal_Int32 nBytesRead = 0; + sal_Bool bShouldExit = sal_False; + while ( !bShouldExit && ( nBytesRead = read( m_nReadFD, pWhereToRead, pBufferEnd - pWhereToRead ) ) > 0 ) + { + sal_Bool bFoundNL = sal_False; + sal_Char *pWhereToReadEnd = pWhereToRead + nBytesRead; + sal_Char *pEntryEnd = pWhereToRead; + do { + for ( ; pEntryEnd < pWhereToReadEnd && *pEntryEnd != '\n'; ++pEntryEnd ) + ; + + if ( pEntryEnd < pWhereToReadEnd ) + { + bFoundNL = sal_True; + *pEntryEnd = 0; + + if ( strcmp( pEntryBegin, "exited" ) == 0 ) + bShouldExit = sal_True; + else + handleCommand( ::rtl::OUString( pEntryBegin, pEntryEnd - pEntryBegin, RTL_TEXTENCODING_UTF8 )/*, bQuit*/ ); + + pEntryBegin = pEntryEnd + 1; + } + } while ( pEntryEnd < pWhereToReadEnd ); + + if ( bFoundNL ) + { + if ( pEntryBegin < pBufferEnd ) + memmove( pBuffer, pEntryBegin, pWhereToReadEnd - pEntryBegin ); + } + else + { + // enlarge the buffer size + nBufferSize *= 2; + sal_Char *pNewBuffer = new sal_Char[nBufferSize]; + if ( pEntryBegin < pBufferEnd ) + memmove( pNewBuffer, pEntryBegin, pWhereToReadEnd - pEntryBegin ); + + delete[] pBuffer; + pBuffer = pNewBuffer; + pBufferEnd = pBuffer + nBufferSize; + } + + pWhereToRead = pBuffer + ( pWhereToReadEnd - pEntryBegin ); + pEntryBegin = pBuffer; + } +} + +void SAL_CALL UnxFilePickerCommandThread::handleCommand( const ::rtl::OUString &rCommand ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + +#if OSL_DEBUG_LEVEL > 0 + ::std::cerr << "UnxFilePicker received: \"" << + OUStringToOString( rCommand, RTL_TEXTENCODING_ASCII_US ).getStr() << "\"" << ::std::endl; +#endif + + ::std::list< ::rtl::OUString > aList = tokenize( rCommand ); + + if ( aList.size() == 0 ) + return; + + ::rtl::OUString aCommandName = aList.front(); + aList.pop_front(); + + if ( aCommandName.equalsAscii( "accept" ) ) + { + m_aResult = sal_True; + m_aExecCondition.set(); + } + else if ( aCommandName.equalsAscii( "reject" ) ) + { + m_aResult = sal_False; + m_aExecCondition.set(); + } + else if ( aCommandName.equalsAscii( "fileSelectionChanged" ) ) + { + if ( m_pNotifyThread ) + m_pNotifyThread->fileSelectionChanged(); + } + else if ( aCommandName.equalsAscii( "files" ) ) + { + m_aGetFiles = aList; + m_aGetFilesCondition.set(); + } + else if ( aCommandName.equalsAscii( "value" ) ) + { + ::rtl::OUString aType; + if ( !aList.empty() ) + { + aType = aList.front(); + aList.pop_front(); + } + + if ( aType.equalsAscii( "bool" ) ) + { + sal_Bool bValue = !aList.empty() && aList.front().equalsIgnoreAsciiCaseAscii( "true" ); + + m_aGetValue <<= bValue; + m_aGetValueCondition.set(); + } + else if ( aType.equalsAscii( "int" ) ) + { + sal_Int32 nValue = 0; + if ( !aList.empty() ) + nValue = aList.front().toInt32(); + + m_aGetValue <<= nValue; + m_aGetValueCondition.set(); + } + else if ( aType.equalsAscii( "string" ) ) + { + ::rtl::OUString aValue; + if ( !aList.empty() ) + aValue = aList.front(); + + m_aGetValue <<= aValue; + m_aGetValueCondition.set(); + } + else if ( aType.equalsAscii( "stringList" ) ) + { + uno::Sequence< ::rtl::OUString > aSequence( aList.size() ); + sal_Int32 nIdx = 0; + for ( ::std::list< ::rtl::OUString >::const_iterator it = aList.begin(); it != aList.end(); ++it, ++nIdx ) + aSequence[nIdx] = (*it); + + m_aGetValue <<= aSequence; + m_aGetValueCondition.set(); + } + else + { + m_aGetValue = uno::Any(); + m_aGetValueCondition.set(); + } + } + else if ( aCommandName.equalsAscii( "currentFilter" ) ) + { + m_aGetCurrentFilter = aList.empty()? ::rtl::OUString(): aList.front(); + m_aGetCurrentFilterCondition.set(); + } + else if ( aCommandName.equalsAscii( "currentDirectory" ) ) + { + m_aGetDirectory = aList.empty()? ::rtl::OUString(): aList.front(); + m_aGetDirectoryCondition.set(); + } + else + { +#if OSL_DEBUG_LEVEL > 0 + ::std::cerr << "Unrecognized command: " + << OUStringToOString( aCommandName, RTL_TEXTENCODING_ASCII_US ).getStr() << "\"" << ::std::endl; +#endif + } +} + +::std::list< ::rtl::OUString > SAL_CALL UnxFilePickerCommandThread::tokenize( const ::rtl::OUString &rCommand ) +{ + ::std::list< ::rtl::OUString > aList; + ::rtl::OUStringBuffer aBuffer( 1024 ); + + const sal_Unicode *pUnicode = rCommand.getStr(); + const sal_Unicode *pEnd = pUnicode + rCommand.getLength(); + sal_Bool bQuoted = sal_False; + + for ( ; pUnicode != pEnd; ++pUnicode ) + { + if ( *pUnicode == '\\' ) + { + ++pUnicode; + if ( pUnicode != pEnd ) + { + if ( *pUnicode == 'n' ) + aBuffer.appendAscii( "\n", 1 ); + else + aBuffer.append( *pUnicode ); + } + } + else if ( *pUnicode == '"' ) + bQuoted = !bQuoted; + else if ( *pUnicode == ' ' && !bQuoted ) + aList.push_back( aBuffer.makeStringAndClear() ); + else + aBuffer.append( *pUnicode ); + } + aList.push_back( aBuffer.makeStringAndClear() ); + + return aList; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/UnxCommandThread.hxx b/fpicker/source/unx/tde_unx/UnxCommandThread.hxx new file mode 100644 index 0000000..41b82bd --- /dev/null +++ b/fpicker/source/unx/tde_unx/UnxCommandThread.hxx @@ -0,0 +1,136 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _UNXCOMMANDTHREAD_HXX_ +#define _UNXCOMMANDTHREAD_HXX_ + +#include +#include + +#include +#include +#include +#include + +#include + +#include + +class UnxFilePickerNotifyThread; + +/** Synchronization for the 'thread-less' version of the fpicker. + + Something like osl::Condition, but calls Application::Yield() while in + wait(). +*/ +class YieldingCondition +{ + ::osl::Mutex m_aMutex; + bool m_bValue; + + bool get() + { + ::osl::MutexGuard aGuard( m_aMutex ); + return m_bValue; + } + +public: + YieldingCondition() { reset(); } + + void reset() + { + ::osl::MutexGuard aGuard( m_aMutex ); + m_bValue = false; + } + + void set() + { + ::osl::MutexGuard aGuard( m_aMutex ); + m_bValue = true; + } + + void wait() + { + while ( !get() ) + Application::Yield(); + } +}; + +class UnxFilePickerCommandThread : public ::osl::Thread +{ +protected: + UnxFilePickerNotifyThread *m_pNotifyThread; + int m_nReadFD; + + ::osl::Mutex m_aMutex; + + YieldingCondition m_aExecCondition; + sal_Bool m_aResult; + + ::osl::Condition m_aGetCurrentFilterCondition; + ::rtl::OUString m_aGetCurrentFilter; + + ::osl::Condition m_aGetDirectoryCondition; + ::rtl::OUString m_aGetDirectory; + + ::osl::Condition m_aGetFilesCondition; + ::std::list< ::rtl::OUString > m_aGetFiles; + + ::osl::Condition m_aGetValueCondition; + ::com::sun::star::uno::Any m_aGetValue; + +public: + UnxFilePickerCommandThread( UnxFilePickerNotifyThread *pNotifyThread, int nReadFD ); + ~UnxFilePickerCommandThread(); + + YieldingCondition& SAL_CALL execCondition() { return m_aExecCondition; } + sal_Bool SAL_CALL result(); + + ::osl::Condition& SAL_CALL getCurrentFilterCondition() { return m_aGetCurrentFilterCondition; } + ::rtl::OUString SAL_CALL getCurrentFilter(); + + ::osl::Condition& SAL_CALL getDirectoryCondition() { return m_aGetDirectoryCondition; } + ::rtl::OUString SAL_CALL getDirectory(); + + ::osl::Condition& SAL_CALL getFilesCondition() { return m_aGetFilesCondition; } + ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getFiles(); + + ::osl::Condition& SAL_CALL getValueCondition() { return m_aGetValueCondition; } + ::com::sun::star::uno::Any SAL_CALL getValue(); + +protected: + virtual void SAL_CALL run(); + + virtual void SAL_CALL handleCommand( const ::rtl::OUString &rCommand/*, sal_Bool &rQuit*/ ); + ::std::list< ::rtl::OUString > SAL_CALL tokenize( const ::rtl::OUString &rCommand ); +}; + +#endif // _UNXCOMMANDTHREAD_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/UnxFPentry.cxx b/fpicker/source/unx/tde_unx/UnxFPentry.cxx new file mode 100644 index 0000000..bd4582d --- /dev/null +++ b/fpicker/source/unx/tde_unx/UnxFPentry.cxx @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include + +#include +#include + +#include "UnxFilePicker.hxx" +#include "FPServiceInfo.hxx" + +using namespace ::rtl; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::registry; +using namespace ::cppu; +using ::com::sun::star::ui::dialogs::XFilePicker; + +////////////////////////////////////////////////////////////////////////// +// +////////////////////////////////////////////////////////////////////////// + +static Reference< XInterface > SAL_CALL createInstance( const Reference< XMultiServiceFactory >& rServiceManager ) +{ + return Reference< XInterface >( + static_cast< XFilePicker* >( new UnxFilePicker( rServiceManager ) ) ); +} + +extern "C" +{ + +sal_Bool SAL_CALL component_writeInfo( void* /*pServiceManager*/, void* pRegistryKey ) +{ + sal_Bool bRetVal = sal_True; + + if ( pRegistryKey ) + { + try + { + Reference< XRegistryKey > pXNewKey( static_cast< XRegistryKey* >( pRegistryKey ) ); + pXNewKey->createKey( OUString(RTL_CONSTASCII_USTRINGPARAM( FILE_PICKER_REGKEY_NAME ) )); + } + catch( InvalidRegistryException& ) + { + OSL_FAIL( "InvalidRegistryException caught" ); + bRetVal = sal_False; + } + } + + return bRetVal; +} + +////////////////////////////////////////////////////////////////////////// +// +////////////////////////////////////////////////////////////////////////// + +SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( const sal_Char* pImplName, uno_Interface* pSrvManager, uno_Interface* /*pRegistryKey*/ ) +{ + void* pRet = 0; + + if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, FILE_PICKER_IMPL_NAME ) ) ) +// if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, FILE_PICKER_SERVICE_NAME ) ) ) + { + Sequence< OUString > aSNS( 1 ); + aSNS.getArray( )[0] = OUString(RTL_CONSTASCII_USTRINGPARAM( FILE_PICKER_SERVICE_NAME )); + + Reference< XSingleServiceFactory > xFactory ( createSingleFactory( + reinterpret_cast< XMultiServiceFactory* > ( pSrvManager ), + OUString::createFromAscii( pImplName ), + createInstance, + aSNS ) ); + if ( xFactory.is() ) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + + return pRet; +} + +} // extern "C" + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/UnxFilePicker.cxx b/fpicker/source/unx/tde_unx/UnxFilePicker.cxx new file mode 100644 index 0000000..c2a5ca8 --- /dev/null +++ b/fpicker/source/unx/tde_unx/UnxFilePicker.cxx @@ -0,0 +1,932 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +using namespace ::com::sun::star; + +using namespace ::com::sun::star::ui::dialogs; +using namespace ::com::sun::star::ui::dialogs::TemplateDescription; + +////////////////////////////////////////////////////////////////////////// +// helper functions +////////////////////////////////////////////////////////////////////////// + +namespace +{ + // controling event notifications + const bool STARTUP_SUSPENDED = true; + const bool STARTUP_ALIVE = false; + + uno::Sequence SAL_CALL FilePicker_getSupportedServiceNames() + { + uno::Sequence aRet(3); + aRet[0] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.FilePicker"); + aRet[1] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFilePicker"); + aRet[2] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.TDEFilePicker"); + return aRet; + } +} + +////////////////////////////////////////////////////////////////////////// +// UnxFilePicker +////////////////////////////////////////////////////////////////////////// + +UnxFilePicker::UnxFilePicker( const uno::Reference& xServiceMgr ) + : cppu::WeakComponentImplHelper8< + XFilterManager, + XFilterGroupManager, + XFilePickerControlAccess, + XFilePickerNotifier, +// TODO XFilePreview, + lang::XInitialization, + util::XCancellable, + lang::XEventListener, + lang::XServiceInfo>( m_rbHelperMtx ), + m_xServiceMgr( xServiceMgr ), + m_nFilePickerPid( -1 ), + m_nFilePickerWrite( -1 ), + m_nFilePickerRead( -1 ), + m_pNotifyThread( NULL ), + m_pCommandThread( NULL ), + m_pResMgr( CREATEVERSIONRESMGR( fps_office ) ) +{ +} + +UnxFilePicker::~UnxFilePicker() +{ + if ( m_nFilePickerPid > 0 ) + { + sendCommand( ::rtl::OUString::createFromAscii( "exit" ) ); + waitpid( m_nFilePickerPid, NULL, 0 ); + } + + if ( m_pCommandThread ) + { + m_pCommandThread->join(); + + delete m_pCommandThread, m_pCommandThread = NULL; + } + + if ( m_pNotifyThread ) + { + m_pNotifyThread->exit(); + + m_pNotifyThread->join(); + + delete m_pNotifyThread, m_pNotifyThread = NULL; + } + + if ( m_nFilePickerWrite >= 0 ) + close( m_nFilePickerWrite ); + + if ( m_nFilePickerRead >= 0 ) + close( m_nFilePickerRead ); + + delete m_pResMgr, m_pResMgr = NULL; +} + +void SAL_CALL UnxFilePicker::addFilePickerListener( const uno::Reference& xListener ) + throw( uno::RuntimeException ) +{ + OSL_ASSERT( m_pNotifyThread ); + osl::MutexGuard aGuard( m_aMutex ); + + m_pNotifyThread->addFilePickerListener( xListener ); +} + +void SAL_CALL UnxFilePicker::removeFilePickerListener( const uno::Reference& xListener ) + throw( uno::RuntimeException ) +{ + OSL_ASSERT( m_pNotifyThread ); + osl::MutexGuard aGuard( m_aMutex ); + + m_pNotifyThread->removeFilePickerListener( xListener ); +} + +void SAL_CALL UnxFilePicker::setTitle( const rtl::OUString &rTitle ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "setTitle " ); + appendEscaped( aBuffer, rTitle ); + + sendCommand( aBuffer.makeStringAndClear() ); +} + +sal_Int16 SAL_CALL UnxFilePicker::execute() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + + // this is _not_ an osl::Condition, see i#93366 + m_pCommandThread->execCondition().reset(); + + sendCommand( ::rtl::OUString::createFromAscii( "exec" ) ); + + m_pCommandThread->execCondition().wait(); + + return m_pCommandThread->result(); +} + +void SAL_CALL UnxFilePicker::setMultiSelectionMode( sal_Bool bMode ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUString aString = bMode? + ::rtl::OUString::createFromAscii( "setMultiSelection true" ): + ::rtl::OUString::createFromAscii( "setMultiSelection false" ); + + sendCommand( aString ); +} + +void SAL_CALL UnxFilePicker::setDefaultName( const ::rtl::OUString &rName ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "setDefaultName " ); + appendEscaped( aBuffer, rName ); + + sendCommand( aBuffer.makeStringAndClear() ); +} + +void SAL_CALL UnxFilePicker::setDisplayDirectory( const rtl::OUString &rDirectory ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "setDirectory " ); + appendEscaped( aBuffer, rDirectory ); + + sendCommand( aBuffer.makeStringAndClear() ); +} + +rtl::OUString SAL_CALL UnxFilePicker::getDisplayDirectory() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + sendCommand( ::rtl::OUString::createFromAscii( "getDirectory" ), + m_pCommandThread->getDirectoryCondition() ); + + return m_pCommandThread->getDirectory(); +} + +uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePicker::getFiles() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + sendCommand( ::rtl::OUString::createFromAscii( "getFiles" ), + m_pCommandThread->getFilesCondition() ); + + return m_pCommandThread->getFiles(); +} + +void SAL_CALL UnxFilePicker::appendFilter( const ::rtl::OUString &rTitle, const ::rtl::OUString &rFilter ) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "appendFilter " ); + appendEscaped( aBuffer, rTitle ); + aBuffer.appendAscii( " ", 1 ); + appendEscaped( aBuffer, rFilter ); + + sendCommand( aBuffer.makeStringAndClear() ); +} + +void SAL_CALL UnxFilePicker::setCurrentFilter( const rtl::OUString &rTitle ) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "setCurrentFilter " ); + appendEscaped( aBuffer, rTitle ); + + sendCommand( aBuffer.makeStringAndClear() ); +} + +rtl::OUString SAL_CALL UnxFilePicker::getCurrentFilter() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + sendCommand( ::rtl::OUString::createFromAscii( "getCurrentFilter" ), + m_pCommandThread->getCurrentFilterCondition() ); + + return m_pCommandThread->getCurrentFilter(); +} + +void SAL_CALL UnxFilePicker::appendFilterGroup( const rtl::OUString &rGroupTitle, const uno::Sequence &rFilters ) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "appendFilterGroup " ); + appendEscaped( aBuffer, rGroupTitle ); + + for ( sal_Int32 i = 0; i < rFilters.getLength(); ++i ) + { + beans::StringPair aPair = rFilters[i]; + + aBuffer.appendAscii( " ", 1 ); + appendEscaped( aBuffer, aPair.First ); + aBuffer.appendAscii( " ", 1 ); + appendEscaped( aBuffer, aPair.Second ); + } + + sendCommand( aBuffer.makeStringAndClear() ); +} + +void SAL_CALL UnxFilePicker::setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const uno::Any &rValue ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUString aType; + ::rtl::OUString aAction; + sal_Int32 nTitleId; + + if ( controlIdInfo( nControlId, aType, nTitleId ) && controlActionInfo( nControlAction, aAction ) ) + { + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "setValue " ); + aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); + aBuffer.appendAscii( " ", 1 ); + aBuffer.append( aAction ); + + if ( aType.equalsAscii( "checkbox" ) ) + { + sal_Bool bControlValue; + if ( ( rValue >>= bControlValue ) && bControlValue ) + aBuffer.appendAscii( " true" ); + else + aBuffer.appendAscii( " false" ); + } + else if ( aType.equalsAscii( "listbox" ) ) + { + switch ( nControlAction ) + { + case ControlActions::ADD_ITEM: + case ControlActions::SET_HELP_URL: + { + ::rtl::OUString aString; + if ( rValue >>= aString ) + { + aBuffer.appendAscii( " ", 1 ); + appendEscaped( aBuffer, aString ); + } + } + break; + + case ControlActions::ADD_ITEMS: + { + uno::Sequence< ::rtl::OUString > aSequence; + if ( rValue >>= aSequence ) + { + for ( sal_Int32 nIdx = 0; nIdx < aSequence.getLength(); ++nIdx ) + { + aBuffer.appendAscii( " ", 1 ); + appendEscaped( aBuffer, aSequence[nIdx] ); + } + + } + } + break; + + case ControlActions::DELETE_ITEM: + case ControlActions::SET_SELECT_ITEM: + { + sal_Int32 nInt; + if ( rValue >>= nInt ) + { + aBuffer.appendAscii( " ", 1 ); + aBuffer.append( nInt ); + } + } + break; + + default: + // nothing + break; + } + } + // TODO else if push button... + + sendCommand( aBuffer.makeStringAndClear() ); + } +} + +uno::Any SAL_CALL UnxFilePicker::getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUString aAction; + + if ( controlActionInfo( nControlAction, aAction ) ) + { + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "getValue " ); + aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); + aBuffer.appendAscii( " ", 1 ); + aBuffer.append( aAction ); + + sendCommand( aBuffer.makeStringAndClear(), + m_pCommandThread->getValueCondition() ); + + return m_pCommandThread->getValue(); + } + + return uno::Any(); +} + +void SAL_CALL UnxFilePicker::enableControl( sal_Int16 nControlId, sal_Bool bEnable ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "enableControl " ); + aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); + aBuffer.appendAscii( bEnable? " true": " false" ); + + sendCommand( aBuffer.makeStringAndClear() ); +} + +void SAL_CALL UnxFilePicker::setLabel( sal_Int16 nControlId, const ::rtl::OUString &rLabel ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "setLabel " ); + aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); + aBuffer.appendAscii( " ", 1 ); + appendEscaped( aBuffer, rLabel ); + + sendCommand( aBuffer.makeStringAndClear() ); +} + +rtl::OUString SAL_CALL UnxFilePicker::getLabel(sal_Int16 /*nControlId*/) + throw ( uno::RuntimeException ) +{ + // FIXME getLabel() is not yet implemented + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + // TODO return m_pImpl->getLabel(nControlId); + return ::rtl::OUString(); +} + +/* TODO +uno::Sequence SAL_CALL UnxFilePicker::getSupportedImageFormats() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_pImpl->getSupportedImageFormats(); +} + +sal_Int32 SAL_CALL UnxFilePicker::getTargetColorDepth() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_pImpl->getTargetColorDepth(); +} + +sal_Int32 SAL_CALL UnxFilePicker::getAvailableWidth() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_pImpl->getAvailableWidth(); +} + +sal_Int32 SAL_CALL UnxFilePicker::getAvailableHeight() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_pImpl->getAvailableHeight(); +} + +void SAL_CALL UnxFilePicker::setImage( sal_Int16 aImageFormat, const uno::Any &rImage ) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + m_pImpl->setImage( aImageFormat, aImage ); +} + +sal_Bool SAL_CALL UnxFilePicker::setShowState( sal_Bool bShowState ) + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_pImpl->setShowState( bShowState ); +} + +sal_Bool SAL_CALL UnxFilePicker::getShowState() + throw( uno::RuntimeException ) +{ + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + return m_pImpl->getShowState(); +} +*/ + +void SAL_CALL UnxFilePicker::initialize( const uno::Sequence &rArguments ) + throw( uno::Exception, uno::RuntimeException ) +{ + initFilePicker(); + + // parameter checking + uno::Any aAny; + if ( 0 == rArguments.getLength( ) ) + throw lang::IllegalArgumentException( + rtl::OUString::createFromAscii( "no arguments" ), + static_cast< XFilePicker* >( this ), 1 ); + + aAny = rArguments[0]; + + if ( ( aAny.getValueType() != ::getCppuType( (sal_Int16*)0 ) ) && ( aAny.getValueType() != ::getCppuType( (sal_Int8*)0 ) ) ) + throw lang::IllegalArgumentException( + rtl::OUString::createFromAscii( "invalid argument type" ), + static_cast< XFilePicker* >( this ), 1 ); + + sal_Int16 templateId = -1; + aAny >>= templateId; + + ::rtl::OUString aTypeOpen = ::rtl::OUString::createFromAscii( "setType \"open\"" ); + ::rtl::OUString aTypeSaveAs = ::rtl::OUString::createFromAscii( "setType \"save\"" ); + + switch ( templateId ) + { + case FILEOPEN_SIMPLE: + sendCommand( aTypeOpen ); + break; + + case FILESAVE_SIMPLE: + sendCommand( aTypeSaveAs ); + break; + + case FILESAVE_AUTOEXTENSION_PASSWORD: + sendCommand( aTypeSaveAs ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD ); + break; + + case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS: + sendCommand( aTypeSaveAs ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD ); + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS ); + break; + + case FILESAVE_AUTOEXTENSION_SELECTION: + sendCommand( aTypeSaveAs ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_SELECTION ); + break; + + case FILESAVE_AUTOEXTENSION_TEMPLATE: + sendCommand( aTypeSaveAs ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); + sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE ); + break; + + case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE: + sendCommand( aTypeOpen ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_LINK ); + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW ); + sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE ); + break; + + case FILEOPEN_PLAY: + sendCommand( aTypeOpen ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::PUSHBUTTON_PLAY ); + break; + + case FILEOPEN_READONLY_VERSION: + sendCommand( aTypeOpen ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_READONLY ); + sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_VERSION ); + break; + + case FILEOPEN_LINK_PREVIEW: + sendCommand( aTypeOpen ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_LINK ); + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW ); + break; + + case FILESAVE_AUTOEXTENSION: + sendCommand( aTypeSaveAs ); + + sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); + break; + + default: + throw lang::IllegalArgumentException( + rtl::OUString::createFromAscii( "Unknown template" ), + static_cast< XFilePicker* >( this ), + 1 ); + } +} + +void SAL_CALL UnxFilePicker::cancel() + throw ( uno::RuntimeException ) +{ + // FIXME cancel() is not implemented + checkFilePicker(); + ::osl::MutexGuard aGuard( m_aMutex ); + + // TODO m_pImpl->cancel(); +} + +void SAL_CALL UnxFilePicker::disposing( const lang::EventObject &rEvent ) + throw( uno::RuntimeException ) +{ + uno::Reference xFilePickerListener( rEvent.Source, uno::UNO_QUERY ); + + if ( xFilePickerListener.is() ) + removeFilePickerListener( xFilePickerListener ); +} + +rtl::OUString SAL_CALL UnxFilePicker::getImplementationName() + throw( uno::RuntimeException ) +{ + return rtl::OUString::createFromAscii( FILE_PICKER_IMPL_NAME ); +} + +sal_Bool SAL_CALL UnxFilePicker::supportsService( const rtl::OUString& ServiceName ) + throw( uno::RuntimeException ) +{ + uno::Sequence< ::rtl::OUString > SupportedServicesNames = FilePicker_getSupportedServiceNames(); + + for ( sal_Int32 n = SupportedServicesNames.getLength(); n--; ) + { + if ( SupportedServicesNames[n].compareTo( ServiceName ) == 0 ) + return sal_True; + } + + return sal_False; +} + +uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePicker::getSupportedServiceNames() + throw( uno::RuntimeException ) +{ + return FilePicker_getSupportedServiceNames(); +} + +void UnxFilePicker::initFilePicker() +{ + int aFiledesStdin[2], aFiledesStdout[2]; + if ( pipe( aFiledesStdin ) < 0 || pipe( aFiledesStdout ) < 0 ) + return; + + m_nFilePickerPid = fork(); + if ( m_nFilePickerPid < 0 ) + return; + + if ( m_nFilePickerPid == 0 ) + { + // Child... + close( aFiledesStdin[1] ); // write end of the pipe + dup2( aFiledesStdin[0], 0 ); + close( aFiledesStdin[0] ); + + close( aFiledesStdout[0] ); // read end of the pipe + dup2( aFiledesStdout[1], 1 ); + close( aFiledesStdout[1] ); + +#if OSL_DEBUG_LEVEL == 0 + int nRedirect = open( "/dev/null", O_WRONLY ); + if( nRedirect != -1 ) + { + dup2( nRedirect, 2 ); + } +#endif + + // The executable name + char pFname[1024]; snprintf(pFname, sizeof pFname, "%s/%s", getenv("OLDPWD"), "tdefilepicker"); + + // ID of the main window + const int nIdLen = 20; + char pWinId[nIdLen] = "0"; + + // TODO pass here the real parent (not possible for system dialogs + // yet), and default to GetDefDialogParent() only when the real parent + // is NULL + Window *pParentWin = Application::GetDefDialogParent(); + if ( pParentWin ) + { + const SystemEnvData* pSysData = ((SystemWindow *)pParentWin)->GetSystemData(); + if ( pSysData ) + { + snprintf( pWinId, nIdLen, "%ld", pSysData->aWindow ); // unx only + pWinId[nIdLen-1] = 0; + } + } + + // Execute the fpicker implementation + execlp( pFname, pFname, "--winid", pWinId, NULL ); + + // Error, finish the child + exit( -1 ); + } + + // Parent continues + close( aFiledesStdin[0] ); + m_nFilePickerWrite = aFiledesStdin[1]; + + close( aFiledesStdout[1] ); + m_nFilePickerRead = aFiledesStdout[0]; + + // Create the notify thread + if ( !m_pNotifyThread ) + m_pNotifyThread = new UnxFilePickerNotifyThread( this ); + + // Create the command thread + if ( !m_pCommandThread ) + m_pCommandThread = new UnxFilePickerCommandThread( m_pNotifyThread, m_nFilePickerRead ); + + // Start the threads + m_pNotifyThread->create(); + m_pCommandThread->create(); + + return; +} + +void UnxFilePicker::checkFilePicker() throw( ::com::sun::star::uno::RuntimeException ) +{ + if ( m_nFilePickerPid > 0 ) + { + // TODO check if external file picker is runnning + } + else + { + throw uno::RuntimeException( + ::rtl::OUString::createFromAscii( "the external file picker does not run" ), + *this ); + } +} + +void UnxFilePicker::sendCommand( const ::rtl::OUString &rCommand ) +{ + if ( m_nFilePickerWrite < 0 ) + return; + + ::rtl::OString aUtfString = OUStringToOString( rCommand + ::rtl::OUString::createFromAscii( "\n" ), RTL_TEXTENCODING_UTF8 ); + +#if OSL_DEBUG_LEVEL > 0 + ::std::cerr << "UnxFilePicker sent: \"" << aUtfString.getStr() << "\"" << ::std::endl; +#endif + + write( m_nFilePickerWrite, aUtfString.getStr(), aUtfString.getLength() ); +} + +void UnxFilePicker::sendCommand( const ::rtl::OUString &rCommand, ::osl::Condition &rCondition ) +{ + rCondition.reset(); + + sendCommand( rCommand ); + + rCondition.wait(); +} + +void UnxFilePicker::appendEscaped( ::rtl::OUStringBuffer &rBuffer, const ::rtl::OUString &rString ) +{ + const sal_Unicode *pUnicode = rString.getStr(); + const sal_Unicode *pEnd = pUnicode + rString.getLength(); + + rBuffer.appendAscii( "\"" , 1 ); + + for ( ; pUnicode != pEnd; ++pUnicode ) + { + if ( *pUnicode == '\\' ) + rBuffer.appendAscii( "\\\\", 2 ); + else if ( *pUnicode == '"' ) + rBuffer.appendAscii( "\\\"", 2 ); + else if ( *pUnicode == '\n' ) + rBuffer.appendAscii( "\\n", 2 ); + else + rBuffer.append( *pUnicode ); + } + + rBuffer.appendAscii( "\"", 1 ); +} + +sal_Bool UnxFilePicker::controlIdInfo( sal_Int16 nControlId, ::rtl::OUString &rType, sal_Int32 &rTitleId ) +{ + typedef struct { + sal_Int16 nId; + const ::rtl::OUString *pType; + sal_Int32 nTitle; + } ElementToName; + + const ::rtl::OUString aCheckBox( RTL_CONSTASCII_USTRINGPARAM( "checkbox" ) ); + const ::rtl::OUString aControl( RTL_CONSTASCII_USTRINGPARAM( "control" ) ); + const ::rtl::OUString aEdit( RTL_CONSTASCII_USTRINGPARAM( "edit" ) ); + const ::rtl::OUString aLabel( RTL_CONSTASCII_USTRINGPARAM( "label" ) ); + const ::rtl::OUString aListBox( RTL_CONSTASCII_USTRINGPARAM( "listbox" ) ); + const ::rtl::OUString aPushButton( RTL_CONSTASCII_USTRINGPARAM( "pushbutton" ) ); + + const ElementToName *pPtr; + const ElementToName pArray[] = + { + { CommonFilePickerElementIds::PUSHBUTTON_OK, &aPushButton, 0/*FIXME?*/ }, + { CommonFilePickerElementIds::PUSHBUTTON_CANCEL, &aPushButton, 0/*FIXME?*/ }, + { CommonFilePickerElementIds::LISTBOX_FILTER, &aListBox, 0/*FIXME?*/ }, + { CommonFilePickerElementIds::CONTROL_FILEVIEW, &aControl, 0/*FIXME?*/ }, + { CommonFilePickerElementIds::EDIT_FILEURL, &aEdit, 0/*FIXME?*/ }, + { CommonFilePickerElementIds::LISTBOX_FILTER_LABEL, &aLabel, 0/*FIXME?*/ }, + { CommonFilePickerElementIds::EDIT_FILEURL_LABEL, &aLabel, 0/*FIXME?*/ }, + + { ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, &aCheckBox, STR_SVT_FILEPICKER_AUTO_EXTENSION }, + { ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, &aCheckBox, STR_SVT_FILEPICKER_PASSWORD }, + { ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS, &aCheckBox, STR_SVT_FILEPICKER_FILTER_OPTIONS }, + { ExtendedFilePickerElementIds::CHECKBOX_READONLY, &aCheckBox, STR_SVT_FILEPICKER_READONLY }, + { ExtendedFilePickerElementIds::CHECKBOX_LINK, &aCheckBox, STR_SVT_FILEPICKER_INSERT_AS_LINK }, + { ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, &aCheckBox, STR_SVT_FILEPICKER_SHOW_PREVIEW }, + { ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, &aPushButton, STR_SVT_FILEPICKER_PLAY }, + { ExtendedFilePickerElementIds::LISTBOX_VERSION, &aListBox, STR_SVT_FILEPICKER_VERSION }, + { ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, &aListBox, STR_SVT_FILEPICKER_TEMPLATES }, + { ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE, &aListBox, STR_SVT_FILEPICKER_IMAGE_TEMPLATE }, + { ExtendedFilePickerElementIds::CHECKBOX_SELECTION, &aCheckBox, STR_SVT_FILEPICKER_SELECTION }, + { 0, 0, 0 } + }; + + for ( pPtr = pArray; pPtr->nId && ( pPtr->nId != nControlId ); ++pPtr ) + ; + + if ( pPtr->nId == nControlId ) + { + rType = *(pPtr->pType); + rTitleId = pPtr->nTitle; + + return sal_True; + } + + return sal_False; +} + +sal_Bool UnxFilePicker::controlActionInfo( sal_Int16 nControlAction, ::rtl::OUString &rType ) +{ + typedef struct { + sal_Int16 nId; + const ::rtl::OUString pType; + } ElementToName; + + const ElementToName *pPtr; + const ElementToName pArray[] = + { + { ControlActions::ADD_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addItem" ) ) }, + { ControlActions::ADD_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addItems" ) ) }, + { ControlActions::DELETE_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "deleteItem" ) ) }, + { ControlActions::DELETE_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "deleteItems" ) ) }, + { ControlActions::SET_SELECT_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setSelectedItem" ) ) }, + { ControlActions::GET_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getItems" ) ) }, + { ControlActions::GET_SELECTED_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getSelectedItem" ) ) }, + { ControlActions::GET_SELECTED_ITEM_INDEX, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getSelectedItemIndex" ) ) }, + { ControlActions::SET_HELP_URL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setHelpURL" ) ) }, + { ControlActions::GET_HELP_URL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getHelpURL" ) ) }, + { 0, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "noAction" ) ) } + }; + + for ( pPtr = pArray; pPtr->nId && ( pPtr->nId != nControlAction ); ++pPtr ) + ; + + rType = pPtr->pType; + + return sal_True; +} + +void UnxFilePicker::sendAppendControlCommand( sal_Int16 nControlId ) +{ + ::rtl::OUString aType; + sal_Int32 nTitleId; + + if ( controlIdInfo( nControlId, aType, nTitleId ) ) + { + ::rtl::OUStringBuffer aBuffer( 1024 ); + + aBuffer.appendAscii( "appendControl " ); + aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); + aBuffer.appendAscii( " ", 1 ); + appendEscaped( aBuffer, aType ); + aBuffer.appendAscii( " ", 1 ); + appendEscaped( aBuffer, m_pResMgr? String( ResId( nTitleId, *m_pResMgr ) ): String() ); + + sendCommand( aBuffer.makeStringAndClear() ); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/UnxFilePicker.hxx b/fpicker/source/unx/tde_unx/UnxFilePicker.hxx new file mode 100644 index 0000000..4e0b526 --- /dev/null +++ b/fpicker/source/unx/tde_unx/UnxFilePicker.hxx @@ -0,0 +1,178 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _UNXFILEPICKER_HXX_ +#define _UNXFILEPICKER_HXX_ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class UnxFilePickerCommandThread; +class UnxFilePickerNotifyThread; +class ResMgr; + +class UnxFilePickerDummy +{ +protected: + osl::Mutex m_aMutex; + osl::Mutex m_rbHelperMtx; +}; + +class UnxFilePicker : + public UnxFilePickerDummy, + public cppu::WeakComponentImplHelper8< + ::com::sun::star::ui::dialogs::XFilterManager, + ::com::sun::star::ui::dialogs::XFilterGroupManager, + ::com::sun::star::ui::dialogs::XFilePickerControlAccess, + ::com::sun::star::ui::dialogs::XFilePickerNotifier, +// TODO ::com::sun::star::ui::dialogs::XFilePreview, + ::com::sun::star::lang::XInitialization, + ::com::sun::star::util::XCancellable, + ::com::sun::star::lang::XEventListener, + ::com::sun::star::lang::XServiceInfo > +{ +protected: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceMgr; // to instanciate own services + + pid_t m_nFilePickerPid; + int m_nFilePickerWrite; // (tde|...)filepicker gets it as stdin + int m_nFilePickerRead; // (tde|...)filepicker gets it as stdout + + UnxFilePickerNotifyThread *m_pNotifyThread; + UnxFilePickerCommandThread *m_pCommandThread; + + ResMgr *m_pResMgr; + +public: + UnxFilePicker( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceMgr ); + virtual ~UnxFilePicker(); + + // XFilePickerNotifier + + virtual void SAL_CALL addFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException ); + + // XExecutableDialog functions + + virtual void SAL_CALL setTitle( const ::rtl::OUString &rTitle ) throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Int16 SAL_CALL execute() throw( ::com::sun::star::uno::RuntimeException ); + + // XFilePicker functions + + virtual void SAL_CALL setMultiSelectionMode( sal_Bool bMode ) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL setDefaultName( const ::rtl::OUString &rName ) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL setDisplayDirectory( const ::rtl::OUString &rDirectory ) throw( ::com::sun::star::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getDisplayDirectory() throw( ::com::sun::star::uno::RuntimeException ); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getFiles() throw( ::com::sun::star::uno::RuntimeException ); + + // XFilterManager functions + + virtual void SAL_CALL appendFilter( const ::rtl::OUString &rTitle, const ::rtl::OUString &rFilter ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL setCurrentFilter( const ::rtl::OUString &rTitle ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException ); + virtual ::rtl::OUString SAL_CALL getCurrentFilter() throw( ::com::sun::star::uno::RuntimeException ); + + // XFilterGroupManager functions + + virtual void SAL_CALL appendFilterGroup( const ::rtl::OUString &rGroupTitle, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::StringPair > &rFilters ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + + // XFilePickerControlAccess functions + + virtual void SAL_CALL setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const ::com::sun::star::uno::Any &rValue ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Any SAL_CALL getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL enableControl( sal_Int16 nControlId, sal_Bool bEnable ) throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL setLabel( sal_Int16 nControlId, const ::rtl::OUString &rLabel ) throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getLabel( sal_Int16 nControlId ) throw (::com::sun::star::uno::RuntimeException); + + /* TODO XFilePreview + + virtual ::com::sun::star::uno::Sequence< sal_Int16 > SAL_CALL getSupportedImageFormats( ) throw (::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getTargetColorDepth( ) throw (::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getAvailableWidth( ) throw (::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getAvailableHeight( ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setImage( sal_Int16 aImageFormat, const ::com::sun::star::uno::Any &rImage ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL setShowState( sal_Bool bShowState ) throw (::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL getShowState( ) throw (::com::sun::star::uno::RuntimeException); + */ + + // XInitialization + + virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > &rArguments ) throw( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); + + // XCancellable + + virtual void SAL_CALL cancel( ) throw( ::com::sun::star::uno::RuntimeException ); + + // XEventListener + + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject &rEvent ) throw( ::com::sun::star::uno::RuntimeException ); + + // XServiceInfo + + virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString &rServiceName ) throw( ::com::sun::star::uno::RuntimeException ); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException ); + +private: + // prevent copy and assignment + UnxFilePicker( const UnxFilePicker& ); + UnxFilePicker& operator=( const UnxFilePicker& ); + +protected: + void initFilePicker(); + void checkFilePicker() throw( ::com::sun::star::uno::RuntimeException ); + + // Async sendCommand + void sendCommand( const ::rtl::OUString &rCommand ); + // Synchronized sendCommand + void sendCommand( const ::rtl::OUString &rCommand, ::osl::Condition &rCondition ); + void appendEscaped( ::rtl::OUStringBuffer &rBuffer, const ::rtl::OUString &rString ); + +private: + sal_Bool controlIdInfo( sal_Int16 nControlId, ::rtl::OUString &rType, sal_Int32 &rTitleId ); + sal_Bool controlActionInfo( sal_Int16 nControlId, ::rtl::OUString &rType ); + void sendAppendControlCommand( sal_Int16 nControlId ); +}; + +#endif // _UNXFILEPICKER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx b/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx new file mode 100644 index 0000000..3bc96b1 --- /dev/null +++ b/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx @@ -0,0 +1,116 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include +#include + +using namespace ::com::sun::star; + +////////////////////////////////////////////////////////////////////////// +// UnxFilePickerNotifyThread +////////////////////////////////////////////////////////////////////////// + +UnxFilePickerNotifyThread::UnxFilePickerNotifyThread( UnxFilePicker *pUnxFilePicker ) + : m_pUnxFilePicker( pUnxFilePicker ), + m_bExit( sal_False ), + m_eNotifyType( Nothing ), + m_nControlId( 0 ) +{ +} + +void SAL_CALL UnxFilePickerNotifyThread::addFilePickerListener( const uno::Reference< ui::dialogs::XFilePickerListener >& xListener ) + throw( uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + m_xListener = xListener; +} + +void SAL_CALL UnxFilePickerNotifyThread::removeFilePickerListener( const uno::Reference< ui::dialogs::XFilePickerListener >& xListener ) + throw( uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + m_xListener.clear(); +} + +void SAL_CALL UnxFilePickerNotifyThread::exit() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + m_bExit = sal_True; + + m_aExitCondition.reset(); + m_aNotifyCondition.set(); + + m_aExitCondition.wait(); +} + +void SAL_CALL UnxFilePickerNotifyThread::fileSelectionChanged() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + m_eNotifyType = FileSelectionChanged; + m_nControlId = 0; + + m_aNotifyCondition.set(); +} + +void SAL_CALL UnxFilePickerNotifyThread::run() +{ + do { + m_aNotifyCondition.reset(); + m_aNotifyCondition.wait(); + + if ( m_xListener.is() && m_pUnxFilePicker ) + { + ::osl::MutexGuard aGuard( m_aMutex ); + + ui::dialogs::FilePickerEvent aEvent( *m_pUnxFilePicker, m_nControlId ); + + switch ( m_eNotifyType ) + { + case FileSelectionChanged: + m_xListener->fileSelectionChanged( aEvent ); + break; + + // TODO More to come... + + default: + // nothing + break; + } + } + } while ( !m_bExit ); + + m_aExitCondition.set(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx b/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx new file mode 100644 index 0000000..9f5d1a5 --- /dev/null +++ b/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx @@ -0,0 +1,90 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2010 Novell, Inc. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _UNXNOTIFYTHREAD_HXX_ +#define _UNXNOTIFYTHREAD_HXX_ + +#include +#include + +#include +#include +#include + +class UnxFilePicker; + +class UnxFilePickerNotifyThread : public ::osl::Thread +{ +protected: + enum NotifyType + { + Nothing = 0, + FileSelectionChanged + // TODO More to come... + }; + + UnxFilePicker *m_pUnxFilePicker; + + ::osl::Mutex m_aMutex; + + ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener > m_xListener; + + sal_Bool m_bExit; + ::osl::Condition m_aExitCondition; + + NotifyType m_eNotifyType; + ::osl::Condition m_aNotifyCondition; + sal_Int16 m_nControlId; + +public: + UnxFilePickerNotifyThread( UnxFilePicker *pUnxFilePicker ); + + virtual void SAL_CALL addFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) + throw( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL removeFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) + throw( ::com::sun::star::uno::RuntimeException ); + + void SAL_CALL exit(); + + void SAL_CALL fileSelectionChanged(); + /* TODO + void SAL_CALL directoryChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent ); + rtl::OUString SAL_CALL helpRequested( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent ) const; + void SAL_CALL controlStateChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent ); + void SAL_CALL dialogSizeChanged( ); + */ + +protected: + virtual void SAL_CALL run(); +}; + +#endif // _UNXNOTIFYTHREAD_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/unx/tde_unx/fps_tde.component b/fpicker/source/unx/tde_unx/fps_tde.component new file mode 100644 index 0000000..e7a201d --- /dev/null +++ b/fpicker/source/unx/tde_unx/fps_tde.component @@ -0,0 +1,35 @@ + + + + + + + + diff --git a/fpicker/source/unx/tde_unx/fps_tde.xml b/fpicker/source/unx/tde_unx/fps_tde.xml new file mode 100644 index 0000000..fc1ed68 --- /dev/null +++ b/fpicker/source/unx/tde_unx/fps_tde.xml @@ -0,0 +1,51 @@ + + + + fps_tde + + Jan Holesovsky + com.sun.star.comp.ui.dialogs.FilePicker + + The TDE implementation of the FilePicker service. + + com.sun.star.loader.SharedLibrary + c++ + + com.sun.star.ui.dialogs.FilePicker + ... + com.sun.star.ui.dialogs.XExecutableDialog + com.sun.star.ui.dialogs.XFilePicker + com.sun.star.ui.dialogs.XFilterManager + com.sun.star.ui.dialogs.XFilterGroupManager + com.sun.star.ui.dialogs.XFilePickerListener + com.sun.star.ui.dialogs.ExecutableDialogException + com.sun.star.ui.dialogs.XFilePickerNotifier + com.sun.star.ui.dialogs.XFilePickerControlAccess + com.sun.star.ui.dialogs.XFilePreview + com.sun.star.ui.dialogs.ExtendedFilePickerElementIds + com.sun.star.ui.dialogs.ExecutableDialogResults + com.sun.star.ui.dialogs.FilePickerEvent + com.sun.star.ui.dialogs.CommonFilePickerElementIds + com.sun.star.ui.dialogs.ListboxControlActions + com.sun.star.ui.dialogs.TemplateDescription + com.sun.star.ui.dialogs.FilePreviewImageFormats + com.sun.star.util.XCancellable + com.sun.star.lang.XComponent + com.sun.star.lang.XMultiServiceFactory + com.sun.star.lang.XSingleServiceFactory + com.sun.star.lang.XServiceInfo + com.sun.star.lang.XTypeProvider + com.sun.star.lang.IllegalArgumentException + com.sun.star.uno.TypeClass + com.sun.star.uno.XWeak + com.sun.star.uno.XAggregation + com.sun.star.registry.XRegistryKey + com.sun.star.container.XSet + + cppuhelper + cppu + sal + cppuhelper + cppu2 + sal2 + diff --git a/fpicker/source/unx/tde_unx/makefile.mk b/fpicker/source/unx/tde_unx/makefile.mk new file mode 100644 index 0000000..196c948 --- /dev/null +++ b/fpicker/source/unx/tde_unx/makefile.mk @@ -0,0 +1,86 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# Copyright 2010 Novell, Inc. +# Copyright 2011 Timothy Pearson +# +# 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 +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/..$/.. + +PRJNAME=fpicker +TARGET=fps_tde.uno +LIBTARGET=NO +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +DLLPRE= + +# ------------------------------------------------------------------ + +# Currently just TDE is supported... +.IF "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE" + +dummy: + @echo "Nothing to build. GUIBASE == $(GUIBASE), ENABLE_TDE is not set" + +.ELSE # we build for TDE + +# --- Files -------------------------------------------------------- + +SLOFILES =\ + $(SLO)$/UnxCommandThread.obj \ + $(SLO)$/UnxFilePicker.obj \ + $(SLO)$/UnxNotifyThread.obj \ + $(SLO)$/UnxFPentry.obj + +SHL1NOCHECK=TRUE +SHL1TARGET=fps_tde.uno +SHL1STDLIBS=$(CPPULIB)\ + $(CPPUHELPERLIB)\ + $(SALLIB)\ + $(VCLLIB)\ + $(TOOLSLIB) + +SHL1OBJS=$(SLOFILES) +SHL1DEF=$(MISC)$/$(SHL1TARGET).def + +DEF1NAME=$(SHL1TARGET) +DEF1VERSIONMAP=$(SOLARENV)/src/component.map + +.ENDIF # "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE" + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + +ALLTAR : $(MISC)/fps_tde.component + +$(MISC)/fps_tde.component .ERRREMOVE : $(SOLARENV)/bin/createcomponent.xslt \ + fps_tde.component + $(XSLTPROC) --nonet --stringparam uri \ + '$(COMPONENTPREFIX_BASIS_NATIVE)$(SHL1TARGETN:f)' -o $@ \ + $(SOLARENV)/bin/createcomponent.xslt fps_tde.component diff --git a/postprocess/packcomponents/makefile.mk b/postprocess/packcomponents/makefile.mk index b983928..a47e9c6 100644 --- a/postprocess/packcomponents/makefile.mk +++ b/postprocess/packcomponents/makefile.mk @@ -235,6 +235,10 @@ my_components += kab1 my_components += kdebe1 .END +.IF "$(ENABLE_TDE)" != "" +my_components += tdebe1 +.END + .IF "$(ENABLE_KDE4)" != "" my_components += kde4be1 .END @@ -354,6 +358,10 @@ my_components += fps_gnome my_components += fps_kde4 .END +.IF "$(ENABLE_TDE)" != "" +my_components += fps_tde +.END + .IF "$(OS)" != "WNT" my_components += cmdmail .END diff --git a/postprocess/packregistry/makefile.mk b/postprocess/packregistry/makefile.mk index d82c9ef..a3a6de4 100644 --- a/postprocess/packregistry/makefile.mk +++ b/postprocess/packregistry/makefile.mk @@ -328,6 +328,9 @@ MY_FILES_main += \ .IF "$(ENABLE_KAB)" == "TRUE" MY_FILES_main += $(MY_MOD)/DataAccess/kab.xcu .END +.IF "$(ENABLE_TDEAB)" == "TRUE" +MY_FILES_main += $(MY_MOD)/DataAccess/tdeab.xcu +.END .IF "$(SYSTEM_MOZILLA)" != "YES" && "$(WITH_MOZILLA)" != "NO" && \ "$(OS)" != "MACOSX" .IF "$(OS)" == "WNT" diff --git a/scp2/prj/build.lst b/scp2/prj/build.lst index f225c3e..41be4f3 100644 --- a/scp2/prj/build.lst +++ b/scp2/prj/build.lst @@ -14,6 +14,7 @@ cp scp2\source\graphicfilter nmake - all cp_graphicfilter cp_langm cp scp2\source\impress nmake - all cp_impress cp_langmacros cp_langtemplates NULL cp scp2\source\javafilter nmake - all cp_javafilter cp_langmacros cp_langtemplates NULL cp scp2\source\kde nmake - all cp_kde cp_langmacros cp_langtemplates NULL +cp scp2\source\tde nmake - all cp_tde cp_langmacros cp_langtemplates NULL cp scp2\source\layout nmake - all cp_layout cp_langmacros NULL cp scp2\source\math nmake - all cp_math cp_langmacros cp_langtemplates NULL cp scp2\source\ooo nmake - all cp_ooo cp_langmacros cp_langtemplates NULL @@ -27,4 +28,4 @@ cp scp2\source\xsltfilter nmake - all cp_xsltfilter cp_langmacr cp scp2\source\winexplorerext nmake - all cp_winexplorerext cp_langmacros cp_langtemplates NULL cp scp2\source\onlineupdate nmake - all cp_update cp_langmacros cp_langtemplates NULL cp scp2\source\accessories nmake - all cp_accessories cp_langmacros NULL -cp scp2\util nmake - all cp_util cp_activex cp_binfilter cp_calc cp_canvas cp_crashrep cp_draw cp_extensions cp_gnome cp_graphicfilter cp_impress cp_javafilter cp_kde cp_layout cp_math cp_ooo cp_python cp_quickstart cp_testtool cp_writer cp_base cp_xsltfilter cp_winexplorerext cp_sdkoo cp_update cp_accessories NULL +cp scp2\util nmake - all cp_util cp_activex cp_binfilter cp_calc cp_canvas cp_crashrep cp_draw cp_extensions cp_gnome cp_graphicfilter cp_impress cp_javafilter cp_kde cp_tde cp_layout cp_math cp_ooo cp_python cp_quickstart cp_testtool cp_writer cp_base cp_xsltfilter cp_winexplorerext cp_sdkoo cp_update cp_accessories NULL diff --git a/scp2/source/ooo/file_library_ooo.scp b/scp2/source/ooo/file_library_ooo.scp index d83d6cf..fe378e1 100644 --- a/scp2/source/ooo/file_library_ooo.scp +++ b/scp2/source/ooo/file_library_ooo.scp @@ -425,6 +425,24 @@ End #endif +#ifdef ENABLE_TDEAB +File gid_File_Lib_Tdeab_1 + TXT_FILE_BODY; + Styles = (PACKED,UNO_COMPONENT); + RegistryID = gid_Starregistry_Services_Rdb; + Dir = SCP2_OOO_BIN_DIR; + Name = STRING(CONCAT2(libtdeab1,UNXSUFFIX)); +End + +File gid_File_Lib_Tdeab_Drv_1 + TXT_FILE_BODY; + Styles = (PACKED); + Dir = SCP2_OOO_BIN_DIR; + Name = STRING(CONCAT2(libtdeabdrv1,UNXSUFFIX)); +End + +#endif + #ifdef MACOSX File gid_File_Lib_Macab_1 TXT_FILE_BODY; @@ -525,6 +543,23 @@ File gid_File_Bin_KdeFilePicker End #endif #endif +#ifdef ENABLE_TDE +#ifndef MACOSX +File gid_File_Lib_Fps_Tde + TXT_FILE_BODY; + Styles = (PACKED); + Dir = SCP2_OOO_BIN_DIR; + Name = SPECIAL_COMPONENT_LIB_NAME(fps_tde.uno); +End +File gid_File_Bin_TdeFilePicker + BIN_FILE_BODY; + Styles = (PACKED); + Dir = gid_Brand_Dir_Program; + Name = "tdefilepicker"; +End +#endif +#endif + #endif #ifdef QUARTZ @@ -992,6 +1027,17 @@ File gid_File_Lib_Vclplug_Kde4 End #endif #endif +#ifdef ENABLE_TDE +#ifndef MACOSX +File gid_File_Lib_Vclplug_Tde + Name = LIBNAME(vclplug_tde); + TXT_FILE_BODY; + Styles = (PACKED); + Dir = SCP2_OOO_BIN_DIR; +End +#endif +#endif + #endif #if defined(QUARTZ) diff --git a/scp2/source/ooo/file_ooo.scp b/scp2/source/ooo/file_ooo.scp index 34ed8a9..5291d0d 100644 --- a/scp2/source/ooo/file_ooo.scp +++ b/scp2/source/ooo/file_ooo.scp @@ -169,6 +169,13 @@ File gid_File_Bin_Kde_Open_Url Styles = (PACKED); End +File gid_File_Bin_Tde_Open_Url + BIN_FILE_BODY; + Dir = gid_Brand_Dir_Program; + Name = "tde-open-url"; + Styles = (PACKED); +End + File gid_File_Bin_Cde_Open_Url BIN_FILE_BODY; Dir = gid_Brand_Dir_Program; diff --git a/scp2/source/ooo/makefile.mk b/scp2/source/ooo/makefile.mk index ce2ab52..0b8d12b 100644 --- a/scp2/source/ooo/makefile.mk +++ b/scp2/source/ooo/makefile.mk @@ -84,6 +84,14 @@ SCPDEFS+=-DENABLE_KDE4 SCPDEFS+=-DENABLE_KAB .ENDIF +.IF "$(ENABLE_TDE)" != "" +SCPDEFS+=-DENABLE_TDE +.ENDIF + +.IF "$(ENABLE_TDEAB)" != "" +SCPDEFS+=-DENABLE_TDEAB +.ENDIF + .IF "$(ENABLE_EVOAB2)" != "" SCPDEFS+=-DENABLE_EVOAB2 .ENDIF diff --git a/scp2/source/ooo/module_hidden_ooo.scp b/scp2/source/ooo/module_hidden_ooo.scp index 20d9b16..fce92ce 100644 --- a/scp2/source/ooo/module_hidden_ooo.scp +++ b/scp2/source/ooo/module_hidden_ooo.scp @@ -84,6 +84,7 @@ Module gid_Module_Root_Files_2 Styles = (HIDDEN_ROOT); Files = (gid_File_Bin_Cde_Open_Url, gid_File_Bin_Kde_Open_Url, + gid_File_Bin_Tde_Open_Url, gid_File_Bin_Open_Url, gid_File_Bin_Pagein, gid_File_Bin_Pluginapp, @@ -277,6 +278,7 @@ Module gid_Module_Root_Files_4 gid_File_Lib_Vclplug_Gen, gid_File_Lib_Vclplug_Kde, gid_File_Lib_Vclplug_Kde4, + gid_File_Lib_Vclplug_Tde, gid_File_Lib_Vclplug_Svp, gid_File_Lib_Basctl, gid_File_Lib_CanvasTools, @@ -348,6 +350,8 @@ Module gid_Module_Root_Files_5 gid_File_Lib_Emboleobj, gid_File_Lib_Kab_1, gid_File_Lib_Kab_Drv_1, + gid_File_Lib_Tdeab_1, + gid_File_Lib_Tdeab_Drv_1, gid_File_Lib_Macab_1, gid_File_Lib_Macab_Drv_1, gid_File_Lib_Evtatt, diff --git a/scp2/source/tde/file_tde.scp b/scp2/source/tde/file_tde.scp new file mode 100644 index 0000000..6387a57 --- /dev/null +++ b/scp2/source/tde/file_tde.scp @@ -0,0 +1,37 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include "macros.inc" + +#ifdef ENABLE_TDE +File gid_File_Lib_Tdebe + TXT_FILE_BODY; + Styles = (PACKED); + Dir = SCP2_OOO_BIN_DIR; + Name = STRING(CONCAT2(tdebe1.uno,UNXSUFFIX)); +End +#endif diff --git a/scp2/source/tde/makefile.mk b/scp2/source/tde/makefile.mk new file mode 100644 index 0000000..78d5728 --- /dev/null +++ b/scp2/source/tde/makefile.mk @@ -0,0 +1,59 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# Copyright 2011 Timothy Pearson +# +# 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 +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/.. + +PRJPCH= + +PRJNAME=scp2 +TARGET=tde +TARGETTYPE=CUI + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +SCP_PRODUCT_TYPE=osl + +.IF "$(ENABLE_TDE)" == "TRUE" + +.IF "$(ENABLE_TDE)" != "" +SCPDEFS+=-DENABLE_TDE +.ENDIF + +PARFILES = \ + module_tde.par \ + file_tde.par + +ULFFILES= \ + module_tde.ulf +.ENDIF + +# --- File --------------------------------------------------------- + +.INCLUDE : target.mk diff --git a/scp2/source/tde/module_tde.scp b/scp2/source/tde/module_tde.scp new file mode 100644 index 0000000..9fdfecd --- /dev/null +++ b/scp2/source/tde/module_tde.scp @@ -0,0 +1,45 @@ +/************************************************************************* + * + * 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 + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "macros.inc" + +#if defined( ENABLE_TDE ) +Module gid_Module_Optional_Tde + ParentID = gid_Module_Optional; + Default = YES; + PackageInfo = "packinfo_office.txt"; + MOD_NAME_DESC(MODULE_OPTIONAL_TDE); + Styles = (DONTSHOWINUSERINSTALL); + Files = ( +#ifdef ENABLE_TDE + gid_File_Lib_Tdebe +#endif // ENABLE_TDE + ); +End +#endif + diff --git a/scp2/source/tde/module_tde.ulf b/scp2/source/tde/module_tde.ulf new file mode 100644 index 0000000..e55735f --- /dev/null +++ b/scp2/source/tde/module_tde.ulf @@ -0,0 +1,34 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +[STR_NAME_MODULE_OPTIONAL_TDE] +en-US = "TDE Integration" + +[STR_DESC_MODULE_OPTIONAL_TDE] +en-US = "System integration of %PRODUCTNAME %PRODUCTVERSION into TDE." + diff --git a/scp2/util/makefile.mk b/scp2/util/makefile.mk index 1d6d694..c59e04c 100644 --- a/scp2/util/makefile.mk +++ b/scp2/util/makefile.mk @@ -200,6 +200,12 @@ SCP1FILES += \ module_kde.par \ file_kde.par .ENDIF + +.IF "$(ENABLE_TDE)" == "TRUE" +SCP1FILES += \ + module_tde.par \ + file_tde.par +.ENDIF .ENDIF .IF "$(ENABLE_CRASHDUMP)" != "" diff --git a/set_soenv.in b/set_soenv.in index dc2d996..e0d7c39 100755 --- a/set_soenv.in +++ b/set_soenv.in @@ -1546,6 +1546,10 @@ ToFile( "KDE_GLIB_CFLAGS", "@KDE_GLIB_CFLAGS@", "e" ); ToFile( "KDE_GLIB_LIBS", "@KDE_GLIB_LIBS@", "e" ); ToFile( "KDE_HAVE_GLIB", "@KDE_HAVE_GLIB@", "e" ); ToFile( "ENABLE_KAB", "@ENABLE_KAB@", "e" ); +ToFile( "ENABLE_TDE", "@ENABLE_TDE@", "e" ); +ToFile( "TDE_CFLAGS", "@TDE_CFLAGS@", "e" ); +ToFile( "TDE_LIBS", "@TDE_LIBS@", "e" ); +ToFile( "ENABLE_TDEAB", "@ENABLE_TDEAB@", "e" ); ToFile( "PSPRINT", "TRUE", "e" ); ToFile( "MKDEPENDSOLVER", "TRUE", "e" ); ToFile( "nodep", "@nodep@", "e" ); diff --git a/setup_native/source/packinfo/packinfo_office.txt b/setup_native/source/packinfo/packinfo_office.txt index 63bb1fe..c5bb1d1 100644 --- a/setup_native/source/packinfo/packinfo_office.txt +++ b/setup_native/source/packinfo/packinfo_office.txt @@ -48,6 +48,21 @@ packageversion = "%OOOPACKAGEVERSION" End Start +module = "gid_Module_Optional_Tde" +solarispackagename = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-tde-integration" +solarisrequires = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01" +packagename = "%BASISPACKAGEPREFIX%OOOBASEVERSION-tde-integration" +freebsdrequires = "%BASISPACKAGEPREFIX%OOOBASEVERSION-core01" +requires = "%BASISPACKAGEPREFIX%OOOBASEVERSION-core01" +copyright = "1999-2009 by OpenOffice.org" +solariscopyright = "solariscopyrightfile" +vendor = "The Document Foundation" +description = "TDE integration module for LibreOffice %OOOBASEVERSION" +destpath = "/opt" +packageversion = "%OOOPACKAGEVERSION" +End + +Start module = "gid_Module_Root" # script = "shellscripts_core01.txt" solarispackagename = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01" diff --git a/shell/inc/tde_headers.h b/shell/inc/tde_headers.h new file mode 100644 index 0000000..91f59f9 --- /dev/null +++ b/shell/inc/tde_headers.h @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef INCLUDED_VCL_TDE_HEADERS_H +#define INCLUDED_VCL_TDE_HEADERS_H + +/* ********* Suppress warnings if needed */ +#include "sal/config.h" + +#if defined __GNUC__ +#pragma GCC system_header +#endif + + +/* ********* Hack, but needed because of conflicting types... */ +#define Region QtXRegion + + +/* ********* TQt headers */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* ********* See hack on top of this file */ +#undef Region + + +/* ********* TDE base headers */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* ********* TDE address book connectivity headers */ +#include +#include +#include +#include + + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/shell/prj/build.lst b/shell/prj/build.lst index 6dc5270..700c989 100644 --- a/shell/prj/build.lst +++ b/shell/prj/build.lst @@ -25,5 +25,6 @@ sl shell\source\backends\macbe nmake - u sl_backends_m sl shell\source\backends\gconfbe nmake - u sl_backends_gconfbe sl_inc NULL sl shell\source\backends\kdebe nmake - u sl_backends_kdebe sl_inc NULL sl shell\source\backends\kde4be nmake - u sl_backends_kde4be sl_inc NULL +sl shell\source\backends\tdebe nmake - u sl_backends_tdebe sl_inc NULL sl shell\source\backends\desktopbe nmake - u sl_backends_desktopbe sl_inc NULL sl shell\source\win32\shlxthandler\ooofilt nmake - w sl_win32_shlxthandler_ooofilt sl_win32_zipfile.w sl_win32_ooofilereader.w sl_win32_shlxthandler_util.w sl_all sl_inc NULL diff --git a/shell/prj/d.lst b/shell/prj/d.lst index 62dfa80..7665b62 100644 --- a/shell/prj/d.lst +++ b/shell/prj/d.lst @@ -15,6 +15,7 @@ ..\%__SRC%\bin\open-url %_DEST%\bin\open-url ..\%__SRC%\bin\cde-open-url %_DEST%\bin\cde-open-url ..\%__SRC%\bin\kde-open-url %_DEST%\bin\kde-open-url +..\%__SRC%\bin\tde-open-url %_DEST%\bin\tde-open-url ..\%__SRC%\bin\gnome-open-url %_DEST%\bin\gnome-open-url ..\%__SRC%\bin\gnome-open-url.bin %_DEST%\bin\gnome-open-url.bin ..\%__SRC%\bin\senddoc %_DEST%\bin\senddoc @@ -27,7 +28,9 @@ ..\%__SRC%\misc\gconfbe1.component %_DEST%\xml\gconfbe1.component ..\%__SRC%\misc\kde4be1.component %_DEST%\xml\kde4be1.component ..\%__SRC%\misc\kdebe1.component %_DEST%\xml\kdebe1.component +..\%__SRC%\misc\tdebe1.component %_DEST%\xml\tdebe1.component ..\inc\kde_headers.h %_DEST%\inc\shell\kde_headers.h +..\inc\tde_headers.h %_DEST%\inc\shell\tde_headers.h ..\%__SRC%\misc\localebe1.component %_DEST%\xml\localebe1.component ..\%__SRC%\misc\macbe1.component %_DEST%\xml\macbe1.component ..\%__SRC%\misc\smplmail.component %_DEST%\xml\smplmail.component diff --git a/shell/source/backends/tdebe/makefile.mk b/shell/source/backends/tdebe/makefile.mk new file mode 100644 index 0000000..5243da4 --- /dev/null +++ b/shell/source/backends/tdebe/makefile.mk @@ -0,0 +1,88 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# Copyright 2011 Timothy Pearson +# +# 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 +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* +PRJ=..$/..$/.. + +PRJNAME=shell +TARGET=tdebe + +LIBTARGET=NO +ENABLE_EXCEPTIONS=TRUE +VISIBILITY_HIDDEN=TRUE + +# --- Settings --- + +.INCLUDE : settings.mk + +# For some of the included external TDE headers, GCC complains about shadowed +# symbols in instantiated template code only at the end of a compilation unit, +# so the only solution is to disable that warning here: +.IF "$(COM)" == "GCC" +CFLAGSCXX+=-Wno-shadow +.ENDIF + +# no "lib" prefix +DLLPRE = + +.IF "$(ENABLE_TDE)" == "TRUE" + +CFLAGS+=$(TDE_CFLAGS) + +# --- Files --- + +SLOFILES=\ + $(SLO)$/tdeaccess.obj \ + $(SLO)$/tdebackend.obj + +SHL1NOCHECK=TRUE +SHL1TARGET=$(TARGET)1.uno +SHL1OBJS=$(SLOFILES) +SHL1DEF=$(MISC)$/$(SHL1TARGET).def + +SHL1IMPLIB=i$(SHL1TARGET) +SHL1LINKFLAGS+=$(TDE_LIBS) -ltdeio +SHL1STDLIBS= \ + $(CPPUHELPERLIB) \ + $(CPPULIB) \ + $(SALLIB) + +SHL1DEF=$(MISC)$/$(SHL1TARGET).def +DEF1NAME=$(SHL1TARGET) + +.ENDIF # "$(ENABLE_TDE)" == "TRUE" + +# --- Targets --- + +.INCLUDE : target.mk + +ALLTAR : $(MISC)/tdebe1.component + +$(MISC)/tdebe1.component .ERRREMOVE : $(SOLARENV)/bin/createcomponent.xslt \ + tdebe1.component + $(XSLTPROC) --nonet --stringparam uri \ + '$(COMPONENTPREFIX_BASIS_NATIVE)$(SHL1TARGETN:f)' -o $@ \ + $(SOLARENV)/bin/createcomponent.xslt tdebe1.component diff --git a/shell/source/backends/tdebe/tdeaccess.cxx b/shell/source/backends/tdebe/tdeaccess.cxx new file mode 100644 index 0000000..1dbd64f --- /dev/null +++ b/shell/source/backends/tdebe/tdeaccess.cxx @@ -0,0 +1,319 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* +* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2000, 2010 Oracle and/or its affiliates. +* Copyright 2011 Timothy Pearson +* +* 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 +* +* for a copy of the LGPLv3 License. +* +************************************************************************/ + +#include "precompiled_shell.hxx" +#include "sal/config.h" + +#include "com/sun/star/uno/Any.hxx" +#include "cppu/unotype.hxx" +#include "osl/diagnose.h" +#include "osl/file.h" +#include "rtl/string.h" +#include "rtl/ustring.hxx" + +#include "tde_headers.h" + +#include "tdeaccess.hxx" + +#define SPACE ' ' +#define COMMA ',' +#define SEMI_COLON ';' + +namespace tdeaccess { + +namespace { + +namespace css = com::sun::star ; +namespace uno = css::uno ; + +} + +css::beans::Optional< css::uno::Any > getValue(rtl::OUString const & id) { + if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ExternalMailer"))) { + KEMailSettings aEmailSettings; + TQString aClientProgram; + ::rtl::OUString sClientProgram; + + aClientProgram = aEmailSettings.getSetting( KEMailSettings::ClientProgram ); + if ( aClientProgram.isEmpty() ) + aClientProgram = "kmail"; + else + aClientProgram = aClientProgram.section(SPACE, 0, 0); + sClientProgram = (const sal_Unicode *) aClientProgram.ucs2(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( sClientProgram ) ); + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight"))) + { + TQFont aFixedFont; + short nFontHeight; + + aFixedFont = TDEGlobalSettings::fixedFont(); + nFontHeight = aFixedFont.pointSize(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( nFontHeight ) ); + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("SourceViewFontName"))) + { + TQFont aFixedFont; + TQString aFontName; + :: rtl::OUString sFontName; + + aFixedFont = TDEGlobalSettings::fixedFont(); + aFontName = aFixedFont.family(); + sFontName = (const sal_Unicode *) aFontName.ucs2(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( sFontName ) ); + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport"))) + { + /* does not make much sense without an accessibility bridge */ + sal_Bool ATToolSupport = sal_False; + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( rtl::OUString::valueOf( ATToolSupport ) ) ); + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("WorkPathVariable"))) + { + TQString aDocumentsDir( TDEGlobalSettings::documentPath() ); + rtl::OUString sDocumentsDir; + rtl::OUString sDocumentsURL; + if ( aDocumentsDir.endsWith(TQChar('/')) ) + aDocumentsDir.truncate ( aDocumentsDir.length() - 1 ); + sDocumentsDir = (const sal_Unicode *) aDocumentsDir.ucs2(); + osl_getFileURLFromSystemPath( sDocumentsDir.pData, &sDocumentsURL.pData ); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( sDocumentsURL ) ); + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName"))) + { + TQString aFTPProxy; + switch ( KProtocolManager::proxyType() ) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aFTPProxy = KProtocolManager::proxyFor( "FTP" ); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables +// In such cases, the proxy address is not stored in TDE, but determined dynamically. +// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... +// The best we can do here is to ask the current value for a given address. + aFTPProxy = KProtocolManager::proxyForURL( "ftp://ftp.openoffice.org" ); + break; + default: // No proxy is used + break; + } + if ( !aFTPProxy.isEmpty() ) + { + KURL aProxy(aFTPProxy); + ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( sProxy ) ); + } + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort"))) + { + TQString aFTPProxy; + switch ( KProtocolManager::proxyType() ) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aFTPProxy = KProtocolManager::proxyFor( "FTP" ); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables +// In such cases, the proxy address is not stored in TDE, but determined dynamically. +// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... +// The best we can do here is to ask the current value for a given address. + aFTPProxy = KProtocolManager::proxyForURL( "ftp://ftp.openoffice.org" ); + break; + default: // No proxy is used + break; + } + if ( !aFTPProxy.isEmpty() ) + { + KURL aProxy(aFTPProxy); + sal_Int32 nPort = aProxy.port(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( nPort ) ); + } + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName"))) + { + TQString aHTTPProxy; + switch ( KProtocolManager::proxyType() ) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aHTTPProxy = KProtocolManager::proxyFor( "HTTP" ); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables +// In such cases, the proxy address is not stored in TDE, but determined dynamically. +// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... +// The best we can do here is to ask the current value for a given address. + aHTTPProxy = KProtocolManager::proxyForURL( "http://http.openoffice.org" ); + break; + default: // No proxy is used + break; + } + if ( !aHTTPProxy.isEmpty() ) + { + KURL aProxy(aHTTPProxy); + ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( sProxy ) ); + } + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort"))) + { + TQString aHTTPProxy; + switch ( KProtocolManager::proxyType() ) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aHTTPProxy = KProtocolManager::proxyFor( "HTTP" ); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables +// In such cases, the proxy address is not stored in TDE, but determined dynamically. +// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... +// The best we can do here is to ask the current value for a given address. + aHTTPProxy = KProtocolManager::proxyForURL( "http://http.openoffice.org" ); + break; + default: // No proxy is used + break; + } + if ( !aHTTPProxy.isEmpty() ) + { + KURL aProxy(aHTTPProxy); + sal_Int32 nPort = aProxy.port(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( nPort ) ); + } + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName"))) + { + TQString aHTTPSProxy; + switch ( KProtocolManager::proxyType() ) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aHTTPSProxy = KProtocolManager::proxyFor( "HTTPS" ); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables +// In such cases, the proxy address is not stored in TDE, but determined dynamically. +// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... +// The best we can do here is to ask the current value for a given address. + aHTTPSProxy = KProtocolManager::proxyForURL( "https://https.openoffice.org" ); + break; + default: // No proxy is used + break; + } + if ( !aHTTPSProxy.isEmpty() ) + { + KURL aProxy(aHTTPSProxy); + ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( sProxy ) ); + } + } else if (id.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort"))) + { + TQString aHTTPSProxy; + switch ( KProtocolManager::proxyType() ) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + aHTTPSProxy = KProtocolManager::proxyFor( "HTTPS" ); + break; + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables +// In such cases, the proxy address is not stored in TDE, but determined dynamically. +// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... +// The best we can do here is to ask the current value for a given address. + aHTTPSProxy = KProtocolManager::proxyForURL( "https://https.openoffice.org" ); + break; + default: // No proxy is used + break; + } + if ( !aHTTPSProxy.isEmpty() ) + { + KURL aProxy(aHTTPSProxy); + sal_Int32 nPort = aProxy.port(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( nPort ) ); + } + } else if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy"))) { + TQString aNoProxyFor; + switch ( KProtocolManager::proxyType() ) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables + aNoProxyFor = KProtocolManager::noProxyFor(); + break; + default: // No proxy is used + break; + } + if ( !aNoProxyFor.isEmpty() ) + { + ::rtl::OUString sNoProxyFor; + + aNoProxyFor = aNoProxyFor.replace( COMMA, SEMI_COLON ); + sNoProxyFor = (const sal_Unicode *) aNoProxyFor.ucs2(); + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( sNoProxyFor ) ); + } + } else if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetProxyType"))) { + int nProxyType; + switch ( KProtocolManager::proxyType() ) + { + case KProtocolManager::ManualProxy: // Proxies are manually configured + case KProtocolManager::PACProxy: // A proxy configuration URL has been given + case KProtocolManager::WPADProxy: // A proxy should be automatically discovered + case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables + nProxyType = 1; + break; + default: // No proxy is used + nProxyType = 0; + } + return css::beans::Optional< css::uno::Any >( + true, uno::makeAny( (sal_Int32) nProxyType ) ); + } else { + OSL_ASSERT(false); // this cannot happen + } + return css::beans::Optional< css::uno::Any >(); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/shell/source/backends/tdebe/tdeaccess.hxx b/shell/source/backends/tdebe/tdeaccess.hxx new file mode 100644 index 0000000..5029c12 --- /dev/null +++ b/shell/source/backends/tdebe/tdeaccess.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* +* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2000, 2010 Oracle and/or its affiliates. +* Copyright 2011 Timothy Pearson +* +* 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 +* +* for a copy of the LGPLv3 License. +* +************************************************************************/ + +#ifndef INCLUDED_SHELL_SOURCE_BACKENDS_TDEBE_TDEACCESS_HXX +#define INCLUDED_SHELL_SOURCE_BACKENDS_TDEBE_TDEACCESS_HXX + +#include "sal/config.h" + +#include "com/sun/star/beans/Optional.hpp" + +namespace com { namespace sun { namespace star { namespace uno { + class Any; +} } } } +namespace rtl { class OUString; } + +namespace tdeaccess { + +com::sun::star::beans::Optional< com::sun::star::uno::Any > getValue( + rtl::OUString const & id); + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/shell/source/backends/tdebe/tdebackend.cxx b/shell/source/backends/tdebe/tdebackend.cxx new file mode 100644 index 0000000..19eaa60 --- /dev/null +++ b/shell/source/backends/tdebe/tdebackend.cxx @@ -0,0 +1,262 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* +* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2000, 2010 Oracle and/or its affiliates. +* Copyright 2011 Timothy Pearson +* +* 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 +* +* for a copy of the LGPLv3 License. +* +************************************************************************/ + +#include "precompiled_shell.hxx" +#include "sal/config.h" + +#include "boost/noncopyable.hpp" +#include "com/sun/star/beans/Optional.hpp" +#include "com/sun/star/beans/PropertyVetoException.hpp" +#include "com/sun/star/beans/UnknownPropertyException.hpp" +#include "com/sun/star/beans/XPropertyChangeListener.hpp" +#include "com/sun/star/beans/XPropertySet.hpp" +#include "com/sun/star/beans/XPropertySetInfo.hpp" +#include "com/sun/star/beans/XVetoableChangeListener.hpp" +#include "com/sun/star/lang/IllegalArgumentException.hpp" +#include "com/sun/star/lang/WrappedTargetException.hpp" +#include "com/sun/star/lang/XMultiComponentFactory.hpp" +#include "com/sun/star/lang/XServiceInfo.hpp" +#include "com/sun/star/lang/WrappedTargetException.hpp" +#include "com/sun/star/uno/Any.hxx" +#include "com/sun/star/uno/Reference.hxx" +#include "com/sun/star/uno/RuntimeException.hpp" +#include "com/sun/star/uno/Sequence.hxx" +#include "com/sun/star/uno/XComponentContext.hpp" +#include "com/sun/star/uno/XCurrentContext.hpp" +#include "cppuhelper/factory.hxx" +#include "cppuhelper/implbase2.hxx" +#include "cppuhelper/implementationentry.hxx" +#include "cppuhelper/weak.hxx" +#include "rtl/string.h" +#include "rtl/ustring.h" +#include "rtl/ustring.hxx" +#include "sal/types.h" +#include "uno/current_context.hxx" +#include "uno/lbnames.h" + +#include "tde_headers.h" + +#include "tdeaccess.hxx" + +namespace { + +namespace css = com::sun::star; + +rtl::OUString SAL_CALL getServiceImplementationName() { + return rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.comp.configuration.backend.TDEBackend")); +} + +css::uno::Sequence< rtl::OUString > SAL_CALL getServiceSupportedServiceNames() { + rtl::OUString name( + RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.configuration.backend.TDEBackend")); + return css::uno::Sequence< rtl::OUString >(&name, 1); +} + +class Service: + public cppu::WeakImplHelper2< + css::lang::XServiceInfo, css::beans::XPropertySet >, + private boost::noncopyable +{ +public: + Service(); + +private: + virtual ~Service() {} + + virtual rtl::OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException) + { return getServiceImplementationName(); } + + virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName) + throw (css::uno::RuntimeException) + { return ServiceName == getSupportedServiceNames()[0]; } + + virtual css::uno::Sequence< rtl::OUString > SAL_CALL + getSupportedServiceNames() throw (css::uno::RuntimeException) + { return getServiceSupportedServiceNames(); } + + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL + getPropertySetInfo() throw (css::uno::RuntimeException) + { return css::uno::Reference< css::beans::XPropertySetInfo >(); } + + virtual void SAL_CALL setPropertyValue( + rtl::OUString const &, css::uno::Any const &) + throw ( + css::beans::UnknownPropertyException, + css::beans::PropertyVetoException, + css::lang::IllegalArgumentException, + css::lang::WrappedTargetException, css::uno::RuntimeException); + + virtual css::uno::Any SAL_CALL getPropertyValue( + rtl::OUString const & PropertyName) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException); + + virtual void SAL_CALL addPropertyChangeListener( + rtl::OUString const &, + css::uno::Reference< css::beans::XPropertyChangeListener > const &) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException) + {} + + virtual void SAL_CALL removePropertyChangeListener( + rtl::OUString const &, + css::uno::Reference< css::beans::XPropertyChangeListener > const &) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException) + {} + + virtual void SAL_CALL addVetoableChangeListener( + rtl::OUString const &, + css::uno::Reference< css::beans::XVetoableChangeListener > const &) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException) + {} + + virtual void SAL_CALL removeVetoableChangeListener( + rtl::OUString const &, + css::uno::Reference< css::beans::XVetoableChangeListener > const &) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException) + {} + + bool enabled_; +}; + +Service::Service(): enabled_(false) { + css::uno::Reference< css::uno::XCurrentContext > context( + css::uno::getCurrentContext()); + if (context.is()) { + rtl::OUString desktop; + context->getValueByName( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM("system.desktop-environment"))) >>= + desktop; + enabled_ = desktop.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("TDE")) && + TDEApplication::kApplication() != 0; + } +} + +void Service::setPropertyValue(rtl::OUString const &, css::uno::Any const &) + throw ( + css::beans::UnknownPropertyException, css::beans::PropertyVetoException, + css::lang::IllegalArgumentException, css::lang::WrappedTargetException, + css::uno::RuntimeException) +{ + throw css::lang::IllegalArgumentException( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM("setPropertyValue not supported")), + static_cast< cppu::OWeakObject * >(this), -1); +} + +css::uno::Any Service::getPropertyValue(rtl::OUString const & PropertyName) + throw ( + css::beans::UnknownPropertyException, css::lang::WrappedTargetException, + css::uno::RuntimeException) +{ + if (PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ExternalMailer")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("SourceViewFontName")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("WorkPathVariable")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy")) || + PropertyName.equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("ooInetProxyType"))) + { + return css::uno::makeAny( + enabled_ + ? tdeaccess::getValue(PropertyName) + : css::beans::Optional< css::uno::Any >()); + } + throw css::beans::UnknownPropertyException( + PropertyName, static_cast< cppu::OWeakObject * >(this)); +} + +css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( + css::uno::Reference< css::uno::XComponentContext > const &) +{ + return static_cast< cppu::OWeakObject * >(new Service); +} + +static cppu::ImplementationEntry const services[] = { + { &createInstance, &getServiceImplementationName, + &getServiceSupportedServiceNames, &cppu::createSingleComponentFactory, 0, + 0 }, + { 0, 0, 0, 0, 0, 0 } +}; + +} + +extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( + char const * pImplName, void * pServiceManager, void * pRegistryKey) +{ + return cppu::component_getFactoryHelper( + pImplName, pServiceManager, pRegistryKey, services); +} + +extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL +component_getImplementationEnvironment( + char const ** ppEnvTypeName, uno_Environment **) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo( + void * pServiceManager, void * pRegistryKey) +{ + return component_writeInfoHelper(pServiceManager, pRegistryKey, services); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/shell/source/backends/tdebe/tdebe1.component b/shell/source/backends/tdebe/tdebe1.component new file mode 100755 index 0000000..9eb7ca2 --- /dev/null +++ b/shell/source/backends/tdebe/tdebe1.component @@ -0,0 +1,35 @@ + + + + + + + + diff --git a/shell/source/unix/misc/makefile.mk b/shell/source/unix/misc/makefile.mk index 840f372..df4efa8 100644 --- a/shell/source/unix/misc/makefile.mk +++ b/shell/source/unix/misc/makefile.mk @@ -45,7 +45,8 @@ SCRIPTFILES = \ $(BIN)$/open-url \ $(BIN)$/cde-open-url \ $(BIN)$/gnome-open-url \ - $(BIN)$/kde-open-url + $(BIN)$/kde-open-url \ + $(BIN)$/tde-open-url APP1TARGET = gnome-open-url.bin APP1OBJS = \ diff --git a/shell/source/unix/misc/tde-open-url.sh b/shell/source/unix/misc/tde-open-url.sh new file mode 100644 index 0000000..fa05bde --- /dev/null +++ b/shell/source/unix/misc/tde-open-url.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# special handling for mailto: uris +if echo $1 | grep '^mailto:' > /dev/null; then + tdemailservice "$1" & +else + kfmclient openURL "$1" & +fi + +exit 0 diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk index 4ff643a..d871b05 100644 --- a/solenv/gbuild/gbuild.mk +++ b/solenv/gbuild/gbuild.mk @@ -268,6 +268,10 @@ ifneq ($(strip $(ENABLE_KDE)),) gb_GLOBALDEFS += -DENABLE_KDE endif +ifneq ($(strip $(ENABLE_TDE)),) +gb_GLOBALDEFS += -DENABLE_TDE +endif + ifneq ($(strip $(ENABLE_KDE4)),) gb_GLOBALDEFS += -DENABLE_KDE4 endif diff --git a/solenv/inc/unx.mk b/solenv/inc/unx.mk index 74ed8d5..d6ce918 100644 --- a/solenv/inc/unx.mk +++ b/solenv/inc/unx.mk @@ -179,4 +179,13 @@ SOLARLIB+=-L$(KDE_ROOT)/lib64 .ENDIF # "$(KDE_ROOT)"!="" .ENDIF # "$(ENABLE_KDE)" != "" +# enable building/linking TDE-dependent code in both OOo and SO build environment +.IF "$(ENABLE_TDE)" != "" +.IF "$(TDE_ROOT)"!="" +TDE_CFLAGS:=-I$(TDE_ROOT)/include -I/usr/include/tqt +TDE_LIBS:=-lkdeui -lkdecore -ltqt -lqt-mt +SOLARLIB+=-L$(TDE_ROOT)/lib +.ENDIF # "$(TDE_ROOT)"!="" +.ENDIF # "$(ENABLE_TDE)" != "" + OOO_LIBRARY_PATH_VAR *= LD_LIBRARY_PATH diff --git a/toolkit/source/layout/core/dialogbuttonhbox.cxx b/toolkit/source/layout/core/dialogbuttonhbox.cxx index 9c19306..741fc1c 100644 --- a/toolkit/source/layout/core/dialogbuttonhbox.cxx +++ b/toolkit/source/layout/core/dialogbuttonhbox.cxx @@ -48,6 +48,8 @@ DialogButtonHBox::Ordering const DialogButtonHBox::DEFAULT_ORDERING = DialogButtonHBox::WINDOWS; #elif defined( ENABLE_KDE ) DialogButtonHBox::KDE; +#elif defined( ENABLE_TDE ) +DialogButtonHBox::TDE; #else /* !MACOSX && !SAL_W32 && !ENABLE_KDE */ DialogButtonHBox::GNOME; #endif /* !MACOSX && !SAL_W32 && !ENABLE_KDE */ @@ -75,6 +77,8 @@ DialogButtonHBox::setOrdering( rtl::OUString const& ordering ) mnOrdering = GNOME; else if ( ordering.equalsIgnoreAsciiCaseAscii( "KDE" ) ) mnOrdering = KDE; + else if ( ordering.equalsIgnoreAsciiCaseAscii( "TDE" ) ) + mnOrdering = TDE; else if ( ordering.equalsIgnoreAsciiCaseAscii( "MacOS" ) ) mnOrdering = MACOS; else if ( ordering.equalsIgnoreAsciiCaseAscii( "Windows" ) ) @@ -135,6 +139,8 @@ DialogButtonHBox::orderChildren() macosOrdering(); else if ( mnOrdering == KDE ) kdeOrdering(); + else if ( mnOrdering == TDE ) + tdeOrdering(); else if ( 1 || mnOrdering == GNOME ) gnomeOrdering(); } @@ -229,6 +235,30 @@ DialogButtonHBox::kdeOrdering() } void +DialogButtonHBox::tdeOrdering() +{ + std::list< Box_Base::ChildData * > ordered; + if ( mpHelp ) + ordered.push_back( mpHelp ); + if ( mpReset ) + ordered.push_back( mpReset ); + if ( mpFlow && ( mpHelp || mpReset ) ) + ordered.push_back( mpFlow ); + ordered.insert( ordered.end(), maOther.begin(), maOther.end() ); + if ( mpAction ) + ordered.push_back( mpAction ); + if ( mpAffirmative ) + ordered.push_back( mpAffirmative ); + if ( mpApply ) + ordered.push_back( mpApply ); + if ( mpAlternate ) + ordered.push_back( mpAlternate ); + if ( mpCancel ) + ordered.push_back( mpCancel ); + maChildren = ordered; +} + +void DialogButtonHBox::macosOrdering() { std::list< Box_Base::ChildData * > ordered; diff --git a/toolkit/source/layout/core/dialogbuttonhbox.hxx b/toolkit/source/layout/core/dialogbuttonhbox.hxx index aead7fc..67845a1 100644 --- a/toolkit/source/layout/core/dialogbuttonhbox.hxx +++ b/toolkit/source/layout/core/dialogbuttonhbox.hxx @@ -45,11 +45,12 @@ public: void SAL_CALL removeChild( css::uno::Reference< css::awt::XLayoutConstrains > const& xChild ) throw ( css::uno::RuntimeException ); private: - enum Ordering { PLATFORM, GNOME, KDE, MACOS, WINDOWS }; + enum Ordering { PLATFORM, GNOME, KDE, TDE, MACOS, WINDOWS }; void orderChildren(); void gnomeOrdering(); void kdeOrdering(); + void tdeOrdering(); void macosOrdering(); void windowsOrdering(); diff --git a/vcl/Library_vclplug_kde.mk b/vcl/Library_vclplug_kde.mk index 19c42e0..014a96e 100644 --- a/vcl/Library_vclplug_kde.mk +++ b/vcl/Library_vclplug_kde.mk @@ -4,6 +4,7 @@ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # Copyright 2000, 2010 Oracle and/or its affiliates. +# Copyright 2011 Timothy Pearson # # OpenOffice.org - a multi-platform office productivity suite # @@ -26,9 +27,9 @@ # #************************************************************************* -$(eval $(call gb_Library_Library,vclplug_kde)) +$(eval $(call gb_Library_Library,vclplug_tde)) -$(eval $(call gb_Library_set_include,vclplug_kde,\ +$(eval $(call gb_Library_set_include,vclplug_tde,\ $$(INCLUDE) \ -I$(SRCDIR)/vcl/inc \ -I$(SRCDIR)/vcl/inc/pch \ @@ -36,25 +37,25 @@ $(eval $(call gb_Library_set_include,vclplug_kde,\ -I$(OUTDIR)/inc \ )) -$(eval $(call gb_Library_set_include,vclplug_kde,\ +$(eval $(call gb_Library_set_include,vclplug_tde,\ $$(INCLUDE) \ - $$(KDE_CFLAGS) \ + $$(TDE_CFLAGS) \ )) -$(eval $(call gb_Library_add_defs,vclplug_kde,\ - -DVCLPLUG_KDE_IMPLEMENTATION \ +$(eval $(call gb_Library_add_defs,vclplug_tde,\ + -DVCLPLUG_TDE_IMPLEMENTATION \ )) -$(eval $(call gb_Library_add_api,vclplug_kde,\ +$(eval $(call gb_Library_add_api,vclplug_tde,\ offapi \ udkapi \ )) -$(eval $(call gb_Library_add_libs,vclplug_kde,\ - $$(KDE_LIBS) \ +$(eval $(call gb_Library_add_libs,vclplug_tde,\ + $$(TDE_LIBS) \ )) -$(eval $(call gb_Library_add_linked_libs,vclplug_kde,\ +$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\ vclplug_gen \ vcl \ tl \ @@ -76,18 +77,18 @@ $(eval $(call gb_Library_add_linked_libs,vclplug_kde,\ ICE \ )) -$(eval $(call gb_Library_use_externals,vclplug_kde,\ +$(eval $(call gb_Library_use_externals,vclplug_tde,\ icule \ icuuc \ )) -$(eval $(call gb_Library_add_exception_objects,vclplug_kde,\ - vcl/unx/kde/kdedata \ - vcl/unx/kde/salnativewidgets-kde \ +$(eval $(call gb_Library_add_exception_objects,vclplug_tde,\ + vcl/unx/tde/tdedata \ + vcl/unx/tde/salnativewidgets-tde \ )) ifeq ($(OS),LINUX) -$(eval $(call gb_Library_add_linked_libs,vclplug_kde,\ +$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\ dl \ m \ pthread \ diff --git a/vcl/Library_vclplug_tde.mk b/vcl/Library_vclplug_tde.mk new file mode 100644 index 0000000..9a324a8 --- /dev/null +++ b/vcl/Library_vclplug_tde.mk @@ -0,0 +1,96 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# 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 +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +$(eval $(call gb_Library_Library,vclplug_tde)) + +$(eval $(call gb_Library_set_include,vclplug_tde,\ + $$(INCLUDE) \ + -I$(SRCDIR)/vcl/inc \ + -I$(SRCDIR)/vcl/inc/pch \ + -I$(SRCDIR)/solenv/inc \ + -I$(OUTDIR)/inc \ +)) + +$(eval $(call gb_Library_set_include,vclplug_tde,\ + $$(INCLUDE) \ + $$(TDE_CFLAGS) \ +)) + +$(eval $(call gb_Library_add_defs,vclplug_tde,\ + -DVCLPLUG_TDE_IMPLEMENTATION \ +)) + +$(eval $(call gb_Library_add_api,vclplug_tde,\ + offapi \ + udkapi \ +)) + +$(eval $(call gb_Library_add_libs,vclplug_tde,\ + $$(TDE_LIBS) \ +)) + +$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\ + vclplug_gen \ + vcl \ + tl \ + utl \ + sot \ + ucbhelper \ + basegfx \ + comphelper \ + cppuhelper \ + i18nisolang1 \ + i18npaper \ + i18nutil \ + jvmaccess \ + cppu \ + sal \ + X11 \ + Xext \ + SM \ + ICE \ +)) + +$(eval $(call gb_Library_use_externals,vclplug_tde,\ + icule \ + icuuc \ +)) + +$(eval $(call gb_Library_add_exception_objects,vclplug_tde,\ + vcl/unx/tde/tdedata \ + vcl/unx/tde/salnativewidgets-tde \ +)) + +ifeq ($(OS),LINUX) +$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\ + dl \ + m \ + pthread \ +)) +endif +# vim: set noet sw=4 ts=4: diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index 0a91f87..1de0022 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -59,6 +59,11 @@ $(eval $(call gb_Module_add_targets,vcl,\ Library_vclplug_kde \ )) endif +ifneq ($(ENABLE_TDE),) +$(eval $(call gb_Module_add_targets,vcl,\ + Library_vclplug_tde \ +)) +endif ifneq ($(ENABLE_KDE4),) $(eval $(call gb_Module_add_targets,vcl,\ Library_vclplug_kde4 \ diff --git a/vcl/inc/generic/gendata.hxx b/vcl/inc/generic/gendata.hxx index c52e891..e5b7b25 100644 --- a/vcl/inc/generic/gendata.hxx +++ b/vcl/inc/generic/gendata.hxx @@ -38,7 +38,7 @@ class SalGenericDisplay; class SalDisplay; class GtkSalDisplay; enum SalGenericDataType { SAL_DATA_GTK, SAL_DATA_GTK3, - SAL_DATA_KDE3, SAL_DATA_KDE4, + SAL_DATA_KDE3, SAL_DATA_TDE, SAL_DATA_KDE4, SAL_DATA_UNX, SAL_DATA_SVP }; class VCL_DLLPUBLIC SalGenericData : public SalData diff --git a/vcl/inc/unx/desktops.hxx b/vcl/inc/unx/desktops.hxx index de4ebb8..1d29c7d 100644 --- a/vcl/inc/unx/desktops.hxx +++ b/vcl/inc/unx/desktops.hxx @@ -34,6 +34,7 @@ enum DesktopType { DESKTOP_UNKNOWN, // unknown desktop, simple WM, etc. DESKTOP_GNOME, DESKTOP_KDE, + DESKTOP_TDE, DESKTOP_KDE4, DESKTOP_CDE }; // keep in sync with desktop_strings[] in salplug.cxx diff --git a/vcl/inc/unx/tde/tde_headers.h b/vcl/inc/unx/tde/tde_headers.h new file mode 100644 index 0000000..9c9f008 --- /dev/null +++ b/vcl/inc/unx/tde/tde_headers.h @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef INCLUDED_VCL_TDE_HEADERS_H +#define INCLUDED_VCL_TDE_HEADERS_H + +/* ********* Suppress warnings if needed */ +#include "sal/config.h" + +#include + +#if defined __GNUC__ +#pragma GCC system_header +#endif + + +/* ********* Hack, but needed because of conflicting types... */ +#define Region TQtXRegion + + +/* ********* TQt headers */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* ********* See hack on top of this file */ +#undef Region + + +/* ********* TDE base headers */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* ********* TDE address book connectivity headers */ +#include +#include +#include +#include + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/unx/tde/tdedata.hxx b/vcl/inc/unx/tde/tdedata.hxx new file mode 100644 index 0000000..fccdb49 --- /dev/null +++ b/vcl/inc/unx/tde/tdedata.hxx @@ -0,0 +1,114 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _VCL_TDEDATA_HXX +#define _VCL_TDEDATA_HXX + +#include +#include +#include + +class TDEData : public X11SalData +{ +public: + TDEData( SalInstance *pInstance ) : X11SalData( SAL_DATA_TDE, pInstance ) {} + virtual ~TDEData(); + + virtual void Init(); + virtual void initNWF(); + virtual void deInitNWF(); +}; + +class SalTDEDisplay : public SalX11Display +{ +public: + SalTDEDisplay( Display* pDisp ); + virtual ~SalTDEDisplay(); +}; + +class TDESalFrame : public X11SalFrame +{ + static const int nMaxGraphics = 2; + + struct GraphicsHolder + { + X11SalGraphics* pGraphics; + bool bInUse; + GraphicsHolder() + : pGraphics( NULL ), + bInUse( false ) + {} + ~GraphicsHolder(); + }; + GraphicsHolder m_aGraphics[ nMaxGraphics ]; + +public: + TDESalFrame( SalFrame* pParent, sal_uLong ); + virtual ~TDESalFrame(); + + virtual SalGraphics* GetGraphics(); + virtual void ReleaseGraphics( SalGraphics *pGraphics ); + virtual void updateGraphics( bool bClear ); + virtual void UpdateSettings( AllSettings& rSettings ); + virtual void Show( sal_Bool bVisible, sal_Bool bNoActivate ); +}; + +class TDESalInstance : public X11SalInstance +{ +public: + TDESalInstance( SalYieldMutex* pMutex ) + : X11SalInstance( pMutex ) {} + virtual ~TDESalInstance() {} + virtual SalFrame* CreateFrame( SalFrame* pParent, sal_uLong nStyle ); +}; + +class TDEXLib : public SalXLib +{ + bool m_bStartupDone; + void* m_pApplication; + char** m_pFreeCmdLineArgs; + char** m_pAppCmdLineArgs; + int m_nFakeCmdLineArgs; +public: + TDEXLib() : SalXLib(), + m_bStartupDone( false ), + m_pApplication( NULL ), + m_pFreeCmdLineArgs( NULL ), + m_pAppCmdLineArgs( NULL ), + m_nFakeCmdLineArgs( 0 ) + {} + virtual ~TDEXLib(); + virtual void Init(); + + void doStartup(); +}; + +#endif // _VCL_TDEDATA_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/vclpluginapi.h b/vcl/inc/vclpluginapi.h index 462943b..ae4123e 100644 --- a/vcl/inc/vclpluginapi.h +++ b/vcl/inc/vclpluginapi.h @@ -50,6 +50,12 @@ #define VCLPLUG_KDE_PUBLIC SAL_DLLPUBLIC_IMPORT #endif +#if defined VCLPLUG_TDE_IMPLEMENTATION +#define VCLPLUG_TDE_PUBLIC SAL_DLLPUBLIC_EXPORT +#else +#define VCLPLUG_TDE_PUBLIC SAL_DLLPUBLIC_IMPORT +#endif + #if defined VCLPLUG_KDE4_IMPLEMENTATION #define VCLPLUG_KDE4_PUBLIC SAL_DLLPUBLIC_EXPORT #else diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx index 1795d5a..62ebffd 100644 --- a/vcl/source/app/settings.cxx +++ b/vcl/source/app/settings.cxx @@ -831,6 +831,8 @@ sal_uLong StyleSettings::GetAutoSymbolsStyle() const nRet = STYLE_SYMBOLS_CRYSTAL; else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "kde4" ) ) nRet = STYLE_SYMBOLS_OXYGEN; + else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) ) + nRet = STYLE_SYMBOLS_CRYSTAL; } // falback to any existing style diff --git a/vcl/unx/generic/desktopdetect/desktopdetector.cxx b/vcl/unx/generic/desktopdetect/desktopdetector.cxx index 12ea4fc..2b9e2c9 100644 --- a/vcl/unx/generic/desktopdetect/desktopdetector.cxx +++ b/vcl/unx/generic/desktopdetect/desktopdetector.cxx @@ -210,6 +210,15 @@ static bool is_kde_desktop( Display* pDisplay ) return false; } +static bool is_tde_desktop( Display* pDisplay ) +{ + if ( NULL != getenv( "TDE_FULL_SESSION" ) ) + { + return true; + } + return false; +} + static bool is_kde4_desktop( Display* pDisplay ) { if ( NULL != getenv( "KDE_FULL_SESSION" ) ) @@ -238,6 +247,8 @@ DESKTOP_DETECTOR_PUBLIC DesktopType get_desktop_environment() { OString aOver( pOverride ); + if ( aOver.equalsIgnoreAsciiCase( "tde" ) ) + return DESKTOP_TDE; if ( aOver.equalsIgnoreAsciiCase( "kde4" ) ) return DESKTOP_KDE4; if ( aOver.equalsIgnoreAsciiCase( "gnome" ) ) @@ -301,7 +312,9 @@ DESKTOP_DETECTOR_PUBLIC DesktopType get_desktop_environment() XErrorHandler pOldHdl = XSetErrorHandler( autodect_error_handler ); - if ( is_kde4_desktop( pDisplay ) ) + if ( is_tde_desktop( pDisplay ) ) + ret = DESKTOP_TDE; + else if ( is_kde4_desktop( pDisplay ) ) ret = DESKTOP_KDE4; else if ( is_gnome_desktop( pDisplay ) ) ret = DESKTOP_GNOME; diff --git a/vcl/unx/generic/plugadapt/salplug.cxx b/vcl/unx/generic/plugadapt/salplug.cxx index 90f0d3e..875a9fb 100644 --- a/vcl/unx/generic/plugadapt/salplug.cxx +++ b/vcl/unx/generic/plugadapt/salplug.cxx @@ -148,7 +148,12 @@ static SalInstance* autodetect_plugin() { static const char* pKDEFallbackList[] = { - "kde4", "kde", "gtk3", "gtk", "gen", 0 + "kde4", "kde", "tde", "gtk3", "gtk", "gen", 0 + }; + + static const char* pTDEFallbackList[] = + { + "tde", "gtk3", "gtk", "gen", 0 }; static const char* pStandardFallbackList[] = @@ -177,6 +182,8 @@ static SalInstance* autodetect_plugin() } else if( desktop == DESKTOP_KDE4 ) pList = pKDEFallbackList; + else if( desktop == DESKTOP_TDE ) + pList = pTDEFallbackList; SalInstance* pInst = NULL; while( pList[nListEntry] && pInst == NULL ) @@ -224,7 +231,7 @@ SalInstance *CreateSalInstance() pInst = autodetect_plugin(); // fallback, try everything - const char* pPlugin[] = { "gtk3", "gtk", "kde4", "kde", "gen", 0 }; + const char* pPlugin[] = { "gtk3", "gtk", "kde4", "kde", "tde", "gen", 0 }; for ( int i = 0; !pInst && pPlugin[ i ]; ++i ) pInst = tryInstance( OUString::createFromAscii( pPlugin[ i ] ) ); @@ -279,7 +286,7 @@ void SalAbort( const XubString& rErrorText, bool bDumpCore ) _exit(1); } -static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4" }; +static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "TDE", "KDE4" }; const OUString& SalGetDesktopEnvironment() { diff --git a/vcl/unx/tde/salnativewidgets-tde.cxx b/vcl/unx/tde/salnativewidgets-tde.cxx new file mode 100644 index 0000000..7c173cc --- /dev/null +++ b/vcl/unx/tde/salnativewidgets-tde.cxx @@ -0,0 +1,2119 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#define _SV_SALNATIVEWIDGETS_TDE_CXX +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define USHORT unsigned short +#define BYTE unsigned char + +using namespace ::rtl; + +/** Cached native widgets. + + A class which caches and paints the native widgets. +*/ +class WidgetPainter +{ + protected: + /** Cached push button. + + It is necessary for the TQStyle::drawControl(). The buttons are created + on demand and they are still hidden (no TQWidget::show() is called). + */ + TQPushButton *m_pPushButton; + + /** Cached radio button. + + @see m_pPushButton + */ + TQRadioButton *m_pRadioButton; + + /** Cached check box. + + @see m_pPushButton + */ + TQCheckBox *m_pCheckBox; + + /** Cached combo box. + + @see m_pPushButton + */ + TQComboBox *m_pComboBox; + + /** Cached editable combo box. + + Needed, because some styles do not like dynamic changes + (TQComboBox::setEditable()). + + @see m_pPushButton + */ + TQComboBox *m_pEditableComboBox; + + /** Cached line edit box. + + @see m_pPushButton + */ + TQLineEdit *m_pLineEdit; + + /** Cached spin box. + + @see m_pPushButton + */ + TQSpinWidget *m_pSpinWidget; + + /** Cached spin box'es line edit. + + @see m_pPushButton + */ + TQLineEdit *m_pSpinEdit; + + /** Cached tab. + + Left, middle, right tab and a tab which is alone. + + @see m_pPushButton + */ + TQTab *m_pTabLeft, *m_pTabMiddle, *m_pTabRight, *m_pTabAlone; + + /** Cached tab bar's parent widget. + + Needed, because the Qt windows style checks for the availability + of tab bar's parent. We cannot use m_pTabWidget, because + TabWidget::setTabBar() and TabWidget::tabBar() methods are + protected. + + @see m_pPushButton, m_pTabWidget + */ + TQWidget *m_pTabBarParent; + + /** Cached tab bar widget. + + @see m_pPushButton + */ + TQTabBar *m_pTabBar; + + /** Cached tab widget. + + We need it to draw the tab page. It cannot be used to draw the + tabs themselves, because the drawing has to be tweaked a little + due to not enough information from VCL. + + @see m_pPushButton, m_pTabBarParent + */ + TQTabWidget *m_pTabWidget; + + /** Cached list view. + + @see m_pPushButton + */ + TQListView *m_pListView; + + /** Cached scroll bar. + + @see m_pPushButton + */ + TQScrollBar *m_pScrollBar; + + /** Cached dock area. Needed for proper functionality of tool bars. + + @see m_pPushButton + */ + TQMainWindow *m_pMainWindow; + + /** Cached tool bar. + + @see m_pPushButton + */ + TQToolBar *m_pToolBarHoriz, *m_pToolBarVert; + + /** Cached tool button. + + @see m_pPushButton + */ + TQToolButton *m_pToolButton; + + /** Cached menu bar. + + @see m_pPushButton + */ + TQMenuBar *m_pMenuBar; + + /** Identifiers of menu bar items. + */ + int m_nMenuBarEnabledItem, m_nMenuBarDisabledItem; + + /** Cached popup menu. + + @see m_pPushButton + */ + TQPopupMenu *m_pPopupMenu; + + /** Identifiers of popup menu items. + */ + int m_nPopupMenuEnabledItem, m_nPopupMenuDisabledItem; + + /** cached progress bar + */ + TQProgressBar *m_pProgressBar; + + // TODO other widgets + + public: + /** Implicit constructor. + + It creates an empty WidgetPainter with all the cached widgets initialized + to NULL. The widgets are created on demand and they are still hidden + (no TQWidget::show()), because they are needed just as a parameter for + TQStyle::drawControl(). + + @see m_pPushButton + */ + WidgetPainter( void ); + + /** Destructor. + + Destruct all the cached widgets. + */ + virtual ~WidgetPainter( void ); + + /** Paints the specified widget to the X window. + + Use X calls to bitblt (bit block transfer) the widget qWidget to + the window specified by drawable with the style defined by nStyle. + + @param qWidget + A pointer to the cached widget. + + @param nState + The state of the control (focused, on/off, ...) + + @param aValue + The value (true/false, ...) + + @param dpy + The display to be used by the X calls. + + @param drawable + The destination X window. + + @param gc + The graphics context. + */ + sal_Bool drawStyledWidget( TQWidget *pWidget, + ControlState nState, const ImplControlValue& aValue, + Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc, + ControlPart nPart = PART_ENTIRE_CONTROL ); + + /** 'Get' method for push button. + + The method returns the cached push button. It is constructed if it + does not exist. It has NULL as a parent and it stays hidden, but it + is necessary for the drawStyledWidget() method. + + @return valid push button. + */ + TQPushButton *pushButton( const Rectangle& rControlRegion, sal_Bool bDefault ); + + /** 'Get' method for radio button. + + @see pushButton() + */ + TQRadioButton *radioButton( const Rectangle& rControlRegion ); + + /** 'Get' method for check box. + + @see pushButton() + */ + TQCheckBox *checkBox( const Rectangle& rControlRegion ); + + /** 'Get' method for combo box. + + It returns m_pComboBox or m_pEditableComboBox according to + bEditable. + + @see pushButton(), m_pEditableComboBox + */ + TQComboBox *comboBox( const Rectangle& rControlRegion, sal_Bool bEditable ); + + /** 'Get' method for line edit box. + + @see pushButton() + */ + TQLineEdit *lineEdit( const Rectangle& rControlRegion ); + + /** 'Get' method for spin box. + + @see pushButton() + */ + TQSpinWidget *spinWidget( const Rectangle& rControlRegion ); + + /** 'Get' method for tab bar. + + @see pushButton() + */ + TQTabBar *tabBar( const Rectangle& rControlRegion ); + + /** 'Get' method for tab widget. + + @see pushButton() + */ + TQTabWidget *tabWidget( const Rectangle& rControlRegion ); + + /** 'Get' method for list view. + + @see pushButton() + */ + TQListView *listView( const Rectangle& rControlRegion ); + + /** 'Get' method for scroll bar. + + @see pushButton() + */ + TQScrollBar *scrollBar( const Rectangle& rControlRegion, + sal_Bool bHorizontal, const ImplControlValue& aValue ); + + /** 'Get' method for tool bar. + + @see pushButton() + */ + TQToolBar *toolBar( const Rectangle& rControlRegion, sal_Bool bHorizontal ); + + /** 'Get' method for tool button. + + @see pushButton() + */ + TQToolButton *toolButton( const Rectangle& rControlRegion ); + + /** 'Get' method for menu bar. + + @see pushButton() + */ + TQMenuBar *menuBar( const Rectangle& rControlRegion ); + + /** 'Get' method for popup menu. + + @see pushButton() + */ + TQPopupMenu *popupMenu( const Rectangle& rControlRegion ); + + /** 'Get' method for progress bar + + @see pushButton() + */ + TQProgressBar *progressBar( const Rectangle& rControlRegion ); + + // TODO other widgets + + protected: + /** Style conversion function. + + Conversion function between VCL ControlState together with + ImplControlValue and Qt state flags. + + @param nState + State of the widget (default, focused, ...) as defined in Native + Widget Framework. + + @param aValue + Value held by the widget (on, off, ...) + */ + TQStyle::SFlags vclStateValue2SFlags( ControlState nState, const ImplControlValue& aValue ); + + public: + /** Convert VCL Rectangle to TQRect. + + @param rControlRegion + The region to convert. + + @return + The bounding box of the region. + */ + static TQRect region2TQRect( const Rectangle& rControlRegion ); +}; + +WidgetPainter::WidgetPainter( void ) + : m_pPushButton( NULL ), + m_pRadioButton( NULL ), + m_pCheckBox( NULL ), + m_pComboBox( NULL ), + m_pEditableComboBox( NULL ), + m_pLineEdit( NULL ), + m_pSpinWidget( NULL ), + m_pSpinEdit( NULL ), + m_pTabLeft( NULL ), + m_pTabMiddle( NULL ), + m_pTabRight( NULL ), + m_pTabAlone( NULL ), + m_pTabBarParent( NULL ), + m_pTabBar( NULL ), + m_pTabWidget( NULL ), + m_pListView( NULL ), + m_pScrollBar( NULL ), + m_pMainWindow( NULL ), + m_pToolBarHoriz( NULL ), + m_pToolBarVert( NULL ), + m_pToolButton( NULL ), + m_pMenuBar( NULL ), + m_pPopupMenu( NULL ), + m_pProgressBar( NULL ) +{ +} + +WidgetPainter::~WidgetPainter( void ) +{ + delete m_pPushButton, m_pPushButton = NULL; + delete m_pRadioButton, m_pRadioButton = NULL; + delete m_pCheckBox, m_pCheckBox = NULL; + delete m_pComboBox, m_pComboBox = NULL; + delete m_pEditableComboBox, m_pEditableComboBox = NULL; + delete m_pLineEdit, m_pLineEdit = NULL; + delete m_pSpinWidget, m_pSpinWidget = NULL; + m_pSpinEdit = NULL; // Deleted in m_pSpinWidget's destructor + delete m_pTabAlone, m_pTabAlone = NULL; + delete m_pTabBarParent, m_pTabBarParent = NULL; + m_pTabBar = NULL; // Deleted in m_pTabBarParent's destructor + m_pTabLeft = NULL; + m_pTabMiddle = NULL; + m_pTabRight = NULL; + delete m_pTabWidget, m_pTabWidget = NULL; + delete m_pListView, m_pListView = NULL; + delete m_pScrollBar, m_pScrollBar = NULL; + delete m_pToolBarHoriz, m_pToolBarHoriz = NULL; + delete m_pToolBarVert, m_pToolBarVert = NULL; + delete m_pMainWindow, m_pMainWindow = NULL; + delete m_pToolButton, m_pToolButton = NULL; + delete m_pMenuBar, m_pMenuBar = NULL; + delete m_pPopupMenu, m_pPopupMenu = NULL; + delete m_pProgressBar, m_pProgressBar = NULL; +} + +sal_Bool WidgetPainter::drawStyledWidget( TQWidget *pWidget, + ControlState nState, const ImplControlValue& aValue, + Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc, + ControlPart nPart ) +{ + if ( !pWidget ) + return FALSE; + + // Normalize the widget + TQPoint qWidgetPos( pWidget->pos() ); + pWidget->move( 0, 0 ); + + // Enable/disable the widget + pWidget->setEnabled( nState & CTRL_STATE_ENABLED ); + + // Create pixmap to paint to + TQPixmap qPixmap( pWidget->width(), pWidget->height() ); + TQPainter qPainter( &qPixmap ); + TQRect qRect( 0, 0, pWidget->width(), pWidget->height() ); + + // Use the background of the widget + qPixmap.fill( pWidget, TQPoint(0, 0) ); + + // Convert the flags + TQStyle::SFlags nStyle = vclStateValue2SFlags( nState, aValue ); + + // Store the widget class + const char *pClassName = pWidget->className(); + + // Draw the widget to the pixmap + if ( strcmp( TQPUSHBUTTON_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + // Workaround for the Platinum style. + // Platinum takes the state directly from the widget, not from SFlags. + TQPushButton *pPushButton = static_cast( pWidget->qt_cast( TQPUSHBUTTON_OBJECT_NAME_STRING ) ); + if ( pPushButton ) + { + pPushButton->setDown ( nStyle & TQStyle::Style_Down ); + pPushButton->setOn ( nStyle & TQStyle::Style_On ); + pPushButton->setEnabled( nStyle & TQStyle::Style_Enabled ); + } + + kapp->style().drawControl( TQStyle::CE_PushButton, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle ); + } + else if ( strcmp( TQRADIOBUTTON_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + // Bitblt from the screen, because the radio buttons are usually not + // rectangular, and there could be a bitmap under them + GC aTmpGC = XCreateGC( dpy, qPixmap.handle(), 0, NULL ); + X11SalGraphics::CopyScreenArea( dpy, + drawable, nScreen, nDepth, + qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(), + aTmpGC, + qWidgetPos.x(), qWidgetPos.y(), qRect.width(), qRect.height(), + 0, 0 ); + XFreeGC( dpy, aTmpGC ); + + kapp->style().drawControl( TQStyle::CE_RadioButton, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle ); + } + else if ( strcmp( TQCHECKBOX_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + kapp->style().drawControl( TQStyle::CE_CheckBox, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle ); + } + else if ( strcmp( TQCOMBOBOX_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + kapp->style().drawComplexControl( TQStyle::CC_ComboBox, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle ); + + // Editable combo box uses the background of the associated edit box + TQComboBox *pComboBox = static_cast( pWidget->qt_cast( TQCOMBOBOX_OBJECT_NAME_STRING ) ); + if ( pComboBox && pComboBox->editable() && pComboBox->lineEdit() ) + { + TQColorGroup::ColorRole eColorRole = ( pComboBox->isEnabled() )? + TQColorGroup::Base: TQColorGroup::Background; + qPainter.fillRect( + kapp->style().querySubControlMetrics( TQStyle::CC_ComboBox, + pComboBox, TQStyle::SC_ComboBoxEditField ), + pComboBox->lineEdit()->colorGroup().brush( eColorRole ) ); + } + } + else if ( strcmp( TQLINEEDIT_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + kapp->style().drawPrimitive( TQStyle::PE_PanelLineEdit, + &qPainter, qRect, + pWidget->colorGroup(), nStyle | TQStyle::Style_Sunken ); + } + else if ( strcmp( TQSPINWIDGET_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + const SpinbuttonValue *pValue = static_cast ( &aValue ); + + // Is any of the buttons pressed? + TQStyle::SCFlags eActive = TQStyle::SC_None; + if ( pValue ) + { + if ( pValue->mnUpperState & CTRL_STATE_PRESSED ) + eActive = TQStyle::SC_SpinWidgetUp; + else if ( pValue->mnLowerState & CTRL_STATE_PRESSED ) + eActive = TQStyle::SC_SpinWidgetDown; + + // Update the enable/disable state of the widget + if ( ( nState & CTRL_STATE_ENABLED ) || + ( pValue->mnUpperState & CTRL_STATE_ENABLED ) || + ( pValue->mnLowerState & CTRL_STATE_ENABLED ) ) + { + pWidget->setEnabled( true ); + nStyle |= TQStyle::Style_Enabled; + } + else + pWidget->setEnabled( false ); + + // Mouse-over effect + if ( (pValue->mnUpperState & CTRL_STATE_ROLLOVER) || + (pValue->mnLowerState & CTRL_STATE_ROLLOVER) ) + nStyle |= TQStyle::Style_MouseOver; + } + + // Spin widget uses the background of the associated edit box + TQSpinWidget *pSpinWidget = static_cast( pWidget->qt_cast( TQSPINWIDGET_OBJECT_NAME_STRING ) ); + if ( pSpinWidget && pSpinWidget->editWidget() ) + { + TQColorGroup::ColorRole eColorRole = ( pSpinWidget->isEnabled() )? + TQColorGroup::Base: TQColorGroup::Background; + qPainter.fillRect( + kapp->style().querySubControlMetrics( TQStyle::CC_SpinWidget, + pSpinWidget, TQStyle::SC_SpinWidgetEditField ), + pSpinWidget->editWidget()->colorGroup().brush( eColorRole ) ); + } + + // Adjust the frame (needed for Motif Plus style) + TQRect qFrameRect = kapp->style().querySubControlMetrics( TQStyle::CC_SpinWidget, + pWidget, TQStyle::SC_SpinWidgetFrame ); + + kapp->style().drawComplexControl( TQStyle::CC_SpinWidget, + &qPainter, pWidget, qFrameRect, + pWidget->colorGroup(), nStyle, + TQStyle::SC_All, eActive ); + } + else if ( strcmp( TQTABBAR_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + const TabitemValue *pValue = static_cast ( &aValue ); + + TQTab *pTab = NULL; + if ( pValue ) + { + if ( ( pValue->isFirst() || pValue->isLeftAligned() ) && ( pValue->isLast() || pValue->isRightAligned() ) ) + pTab = m_pTabAlone; + else if ( pValue->isFirst() || pValue->isLeftAligned() ) + pTab = m_pTabLeft; + else if ( pValue->isLast() || pValue->isRightAligned() ) + pTab = m_pTabRight; + else + pTab = m_pTabMiddle; + } + if ( !pTab ) + return FALSE; + + pTab->setRect( qRect ); + + kapp->style().drawControl( TQStyle::CE_TabBarTab, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle, + TQStyleOption( pTab ) ); + } + else if ( strcmp( TQTABWIDGET_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + kapp->style().drawPrimitive( TQStyle::PE_PanelTabWidget, + &qPainter, qRect, + pWidget->colorGroup(), nStyle ); + } + else if ( strcmp( TQLISTVIEW_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + kapp->style().drawPrimitive( TQStyle::PE_Panel, + &qPainter, qRect, + pWidget->colorGroup(), nStyle | TQStyle::Style_Sunken ); + } + else if ( strcmp( TQSCROLLBAR_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + const ScrollbarValue *pValue = static_cast ( &aValue ); + + TQStyle::SCFlags eActive = TQStyle::SC_None; + if ( pValue ) + { + // Workaround for Style_MouseOver-aware themes. + // Quite ugly, but I do not know about a better solution. + const char *pStyleName = kapp->style().className(); + if ( strcmp( "QMotifPlusStyle", pStyleName ) == 0 ) + { + nStyle |= TQStyle::Style_MouseOver; + if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER ) + eActive = TQStyle::SC_ScrollBarSlider; + } + else if ( strcmp( "QSGIStyle", pStyleName ) == 0 ) + { + nStyle |= TQStyle::Style_MouseOver; + if ( pValue->mnButton1State & CTRL_STATE_ROLLOVER ) + eActive = TQStyle::SC_ScrollBarSubLine; + else if ( pValue->mnButton2State & CTRL_STATE_ROLLOVER ) + eActive = TQStyle::SC_ScrollBarAddLine; + else if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER ) + eActive = TQStyle::SC_ScrollBarSlider; + } + + if ( pValue->mnButton1State & CTRL_STATE_PRESSED ) + eActive = TQStyle::SC_ScrollBarSubLine; + else if ( pValue->mnButton2State & CTRL_STATE_PRESSED ) + eActive = TQStyle::SC_ScrollBarAddLine; + else if ( pValue->mnThumbState & CTRL_STATE_PRESSED ) + eActive = TQStyle::SC_ScrollBarSlider; + else if ( pValue->mnPage1State & CTRL_STATE_PRESSED ) + eActive = TQStyle::SC_ScrollBarSubPage; + else if ( pValue->mnPage2State & CTRL_STATE_PRESSED ) + eActive = TQStyle::SC_ScrollBarAddPage; + + // Update the enable/disable state of the widget + if ( ( nState & CTRL_STATE_ENABLED ) || + ( pValue->mnButton1State & CTRL_STATE_ENABLED ) || + ( pValue->mnButton2State & CTRL_STATE_ENABLED ) || + ( pValue->mnThumbState & CTRL_STATE_ENABLED ) || + ( pValue->mnPage1State & CTRL_STATE_ENABLED ) || + ( pValue->mnPage2State & CTRL_STATE_ENABLED ) ) + { + pWidget->setEnabled( true ); + nStyle |= TQStyle::Style_Enabled; + } + else + pWidget->setEnabled( false ); + } + + // Is it a horizontal scroll bar? + TQScrollBar *pScrollBar = static_cast ( pWidget->qt_cast( TQSCROLLBAR_OBJECT_NAME_STRING ) ); + TQStyle::StyleFlags eHoriz = TQStyle::Style_Default; + if ( pScrollBar && pScrollBar->orientation() == Qt::Horizontal ) + eHoriz = TQStyle::Style_Horizontal; + + kapp->style().drawComplexControl( TQStyle::CC_ScrollBar, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle | eHoriz, + TQStyle::SC_All, eActive ); + } + else if ( strcmp( TQTOOLBAR_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + TQToolBar *pToolBar = static_cast< TQToolBar * >( pWidget->qt_cast( TQTOOLBAR_OBJECT_NAME_STRING ) ); + bool bIsHorizontal = false; + if ( pToolBar && pToolBar->orientation() == Qt::Horizontal ) + { + nStyle |= TQStyle::Style_Horizontal; + bIsHorizontal = true; + } + + kapp->style().drawControl( TQStyle::CE_DockWindowEmptyArea, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle ); + + kapp->style().drawPrimitive( TQStyle::PE_PanelDockWindow, + &qPainter, qRect, pWidget->colorGroup(), nStyle ); + + if ( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT ) + { + const ToolbarValue *pValue = static_cast< const ToolbarValue * >( &aValue ); + + TQRect qThumbRect = region2TQRect( pValue->maGripRect ); + qThumbRect.moveBy( -qWidgetPos.x(), -qWidgetPos.y() ); + if ( bIsHorizontal ) + qThumbRect.addCoords( 0, 2, 0, -3 ); // make the thumb a bit nicer + else + qThumbRect.addCoords( 2, 0, -3, 0 ); // make the thumb a bit nicer + + if ( kapp->style().inherits( "HighColorStyle" ) || + kapp->style().inherits( "HighContrastStyle" ) || + kapp->style().inherits( "KeramikStyle" ) || + kapp->style().inherits( "KThemeStyle" ) || + kapp->style().inherits( "ThinKeramikStyle" ) ) + { + // Workaround for the workaround in TDEStyle::drawPrimitive() + TDEStyle *pStyle = static_cast< TDEStyle * >( &kapp->style() ); + pStyle->drawTDEStylePrimitive( TDEStyle::KPE_ToolBarHandle, + &qPainter, pToolBar, qThumbRect, + pWidget->colorGroup(), nStyle ); + } + else + kapp->style().drawPrimitive( TQStyle::PE_DockWindowHandle, + &qPainter, qThumbRect, pWidget->colorGroup(), nStyle ); + } + } + else if ( strcmp( TQTOOLBUTTON_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + if( (nStyle & TQStyle::Style_MouseOver) ) + nStyle &= ~TQStyle::Style_Off; + kapp->style().drawComplexControl( TQStyle::CC_ToolButton, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle, + TQStyle::SC_ToolButton ); + } + else if ( strcmp( TQMENUBAR_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + if ( nPart == PART_ENTIRE_CONTROL ) + { + kapp->style().drawControl( TQStyle::CE_MenuBarEmptyArea, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle ); + } + else if ( nPart == PART_MENU_ITEM ) + { + int nMenuItem = ( nStyle & TQStyle::Style_Enabled )? m_nMenuBarEnabledItem: m_nMenuBarDisabledItem; + TQMenuItem *pMenuItem = static_cast( pWidget )->findItem( nMenuItem ); + + if ( nStyle & TQStyle::Style_Selected ) + nStyle |= TQStyle::Style_Active | TQStyle::Style_Down | TQStyle::Style_HasFocus; + + kapp->style().drawControl( TQStyle::CE_MenuBarItem, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle, + TQStyleOption( pMenuItem ) ); + } + } + else if ( strcmp( TQPOPUPMENU_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + int nMenuItem = ( nStyle & TQStyle::Style_Enabled )? m_nPopupMenuEnabledItem: m_nPopupMenuDisabledItem; + TQMenuItem *pMenuItem = static_cast( pWidget )->findItem( nMenuItem ); + + if ( nStyle & TQStyle::Style_Selected ) + nStyle |= TQStyle::Style_Active; + + kapp->style().drawControl( TQStyle::CE_PopupMenuItem, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle, + TQStyleOption( pMenuItem, 0, 0 ) ); + } + else if ( strcmp( TQPROGRESSBAR_OBJECT_NAME_STRING, pClassName ) == 0 ) + { + long nProgressWidth = aValue.getNumericVal(); + TQProgressBar* pProgress = static_cast(pWidget); + pProgress->setProgress( nProgressWidth, qRect.width() ); + + kapp->style().drawControl( TQStyle::CE_ProgressBarGroove, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle ); + kapp->style().drawControl( TQStyle::CE_ProgressBarContents, + &qPainter, pWidget, qRect, + pWidget->colorGroup(), nStyle ); + } + else + return FALSE; + + // Bitblt it to the screen + X11SalGraphics::CopyScreenArea( dpy, + qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(), + drawable, nScreen, nDepth, + gc, + 0, 0, qRect.width(), qRect.height(), + qWidgetPos.x(), qWidgetPos.y() ); + + // Restore widget's position + pWidget->move( qWidgetPos ); + + return TRUE; +} + +TQPushButton *WidgetPainter::pushButton( const Rectangle& rControlRegion, + sal_Bool bDefault ) +{ + if ( !m_pPushButton ) + m_pPushButton = new TQPushButton( NULL, "push_button" ); + + TQRect qRect = region2TQRect( rControlRegion ); + + // Workaround for broken styles which do not add + // TQStyle::PM_ButtonDefaultIndicator to the size of the default button + // (for example Keramik) + // FIXME Fix Keramik style to be consistant with Qt built-in styles. Aargh! + if ( bDefault ) + { + TQSize qContentsSize( 50, 50 ); + m_pPushButton->setDefault( false ); + TQSize qNormalSize = kapp->style().sizeFromContents( TQStyle::CT_PushButton, + m_pPushButton, qContentsSize ); + m_pPushButton->setDefault( true ); + TQSize qDefSize = kapp->style().sizeFromContents( TQStyle::CT_PushButton, + m_pPushButton, qContentsSize ); + + int nIndicatorSize = kapp->style().pixelMetric( + TQStyle::PM_ButtonDefaultIndicator, m_pPushButton ); + if ( qNormalSize.width() == qDefSize.width() ) + qRect.addCoords( nIndicatorSize, 0, -nIndicatorSize, 0 ); + if ( qNormalSize.height() == qDefSize.height() ) + qRect.addCoords( 0, nIndicatorSize, 0, -nIndicatorSize ); + } + + m_pPushButton->move( qRect.topLeft() ); + m_pPushButton->resize( qRect.size() ); + m_pPushButton->setDefault( bDefault ); + + return m_pPushButton; +} + +TQRadioButton *WidgetPainter::radioButton( const Rectangle& rControlRegion ) +{ + if ( !m_pRadioButton ) + m_pRadioButton = new TQRadioButton( NULL, "radio_button" ); + + TQRect qRect = region2TQRect( rControlRegion ); + + // Workaround for broken themes which do not honor the given size. + // Quite ugly, but I do not know about a better solution. + const char *pStyleName = kapp->style().className(); + if ( strcmp( "KThemeStyle", pStyleName ) == 0 ) + { + TQRect qOldRect( qRect ); + + qRect.setWidth( kapp->style().pixelMetric( + TQStyle::PM_ExclusiveIndicatorWidth, m_pRadioButton ) ); + qRect.setHeight( kapp->style().pixelMetric( + TQStyle::PM_ExclusiveIndicatorHeight, m_pRadioButton ) ); + + qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2, + ( qOldRect.height() - qRect.height() ) / 2 ); + } + + m_pRadioButton->move( qRect.topLeft() ); + m_pRadioButton->resize( qRect.size() ); + + return m_pRadioButton; +} + +TQCheckBox *WidgetPainter::checkBox( const Rectangle& rControlRegion ) +{ + if ( !m_pCheckBox ) + m_pCheckBox = new TQCheckBox( NULL, "check_box" ); + + TQRect qRect = region2TQRect( rControlRegion ); + + // Workaround for broken themes which do not honor the given size. + // Quite ugly, but I do not know about a better solution. + const char *pStyleName = kapp->style().className(); + if ( strcmp( "KThemeStyle", pStyleName ) == 0 ) + { + TQRect qOldRect( qRect ); + + qRect.setWidth( kapp->style().pixelMetric( + TQStyle::PM_IndicatorWidth, m_pCheckBox ) ); + qRect.setHeight( kapp->style().pixelMetric( + TQStyle::PM_IndicatorHeight, m_pCheckBox ) ); + + qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2, + ( qOldRect.height() - qRect.height() ) / 2 ); + } + + m_pCheckBox->move( qRect.topLeft() ); + m_pCheckBox->resize( qRect.size() ); + + return m_pCheckBox; +} + +TQComboBox *WidgetPainter::comboBox( const Rectangle& rControlRegion, + sal_Bool bEditable ) +{ + TQComboBox *pComboBox = NULL; + if ( bEditable ) + { + if ( !m_pEditableComboBox ) + m_pEditableComboBox = new TQComboBox( true, NULL, "combo_box_edit" ); + pComboBox = m_pEditableComboBox; + } + else + { + if ( !m_pComboBox ) + m_pComboBox = new TQComboBox( false, NULL, "combo_box" ); + pComboBox = m_pComboBox; + } + + TQRect qRect = region2TQRect( rControlRegion ); + + pComboBox->move( qRect.topLeft() ); + pComboBox->resize( qRect.size() ); + + return pComboBox; +} + +TQLineEdit *WidgetPainter::lineEdit( const Rectangle& rControlRegion ) +{ + if ( !m_pLineEdit ) + m_pLineEdit = new TQLineEdit( NULL, "line_edit" ); + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pLineEdit->move( qRect.topLeft() ); + m_pLineEdit->resize( qRect.size() ); + + return m_pLineEdit; +} + +TQSpinWidget *WidgetPainter::spinWidget( const Rectangle& rControlRegion ) +{ + if ( !m_pSpinWidget ) + { + m_pSpinWidget = new TQSpinWidget( NULL, "spin_widget" ); + + m_pSpinEdit = new TQLineEdit( NULL, "line_edit_spin" ); + m_pSpinWidget->setEditWidget( m_pSpinEdit ); + } + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pSpinWidget->move( qRect.topLeft() ); + m_pSpinWidget->resize( qRect.size() ); + m_pSpinWidget->arrange(); + + return m_pSpinWidget; +} + +TQTabBar *WidgetPainter::tabBar( const Rectangle& rControlRegion ) +{ + if ( !m_pTabBar ) + { + if ( !m_pTabBarParent ) + m_pTabBarParent = new TQWidget( NULL, "tab_bar_parent" ); + + m_pTabBar = new TQTabBar( m_pTabBarParent, "tab_bar" ); + + m_pTabLeft = new TQTab(); + m_pTabMiddle = new TQTab(); + m_pTabRight = new TQTab(); + m_pTabAlone = new TQTab(); + + m_pTabBar->addTab( m_pTabLeft ); + m_pTabBar->addTab( m_pTabMiddle ); + m_pTabBar->addTab( m_pTabRight ); + } + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pTabBar->move( qRect.topLeft() ); + m_pTabBar->resize( qRect.size() ); + + m_pTabBar->setShape( TQTabBar::RoundedAbove ); + + return m_pTabBar; +} + +TQTabWidget *WidgetPainter::tabWidget( const Rectangle& rControlRegion ) +{ + if ( !m_pTabWidget ) + m_pTabWidget = new TQTabWidget( NULL, "tab_widget" ); + + TQRect qRect = region2TQRect( rControlRegion ); + --qRect.rTop(); + + m_pTabWidget->move( qRect.topLeft() ); + m_pTabWidget->resize( qRect.size() ); + + return m_pTabWidget; +} + +TQListView *WidgetPainter::listView( const Rectangle& rControlRegion ) +{ + if ( !m_pListView ) + m_pListView = new TQListView( NULL, "list_view" ); + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pListView->move( qRect.topLeft() ); + m_pListView->resize( qRect.size() ); + + return m_pListView; +} + +TQScrollBar *WidgetPainter::scrollBar( const Rectangle& rControlRegion, + sal_Bool bHorizontal, const ImplControlValue& aValue ) +{ + if ( !m_pScrollBar ) + { + m_pScrollBar = new TQScrollBar( NULL, "scroll_bar" ); + m_pScrollBar->setTracking( false ); + m_pScrollBar->setLineStep( 1 ); + } + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pScrollBar->move( qRect.topLeft() ); + m_pScrollBar->resize( qRect.size() ); + m_pScrollBar->setOrientation( bHorizontal? Qt::Horizontal: Qt::Vertical ); + + const ScrollbarValue *pValue = static_cast ( &aValue ); + if ( pValue ) + { + m_pScrollBar->setMinValue( pValue->mnMin ); + m_pScrollBar->setMaxValue( pValue->mnMax - pValue->mnVisibleSize ); + m_pScrollBar->setValue( pValue->mnCur ); + m_pScrollBar->setPageStep( pValue->mnVisibleSize ); + } + + return m_pScrollBar; +} + +TQToolBar *WidgetPainter::toolBar( const Rectangle& rControlRegion, sal_Bool bHorizontal ) +{ + if ( !m_pMainWindow ) + m_pMainWindow = new TQMainWindow( NULL, "main_window" ); + + TQToolBar *pToolBar; + if ( bHorizontal ) + { + if ( !m_pToolBarHoriz ) + { + m_pToolBarHoriz = new TQToolBar( m_pMainWindow, "tool_bar_horiz" ); + m_pMainWindow->moveDockWindow( m_pToolBarHoriz, Qt::DockTop ); + } + pToolBar = m_pToolBarHoriz; + } + else + { + if ( !m_pToolBarVert ) + { + m_pToolBarVert = new TQToolBar( m_pMainWindow, "tool_bar_horiz" ); + m_pMainWindow->moveDockWindow( m_pToolBarVert, Qt::DockLeft ); + } + pToolBar = m_pToolBarVert; + } + + TQRect qRect = region2TQRect( rControlRegion ); + + pToolBar->move( qRect.topLeft() ); + pToolBar->resize( qRect.size() ); + + return pToolBar; +} + +TQToolButton *WidgetPainter::toolButton( const Rectangle& rControlRegion) +{ + if ( !m_pToolButton ) + m_pToolButton = new TQToolButton( NULL, "tool_button" ); + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pToolButton->move( qRect.topLeft() ); + m_pToolButton->resize( qRect.size() ); + + return m_pToolButton; +} + +TQMenuBar *WidgetPainter::menuBar( const Rectangle& rControlRegion) +{ + if ( !m_pMenuBar ) + { + m_pMenuBar = new TQMenuBar( NULL, "menu_bar" ); + + m_nMenuBarEnabledItem = m_pMenuBar->insertItem( "" ); + m_nMenuBarDisabledItem = m_pMenuBar->insertItem( "" ); + + m_pMenuBar->setItemEnabled( m_nMenuBarEnabledItem, true ); + m_pMenuBar->setItemEnabled( m_nMenuBarDisabledItem, false ); + } + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pMenuBar->move( qRect.topLeft() ); + m_pMenuBar->resize( qRect.size() ); + + return m_pMenuBar; +} + +TQPopupMenu *WidgetPainter::popupMenu( const Rectangle& rControlRegion) +{ + if ( !m_pPopupMenu ) + { + m_pPopupMenu = new TQPopupMenu( NULL, "popup_menu" ); + + m_nPopupMenuEnabledItem = m_pPopupMenu->insertItem( "" ); + m_nPopupMenuDisabledItem = m_pPopupMenu->insertItem( "" ); + + m_pPopupMenu->setItemEnabled( m_nPopupMenuEnabledItem, true ); + m_pPopupMenu->setItemEnabled( m_nPopupMenuDisabledItem, false ); + } + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pPopupMenu->move( qRect.topLeft() ); + m_pPopupMenu->resize( qRect.size() ); + + return m_pPopupMenu; +} + +TQProgressBar *WidgetPainter::progressBar( const Rectangle& rControlRegion ) +{ + if ( !m_pProgressBar ) + m_pProgressBar = new TQProgressBar( NULL, "progress_bar" ); + + TQRect qRect = region2TQRect( rControlRegion ); + + m_pProgressBar->move( qRect.topLeft() ); + m_pProgressBar->resize( qRect.size() ); + + return m_pProgressBar; +} + +TQStyle::SFlags WidgetPainter::vclStateValue2SFlags( ControlState nState, + const ImplControlValue& aValue ) +{ + TQStyle::SFlags nStyle = + ( (nState & CTRL_STATE_DEFAULT)? TQStyle::Style_ButtonDefault: TQStyle::Style_Default ) | + ( (nState & CTRL_STATE_ENABLED)? TQStyle::Style_Enabled: TQStyle::Style_Default ) | + ( (nState & CTRL_STATE_FOCUSED)? TQStyle::Style_HasFocus: TQStyle::Style_Default ) | + ( (nState & CTRL_STATE_PRESSED)? TQStyle::Style_Down: TQStyle::Style_Raised ) | + ( (nState & CTRL_STATE_SELECTED)? TQStyle::Style_Selected : TQStyle::Style_Default ) | + ( (nState & CTRL_STATE_ROLLOVER)? TQStyle::Style_MouseOver: TQStyle::Style_Default ); + //TODO ( (nState & CTRL_STATE_HIDDEN)? TQStyle::Style_: TQStyle::Style_Default ) | + + switch ( aValue.getTristateVal() ) + { + case BUTTONVALUE_ON: nStyle |= TQStyle::Style_On; break; + case BUTTONVALUE_OFF: nStyle |= TQStyle::Style_Off; break; + case BUTTONVALUE_MIXED: nStyle |= TQStyle::Style_NoChange; break; + default: break; + } + + return nStyle; +} + +TQRect WidgetPainter::region2TQRect( const Rectangle& rControlRegion ) +{ + return TQRect( TQPoint( rControlRegion.Left(), rControlRegion.Top() ), + TQPoint( rControlRegion.Right(), rControlRegion.Bottom() ) ); +} + +/** Instance of WidgetPainter. + + It is used to paint the widgets requested by NWF. +*/ +static WidgetPainter *pWidgetPainter; + +class TDESalGraphics : public X11SalGraphics +{ + public: + TDESalGraphics() {} + virtual ~TDESalGraphics() {} + virtual sal_Bool IsNativeControlSupported( ControlType nType, ControlPart nPart ); + virtual sal_Bool hitTestNativeControl( ControlType nType, ControlPart nPart, + const Rectangle& rControlRegion, const Point& aPos, + sal_Bool& rIsInside ); + virtual sal_Bool drawNativeControl( ControlType nType, ControlPart nPart, + const Rectangle& rControlRegion, ControlState nState, + const ImplControlValue& aValue, + const OUString& aCaption ); + virtual sal_Bool drawNativeControlText( ControlType nType, ControlPart nPart, + const Rectangle& rControlRegion, ControlState nState, + const ImplControlValue& aValue, + const OUString& aCaption ); + virtual sal_Bool getNativeControlRegion( ControlType nType, ControlPart nPart, + const Rectangle& rControlRegion, ControlState nState, + const ImplControlValue& aValue, + const OUString& aCaption, + Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion ); +}; + +/** What widgets can be drawn the native way. + + @param nType + Type of the widget. + + @param nPart + Specification of the widget's part if it consists of more than one. + + @return TRUE if the platform supports native drawing of the widget nType + defined by nPart. +*/ +sal_Bool TDESalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart ) +{ + return + ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) || + ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) || + ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) ) || + ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) || + ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) || + ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_WINDOW || nPart == HAS_BACKGROUND_TEXTURE ) ) || + ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) || + // no CTRL_SPINBUTTONS for TDE + ( (nType == CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) ) || + ( (nType == CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) ) || + // no CTRL_TAB_BODY for TDE + ( (nType == CTRL_SCROLLBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) ) || + ( (nType == CTRL_SCROLLBAR) && (nPart == HAS_THREE_BUTTONS) ) || // TODO small optimization is possible here: return this only if the style really has 3 buttons + // CTRL_GROUPBOX not supported + // CTRL_FIXEDLINE not supported + // CTRL_FIXEDBORDER not supported + ( (nType == CTRL_TOOLBAR) && (nPart == PART_ENTIRE_CONTROL || + nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT || + nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT || + nPart == PART_BUTTON) ) || + ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) || + ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) || + ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) ) + ; +} + + +/** Test whether the position is in the native widget. + + If the return value is TRUE, bIsInside contains information whether + aPos was or was not inside the native widget specified by the + nType/nPart combination. +*/ +sal_Bool TDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart, + const Rectangle& rControlRegion, const Point& rPos, + sal_Bool& rIsInside ) +{ + if ( nType == CTRL_SCROLLBAR ) + { + // make position relative to rControlRegion + Point aPos = rPos - rControlRegion.TopLeft(); + rIsInside = FALSE; + + sal_Bool bHorizontal = ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT ); + + TQScrollBar *pScrollBar = pWidgetPainter->scrollBar( rControlRegion, + bHorizontal, ImplControlValue() ); + TQRect qRectSubLine = kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarSubLine ); + TQRect qRectAddLine = kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarAddLine ); + + // There are 2 buttons on the right/bottom side of the scrollbar + sal_Bool bTwoSubButtons = FALSE; + + // It is a Platinum style scroll bar + sal_Bool bPlatinumStyle = FALSE; + + // Workaround for Platinum and 3 button style scroll bars. + // It makes the right/down button bigger. + if ( bHorizontal ) + { + qRectAddLine.setLeft( kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pScrollBar, + TQStyle::SC_ScrollBarAddPage ).right() + 1 ); + if ( qRectAddLine.width() > qRectSubLine.width() ) + bTwoSubButtons = TRUE; + if ( qRectSubLine.left() > kapp->style().querySubControlMetrics( TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarSubPage ).left() ) + bPlatinumStyle = TRUE; + } + else + { + qRectAddLine.setTop( kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pScrollBar, + TQStyle::SC_ScrollBarAddPage ).bottom() + 1 ); + if ( qRectAddLine.height() > qRectSubLine.height() ) + bTwoSubButtons = TRUE; + if ( qRectSubLine.top() > kapp->style().querySubControlMetrics( TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarSubPage ).top() ) + bPlatinumStyle = TRUE; + } + + switch ( nPart ) + { + case PART_BUTTON_LEFT: + if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) ) + rIsInside = TRUE; + else if ( bTwoSubButtons ) + { + qRectAddLine.setWidth( qRectAddLine.width() / 2 ); + rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() ); + } + break; + + case PART_BUTTON_UP: + if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) ) + rIsInside = TRUE; + else if ( bTwoSubButtons ) + { + qRectAddLine.setHeight( qRectAddLine.height() / 2 ); + rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() ); + } + break; + + case PART_BUTTON_RIGHT: + if ( bTwoSubButtons ) + qRectAddLine.setLeft( qRectAddLine.left() + qRectAddLine.width() / 2 ); + + rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() ); + break; + + case PART_BUTTON_DOWN: + if ( bTwoSubButtons ) + qRectAddLine.setTop( qRectAddLine.top() + qRectAddLine.height() / 2 ); + + rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() ); + break; + + // cases PART_TRACK_HORZ_AREA and PART_TRACK_VERT_AREA + default: + return FALSE; + } + + return TRUE; + } + + return FALSE; +} + + +/** Draw the requested control described by nPart/nState. + + @param rControlRegion + The bounding region of the complete control in VCL frame coordinates. + + @param aValue + An optional value (tristate/numerical/string). + + @param aCaption + A caption or title string (like button text etc.) +*/ +sal_Bool TDESalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, + const Rectangle& rControlRegion, ControlState nState, + const ImplControlValue& aValue, + const OUString& ) +{ + sal_Bool bReturn = FALSE; + + Display *dpy = GetXDisplay(); + XLIB_Window drawable = GetDrawable(); + GC gc = SelectPen(); //SelectFont(); // GC with current clipping region set + + if ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->pushButton( rControlRegion, (nState & CTRL_STATE_DEFAULT) ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->radioButton( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->checkBox( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->comboBox( rControlRegion, TRUE ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->lineEdit( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->comboBox( rControlRegion, FALSE ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_LISTBOX) && (nPart == PART_WINDOW) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->listView( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->spinWidget( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType==CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->tabBar( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType==CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->tabWidget( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_SCROLLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->scrollBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ, aValue ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT || nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->toolBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_THUMB_VERT ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart ); + } + else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_BUTTON) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->toolButton( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart ); + } + else if ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->menuBar( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart ); + } + else if ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->popupMenu( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + else if ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) ) + { + bReturn = pWidgetPainter->drawStyledWidget( + pWidgetPainter->progressBar( rControlRegion ), + nState, aValue, + dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); + } + + return bReturn; +} + + +/** Draw text on the widget. + + OPTIONAL. Draws the requested text for the control described by nPart/nState. + Used if text is not drawn by DrawNativeControl(). + + @param rControlRegion + The bounding region of the complete control in VCL frame coordinates. + + @param aValue + An optional value (tristate/numerical/string) + + @param aCaption + A caption or title string (like button text etc.) +*/ +sal_Bool TDESalGraphics::drawNativeControlText( ControlType, ControlPart, + const Rectangle&, ControlState, + const ImplControlValue&, + const OUString& ) +{ + return FALSE; +} + +/** Check if the bounding regions match. + + If the return value is TRUE, rNativeBoundingRegion + contains the true bounding region covered by the control + including any adornment, while rNativeContentRegion contains the area + within the control that can be safely drawn into without drawing over + the borders of the control. + + @param rControlRegion + The bounding region of the control in VCL frame coordinates. + + @param aValue + An optional value (tristate/numerical/string) + + @param aCaption + A caption or title string (like button text etc.) +*/ +sal_Bool TDESalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart, + const Rectangle& rControlRegion, ControlState nState, + const ImplControlValue&, + const OUString&, + Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion ) +{ + sal_Bool bReturn = FALSE; + TQRect qBoundingRect = WidgetPainter::region2TQRect( rControlRegion ); + TQRect qRect; + + TQWidget *pWidget = NULL; + switch ( nType ) + { + // Metrics of the push button + case CTRL_PUSHBUTTON: + pWidget = pWidgetPainter->pushButton( rControlRegion, ( nState & CTRL_STATE_DEFAULT ) ); + + switch ( nPart ) + { + case PART_ENTIRE_CONTROL: + qRect = qBoundingRect; + + if ( nState & CTRL_STATE_DEFAULT ) + { + int nIndicatorSize = kapp->style().pixelMetric( + TQStyle::PM_ButtonDefaultIndicator, pWidget ); + qBoundingRect.addCoords( -nIndicatorSize, -nIndicatorSize, + nIndicatorSize, nIndicatorSize ); + bReturn = TRUE; + } + break; + } + break; + + // Metrics of the radio button + case CTRL_RADIOBUTTON: + pWidget = pWidgetPainter->radioButton( rControlRegion ); + + if ( nPart == PART_ENTIRE_CONTROL ) + { + qRect.setWidth( kapp->style().pixelMetric( TQStyle::PM_ExclusiveIndicatorWidth, pWidget ) ); + qRect.setHeight( kapp->style().pixelMetric( TQStyle::PM_ExclusiveIndicatorHeight, pWidget ) ); + + bReturn = TRUE; + } + break; + + // Metrics of the check box + case CTRL_CHECKBOX: + pWidget = pWidgetPainter->checkBox( rControlRegion ); + + if ( nPart == PART_ENTIRE_CONTROL ) + { + qRect.setWidth( kapp->style().pixelMetric( TQStyle::PM_IndicatorWidth, pWidget ) ); + qRect.setHeight( kapp->style().pixelMetric( TQStyle::PM_IndicatorHeight, pWidget ) ); + + bReturn = TRUE; + } + break; + + // Metrics of the combo box + case CTRL_COMBOBOX: + case CTRL_LISTBOX: + pWidget = pWidgetPainter->comboBox( rControlRegion, ( nType == CTRL_COMBOBOX ) ); + switch ( nPart ) + { + case PART_BUTTON_DOWN: + qRect = kapp->style().querySubControlMetrics( + TQStyle::CC_ComboBox, pWidget, TQStyle::SC_ComboBoxArrow ); + qRect.setLeft( kapp->style().querySubControlMetrics( + TQStyle::CC_ComboBox, pWidget, + TQStyle::SC_ComboBoxEditField ).right() + 1 ); + qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); + bReturn = TRUE; + break; + + case PART_SUB_EDIT: + qRect = kapp->style().querySubControlMetrics( + TQStyle::CC_ComboBox, pWidget, TQStyle::SC_ComboBoxEditField ); + qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); + bReturn = TRUE; + break; + } + break; + + // Metrics of the spin box + case CTRL_SPINBOX: + pWidget = pWidgetPainter->spinWidget( rControlRegion ); + switch ( nPart ) + { + case PART_BUTTON_UP: + qRect = kapp->style().querySubControlMetrics( + TQStyle::CC_SpinWidget, pWidget, TQStyle::SC_SpinWidgetUp ); + bReturn = TRUE; + qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); + break; + + case PART_BUTTON_DOWN: + qRect = kapp->style().querySubControlMetrics( + TQStyle::CC_SpinWidget, pWidget, TQStyle::SC_SpinWidgetDown ); + bReturn = TRUE; + qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); + break; + + case PART_SUB_EDIT: + qRect = kapp->style().querySubControlMetrics( + TQStyle::CC_SpinWidget, pWidget, TQStyle::SC_SpinWidgetEditField ); + qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); + bReturn = TRUE; + break; + } + break; + + // Metrics of the scroll bar + case CTRL_SCROLLBAR: + pWidget = pWidgetPainter->scrollBar( rControlRegion, + ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT ), + ImplControlValue() ); + switch ( nPart ) + { + case PART_BUTTON_LEFT: + case PART_BUTTON_UP: + qRect = kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pWidget, TQStyle::SC_ScrollBarSubLine ); + + // Workaround for Platinum style scroll bars. It makes the + // left/up button invisible. + if ( nPart == PART_BUTTON_LEFT ) + { + if ( qRect.left() > kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pWidget, + TQStyle::SC_ScrollBarSubPage ).left() ) + { + qRect.setLeft( 0 ); + qRect.setRight( 0 ); + } + } + else + { + if ( qRect.top() > kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pWidget, + TQStyle::SC_ScrollBarSubPage ).top() ) + { + qRect.setTop( 0 ); + qRect.setBottom( 0 ); + } + } + + qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); + + bReturn = TRUE; + break; + + case PART_BUTTON_RIGHT: + case PART_BUTTON_DOWN: + qRect = kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pWidget, TQStyle::SC_ScrollBarAddLine ); + + // Workaround for Platinum and 3 button style scroll bars. + // It makes the right/down button bigger. + if ( nPart == PART_BUTTON_RIGHT ) + qRect.setLeft( kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pWidget, + TQStyle::SC_ScrollBarAddPage ).right() + 1 ); + else + qRect.setTop( kapp->style().querySubControlMetrics( + TQStyle::CC_ScrollBar, pWidget, + TQStyle::SC_ScrollBarAddPage ).bottom() + 1 ); + + qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); + + bReturn = TRUE; + break; + } + break; + } + + // Fill rNativeBoundingRegion and rNativeContentRegion + if ( bReturn ) + { + // Bounding region + Point aBPoint( qBoundingRect.x(), qBoundingRect.y() ); + Size aBSize( qBoundingRect.width(), qBoundingRect.height() ); + rNativeBoundingRegion = Rectangle( aBPoint, aBSize ); + + // Region of the content + Point aPoint( qRect.x(), qRect.y() ); + Size aSize( qRect.width(), qRect.height() ); + rNativeContentRegion = Rectangle( aPoint, aSize ); + } + + return bReturn; +} + +// ----------------------------------------------------------------------- +// TDESalFrame implementation +// ----------------------------------------------------------------------- + +TDESalFrame::TDESalFrame( SalFrame* pParent, sal_uLong nStyle ) : + X11SalFrame( pParent, nStyle ) +{ +} + +void TDESalFrame::Show( sal_Bool bVisible, sal_Bool bNoActivate ) +{ + if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) ) + { + TDEXLib* pXLib = static_cast(GetDisplay()->GetXLib()); + pXLib->doStartup(); + } + X11SalFrame::Show( bVisible, bNoActivate ); +} + +/** Helper function to convert colors. +*/ +static Color toColor( const TQColor &rColor ) +{ + return Color( rColor.red(), rColor.green(), rColor.blue() ); +} + +/** Helper function to read untranslated text entry from TDEConfig configuration repository. +*/ +static OUString readEntryUntranslated( TDEConfig *pConfig, const char *pKey ) +{ + return OUString::createFromAscii( pConfig->readEntryUntranslated( pKey ).ascii() ); +} + +/** Helper function to read color from TDEConfig configuration repository. +*/ +static Color readColor( TDEConfig *pConfig, const char *pKey ) +{ + return toColor( pConfig->readColorEntry( pKey ) ); +} + +/** Helper function to add information to Font from TQFont. + + Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx). +*/ +static Font toFont( const TQFont &rTQFont, const ::com::sun::star::lang::Locale& rLocale ) +{ + psp::FastPrintFontInfo aInfo; + TQFontInfo qFontInfo( rTQFont ); + + // set family name + aInfo.m_aFamilyName = String( rTQFont.family().utf8(), RTL_TEXTENCODING_UTF8 ); + + // set italic + aInfo.m_eItalic = ( qFontInfo.italic()? ITALIC_NORMAL: ITALIC_NONE ); + + // set weight + int nWeight = qFontInfo.weight(); + if ( nWeight <= TQFont::Light ) + aInfo.m_eWeight = WEIGHT_LIGHT; + else if ( nWeight <= TQFont::Normal ) + aInfo.m_eWeight = WEIGHT_NORMAL; + else if ( nWeight <= TQFont::DemiBold ) + aInfo.m_eWeight = WEIGHT_SEMIBOLD; + else if ( nWeight <= TQFont::Bold ) + aInfo.m_eWeight = WEIGHT_BOLD; + else + aInfo.m_eWeight = WEIGHT_ULTRABOLD; + + // set width + int nStretch = rTQFont.stretch(); + if ( nStretch <= TQFont::UltraCondensed ) + aInfo.m_eWidth = WIDTH_ULTRA_CONDENSED; + else if ( nStretch <= TQFont::ExtraCondensed ) + aInfo.m_eWidth = WIDTH_EXTRA_CONDENSED; + else if ( nStretch <= TQFont::Condensed ) + aInfo.m_eWidth = WIDTH_CONDENSED; + else if ( nStretch <= TQFont::SemiCondensed ) + aInfo.m_eWidth = WIDTH_SEMI_CONDENSED; + else if ( nStretch <= TQFont::Unstretched ) + aInfo.m_eWidth = WIDTH_NORMAL; + else if ( nStretch <= TQFont::SemiExpanded ) + aInfo.m_eWidth = WIDTH_SEMI_EXPANDED; + else if ( nStretch <= TQFont::Expanded ) + aInfo.m_eWidth = WIDTH_EXPANDED; + else if ( nStretch <= TQFont::ExtraExpanded ) + aInfo.m_eWidth = WIDTH_EXTRA_EXPANDED; + else + aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED; + +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); +#endif + + // match font to e.g. resolve "Sans" + psp::PrintFontManager::get().matchFont( aInfo, rLocale ); + +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "font match %s, name AFTER: \"%s\"\n", + aInfo.m_nID != 0 ? "succeeded" : "failed", + OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); +#endif + + // font height + int nPointHeight = qFontInfo.pointSize(); + if ( nPointHeight <= 0 ) + nPointHeight = rTQFont.pointSize(); + + // Create the font + Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) ); + if( aInfo.m_eWeight != WEIGHT_DONTKNOW ) + aFont.SetWeight( aInfo.m_eWeight ); + if( aInfo.m_eWidth != WIDTH_DONTKNOW ) + aFont.SetWidthType( aInfo.m_eWidth ); + if( aInfo.m_eItalic != ITALIC_DONTKNOW ) + aFont.SetItalic( aInfo.m_eItalic ); + if( aInfo.m_ePitch != PITCH_DONTKNOW ) + aFont.SetPitch( aInfo.m_ePitch ); + + return aFont; +} + +/** Implementation of TDE integration's main method. +*/ +void TDESalFrame::UpdateSettings( AllSettings& rSettings ) +{ + StyleSettings aStyleSettings( rSettings.GetStyleSettings() ); + bool bSetTitleFont = false; + + aStyleSettings.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_LARGE ); + + // WM settings + TDEConfig *pConfig = TDEGlobal::config(); + if ( pConfig ) + { + pConfig->setGroup( "WM" ); + const char *pKey; + + pKey = "activeBackground"; + if ( pConfig->hasKey( pKey ) ) + aStyleSettings.SetActiveColor( readColor( pConfig, pKey ) ); + + pKey = "activeBlend"; + if ( pConfig->hasKey( pKey ) ) + aStyleSettings.SetActiveColor2( readColor( pConfig, pKey ) ); + + pKey = "inactiveBackground"; + if ( pConfig->hasKey( pKey ) ) + aStyleSettings.SetDeactiveColor( readColor( pConfig, pKey ) ); + + pKey = "inactiveBlend"; + if ( pConfig->hasKey( pKey ) ) + aStyleSettings.SetDeactiveColor2( readColor( pConfig, pKey ) ); + + pKey = "inactiveForeground"; + if ( pConfig->hasKey( pKey ) ) + aStyleSettings.SetDeactiveTextColor( readColor( pConfig, pKey ) ); + + pKey = "activeForeground"; + if ( pConfig->hasKey( pKey ) ) + aStyleSettings.SetActiveTextColor( readColor( pConfig, pKey ) ); + + pKey = "titleFont"; + if ( pConfig->hasKey( pKey ) ) + { + Font aFont = toFont( pConfig->readFontEntry( pKey ), rSettings.GetUILocale() ); + aStyleSettings.SetTitleFont( aFont ); + bSetTitleFont = true; + } + + pConfig->setGroup( "Icons" ); + + pKey = "Theme"; + if ( pConfig->hasKey( pKey ) ) + aStyleSettings.SetPreferredSymbolsStyleName( readEntryUntranslated( pConfig, pKey ) ); + } + + // General settings + TQColorGroup qColorGroup = kapp->palette().active(); + + Color aFore = toColor( qColorGroup.foreground() ); + Color aBack = toColor( qColorGroup.background() ); + Color aText = toColor( qColorGroup.text() ); + Color aBase = toColor( qColorGroup.base() ); + + // Foreground + aStyleSettings.SetRadioCheckTextColor( aFore ); + aStyleSettings.SetLabelTextColor( aFore ); + aStyleSettings.SetInfoTextColor( aFore ); + aStyleSettings.SetDialogTextColor( aFore ); + aStyleSettings.SetGroupTextColor( aFore ); + + // Text + aStyleSettings.SetFieldTextColor( aText ); + aStyleSettings.SetFieldRolloverTextColor( aText ); + aStyleSettings.SetWindowTextColor( aText ); + aStyleSettings.SetHelpTextColor( aText ); + + // Base + aStyleSettings.SetFieldColor( aBase ); + aStyleSettings.SetHelpColor( aBase ); + aStyleSettings.SetWindowColor( aBase ); + aStyleSettings.SetActiveTabColor( aBase ); + + // Buttons + aStyleSettings.SetButtonTextColor( toColor( qColorGroup.buttonText() ) ); + aStyleSettings.SetButtonRolloverTextColor( toColor( qColorGroup.buttonText() ) ); + + // Disable color + aStyleSettings.SetDisableColor( toColor( qColorGroup.mid() ) ); + + // Workspace + aStyleSettings.SetWorkspaceColor( toColor( qColorGroup.mid() ) ); + + // Background + aStyleSettings.Set3DColors( aBack ); + aStyleSettings.SetFaceColor( aBack ); + aStyleSettings.SetInactiveTabColor( aBack ); + aStyleSettings.SetDialogColor( aBack ); + if( aBack == COL_LIGHTGRAY ) + aStyleSettings.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) ); + else + { + Color aColor2 = aStyleSettings.GetLightColor(); + aStyleSettings. + SetCheckedColor( Color( (BYTE)(((USHORT)aBack.GetRed()+(USHORT)aColor2.GetRed())/2), + (BYTE)(((USHORT)aBack.GetGreen()+(USHORT)aColor2.GetGreen())/2), + (BYTE)(((USHORT)aBack.GetBlue()+(USHORT)aColor2.GetBlue())/2) + ) ); + } + + // Selection + aStyleSettings.SetHighlightColor( toColor( qColorGroup.highlight() ) ); + aStyleSettings.SetHighlightTextColor( toColor( qColorGroup.highlightedText() ) ); + + // Font + Font aFont = toFont( kapp->font(), rSettings.GetUILocale() ); + + aStyleSettings.SetAppFont( aFont ); + aStyleSettings.SetHelpFont( aFont ); + aStyleSettings.SetMenuFont( aFont ); // will be changed according to pMenuBar + aStyleSettings.SetToolFont( aFont ); // will be changed according to pToolBar + aStyleSettings.SetLabelFont( aFont ); + aStyleSettings.SetInfoFont( aFont ); + aStyleSettings.SetRadioCheckFont( aFont ); + aStyleSettings.SetPushButtonFont( aFont ); + aStyleSettings.SetFieldFont( aFont ); + aStyleSettings.SetIconFont( aFont ); + aStyleSettings.SetGroupFont( aFont ); + + aFont.SetWeight( WEIGHT_BOLD ); + if( !bSetTitleFont ) + aStyleSettings.SetTitleFont( aFont ); + aStyleSettings.SetFloatTitleFont( aFont ); + + int flash_time = TQApplication::cursorFlashTime(); + aStyleSettings.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME ); + + TDEMainWindow qMainWindow; + qMainWindow.createGUI( "/dev/null" ); // hack + + // Menu + aStyleSettings.SetSkipDisabledInMenus( TRUE ); + KMenuBar *pMenuBar = qMainWindow.menuBar(); + if ( pMenuBar ) + { + // Color + TQColorGroup qMenuCG = pMenuBar->colorGroup(); + + // Menu text and background color, theme specific + Color aMenuFore = toColor( qMenuCG.foreground() ); + Color aMenuBack = toColor( qMenuCG.background() ); + if ( kapp->style().inherits( "LightStyleV2" ) || + kapp->style().inherits( "LightStyleV3" ) || + ( kapp->style().inherits( "QMotifStyle" ) && !kapp->style().inherits( "QSGIStyle" ) ) || + kapp->style().inherits( "QWindowsStyle" ) ) + { + aMenuFore = toColor( qMenuCG.buttonText() ); + aMenuBack = toColor( qMenuCG.button() ); + } + + aStyleSettings.SetMenuTextColor( aMenuFore ); + aStyleSettings.SetMenuBarTextColor( aMenuFore ); + aStyleSettings.SetMenuColor( aMenuBack ); + aStyleSettings.SetMenuBarColor( aMenuBack ); + + aStyleSettings.SetMenuHighlightColor( toColor ( qMenuCG.highlight() ) ); + + // Menu items higlight text color, theme specific + if ( kapp->style().inherits( "HighContrastStyle" ) || + kapp->style().inherits( "KeramikStyle" ) || + kapp->style().inherits( "QWindowsStyle" ) || + kapp->style().inherits( "ThinKeramikStyle" ) || + kapp->style().inherits( "PlastikStyle" ) ) + { + aStyleSettings.SetMenuHighlightTextColor( toColor ( qMenuCG.highlightedText() ) ); + } + else + aStyleSettings.SetMenuHighlightTextColor( aMenuFore ); + + // set special menubar higlight text color + if ( kapp->style().inherits( "HighContrastStyle" ) ) + ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.highlightedText() ); + else + ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore; + + // Font + aFont = toFont( pMenuBar->font(), rSettings.GetUILocale() ); + aStyleSettings.SetMenuFont( aFont ); + } + + // Tool bar + TDEToolBar *pToolBar = qMainWindow.toolBar(); + if ( pToolBar ) + { + aFont = toFont( pToolBar->font(), rSettings.GetUILocale() ); + aStyleSettings.SetToolFont( aFont ); + } + + // Scroll bar size + aStyleSettings.SetScrollBarSize( kapp->style().pixelMetric( TQStyle::PM_ScrollBarExtent ) ); + + rSettings.SetStyleSettings( aStyleSettings ); +} + +SalGraphics* TDESalFrame::GetGraphics() +{ + if( GetWindow() ) + { + for( int i = 0; i < nMaxGraphics; i++ ) + { + if( ! m_aGraphics[i].bInUse ) + { + m_aGraphics[i].bInUse = true; + if( ! m_aGraphics[i].pGraphics ) + { + m_aGraphics[i].pGraphics = new TDESalGraphics(); + m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() ); + } + return m_aGraphics[i].pGraphics; + } + } + } + + return NULL; +} + +void TDESalFrame::ReleaseGraphics( SalGraphics *pGraphics ) +{ + for( int i = 0; i < nMaxGraphics; i++ ) + { + if( m_aGraphics[i].pGraphics == pGraphics ) + { + m_aGraphics[i].bInUse = false; + break; + } + } +} + +void TDESalFrame::updateGraphics( bool bClear ) +{ + Drawable aDrawable = bClear ? None : GetWindow(); + for( int i = 0; i < nMaxGraphics; i++ ) + { + if( m_aGraphics[i].bInUse ) + m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() ); + } +} + +TDESalFrame::~TDESalFrame() +{ +} + +TDESalFrame::GraphicsHolder::~GraphicsHolder() +{ + delete pGraphics; +} + +// ----------------------------------------------------------------------- +// TDESalInstance implementation +// ----------------------------------------------------------------------- + +SalFrame * +TDESalInstance::CreateFrame( SalFrame *pParent, sal_uLong nStyle ) +{ + return new TDESalFrame( pParent, nStyle ); +} + +// ----------------------------------------------------------------------- +// TDESalData pieces +// ----------------------------------------------------------------------- + +// Create the widget painter so we have some control over +// the destruction sequence, so Qt doesn't die in action. + +void TDEData::initNWF() +{ + ImplSVData *pSVData = ImplGetSVData(); + // draw toolbars on separate lines + pSVData->maNWFData.mbDockingAreaSeparateTB = true; + + pWidgetPainter = new WidgetPainter(); +} + +void TDEData::deInitNWF() +{ + delete pWidgetPainter; + pWidgetPainter = NULL; + + // We have to destroy the style early + kapp->setStyle( NULL ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/tde/tdedata.cxx b/vcl/unx/tde/tdedata.cxx new file mode 100644 index 0000000..adeb628 --- /dev/null +++ b/vcl/unx/tde/tdedata.cxx @@ -0,0 +1,267 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * Copyright 2011 Timothy Pearson + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#define _SV_SALDATA_CXX +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#ifdef FREEBSD +#include +#include +#include +#endif + +#include +#include +#include +#include + +#include + +#include "unx/tde/tdedata.hxx" +#include "unx/i18n_im.hxx" +#include "unx/i18n_xkb.hxx" + +#include "vclpluginapi.h" + +/* #i59042# override TDEApplications method for session management + * since it will interfere badly with our own. + */ +class VCLTDEApplication : public TDEApplication +{ + public: + VCLTDEApplication() : TDEApplication() {} + + virtual void commitData(QSessionManager &sm); +}; + +void VCLTDEApplication::commitData(QSessionManager&) +{ +} + +/*************************************************************************** + * class SalTDEDisplay * + ***************************************************************************/ + +SalTDEDisplay::SalTDEDisplay( Display* pDisp ) + : SalX11Display( pDisp ) +{ +} + +SalTDEDisplay::~SalTDEDisplay() +{ + // in case never a frame opened + static_cast(GetXLib())->doStartup(); + // clean up own members + doDestruct(); + // prevent SalDisplay from closing TDEApplication's display + pDisp_ = NULL; +} + +/*************************************************************************** + * class TDEXLib * + ***************************************************************************/ + +TDEXLib::~TDEXLib() +{ + // on 64 bit linux using libXRandr.so.2 will crash in + // XCloseDisplay when freeing extension data + // no known work around, therefor currently leak. Hopefully + // this does not make problems since we're shutting down anyway + // should we ever get a real tde plugin that uses the TDE event loop + // we should use tde's method to signal screen changes similar + // to the gtk plugin + #if ! defined USE_RANDR || ! (defined LINUX && defined X86_64) + // properly deinitialize TDEApplication + delete (VCLTDEApplication*)m_pApplication; + #endif + // free the faked cmdline arguments no longer needed by TDEApplication + for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) + free( m_pFreeCmdLineArgs[i] ); + delete [] m_pFreeCmdLineArgs; + delete [] m_pAppCmdLineArgs; +} + +void TDEXLib::Init() +{ + SalI18N_InputMethod* pInputMethod = new SalI18N_InputMethod; + pInputMethod->SetLocale(); + XrmInitialize(); + + TDEAboutData *kAboutData = new TDEAboutData( "LibreOffice", + I18N_NOOP( "LibreOffice" ), + "1.1.0", + I18N_NOOP( "LibreOffice with TDE Native Widget Support." ), + TDEAboutData::License_LGPL, + "(c) 2003, 2004 Novell, Inc\n(c) 2010 Timothy Pearson", + I18N_NOOP( "LibreOffice is an office suite.\n" ), + "http://libreoffice.org", + "libreoffice@lists.freedesktop.org"); + kAboutData->addAuthor( "Jan Holesovsky", + I18N_NOOP( "Original author and maintainer of the TDE NWF." ), + "kendy@artax.karlin.mff.cuni.cz", + "http://artax.karlin.mff.cuni.cz/~kendy" ); + + m_nFakeCmdLineArgs = 1; + sal_uInt16 nIdx; + int nParams = osl_getCommandArgCount(); + rtl::OString aDisplay; + rtl::OUString aParam, aBin; + + for ( nIdx = 0; nIdx < nParams; ++nIdx ) + { + osl_getCommandArg( nIdx, &aParam.pData ); + if ( !m_pFreeCmdLineArgs && aParam.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "-display" ) ) && nIdx + 1 < nParams ) + { + osl_getCommandArg( nIdx + 1, &aParam.pData ); + aDisplay = rtl::OUStringToOString( aParam, osl_getThreadTextEncoding() ); + + m_nFakeCmdLineArgs = 3; + m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; + m_pFreeCmdLineArgs[ 1 ] = strdup( "-display" ); + m_pFreeCmdLineArgs[ 2 ] = strdup( aDisplay.getStr() ); + } + } + if ( !m_pFreeCmdLineArgs ) + m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; + + osl_getExecutableFile( &aParam.pData ); + osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData ); + rtl::OString aExec = rtl::OUStringToOString( aBin, osl_getThreadTextEncoding() ); + m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() ); + + // make a copy of the string list for freeing it since + // TDEApplication manipulates the pointers inside the argument vector + // note: TDEApplication bad ! + m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; + for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) + m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i]; + + TDECmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData ); + + TDEApplication::disableAutoDcopRegistration(); + m_pApplication = new VCLTDEApplication(); + kapp->disableSessionManagement(); + + Display* pDisp = QPaintDevice::x11AppDisplay(); + + SalX11Display *pSalDisplay = new SalTDEDisplay( pDisp ); + + pInputMethod->CreateMethod( pDisp ); + pSalDisplay->SetupInput( pInputMethod ); +} + +void TDEXLib::doStartup() +{ + if( ! m_bStartupDone ) + { + TDEStartupInfo::appStarted(); + m_bStartupDone = true; + #if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "called TDEStartupInfo::appStarted()\n" ); + #endif + } +} + +/********************************************************************** + * class TDEData * + **********************************************************************/ + +TDEData::~TDEData() +{ +} + +void TDEData::Init() +{ + pXLib_ = new TDEXLib(); + pXLib_->Init(); +} + +/********************************************************************** + * plugin entry point * + **********************************************************************/ + +extern "C" { + VCLPLUG_TDE_PUBLIC SalInstance* create_SalInstance( oslModule ) + { + /* #i92121# workaround deadlocks in the X11 implementation + */ + static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); + /* #i90094# + from now on we know that an X connection will be + established, so protect X against itself + */ + if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) + XInitThreads(); + + rtl::OString aVersion( tqVersion() ); +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() ); +#endif + sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0, nMicro = 0; + nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32(); + if( nIndex > 0 ) + nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32(); + if( nIndex > 0 ) + nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32(); + if( nMajor != 3 || nMinor < 2 || (nMinor == 2 && nMicro < 2) ) + { +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "unsuitable qt version %d.%d.%d\n", (int)nMajor, (int)nMinor, (int)nMicro ); +#endif + return NULL; + } + + TDESalInstance* pInstance = new TDESalInstance( new SalYieldMutex() ); +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "created TDESalInstance 0x%p\n", pInstance ); +#endif + + // initialize SalData + TDEData *pSalData = new TDEData( pInstance ); + pSalData->Init(); + pInstance->SetLib( pSalData->GetLib() ); + pSalData->initNWF(); + + return pInstance; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */