From a6ba6e4cf3ddacf76a6513492a90b7fc0f02e027 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sun, 30 Oct 2011 21:38:42 -0500 Subject: Add LibreOffice GIT HEAD patch file --- .../patches/libreoffice-trinity.diff | 16171 +++++++++++++++++++ 1 file changed, 16171 insertions(+) create mode 100644 main/thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff diff --git a/main/thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff b/main/thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff new file mode 100644 index 000000000..fccd9f4e6 --- /dev/null +++ b/main/thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff @@ -0,0 +1,16171 @@ +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 "$QTDIR" ; then ++ qt_incdirs="$QTDIR/include $qt_incdirs" ++ if test "$build_cpu" != "x86_64" ; then ++ qt_libdirs="$QTDIR/lib $qt_libdirs" ++ else ++ qt_libdirs="$QTDIR/lib64 $QTDIR/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 QTDIR 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 QTDIR before running "configure".]) ++ fi ++ ++ dnl Check for Meta Object Compiler ++ AC_PATH_PROG( MOC, tmoc, no, [`dirname $qt_libdir`/bin:$QTDIR/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 QTDIR 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 -DQT_CLEAN_NAMESPACE -DQT_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 (KDE_VERSION_MAJOR == 3 && 2 <= KDE_VERSION_MINOR && KDE_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 = KABC::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; ++} ++// ----------------------------------------------------------------------------- ++::KABC::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 KABC ++{ ++ 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 ++ ++ ::KABC::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;} ++ ::KABC::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 = ::KABC::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); ++ } ++ ++ ::KABC::Field::List aFields = ::KABC::Field::allFields(); ++ ::KABC::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 = ::KABC::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, "initKApplication", m_pApplicationInitFunc ); ++ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "shutdownKApplication", 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()); ++ KABC::AddressBook* pAddressBook = pConnection->getAddressBook(); ++ ++ m_aKabAddressees = pAddressBook->allAddressees(); ++} ++// ------------------------------------------------------------------------- ++void KabResultSet::someKabAddressees(const KabCondition *pCondition) ++{ ++ KabConnection* pConnection = static_cast< KabConnection *>(m_xStatement->getConnection().get()); ++ KABC::AddressBook* pAddressBook = pConnection->getAddressBook(); ++ ++ KABC::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. ++ ++ KABC::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(); ++ ::KABC::Field::List aFields = ::KABC::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 ++ ::KABC::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]; ++ ::KABC::Field::List aFields = ::KABC::Field::allFields(); ++ TQString aQtName; ++ ++ switch (nFieldNumber) ++ { ++ case KAB_FIELD_REVISION: ++ aQtName = KABC::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 KApplication* s_pKApplication; ++ static bool s_bDidInsertCatalogue; ++ ++ public: ++ static void Init(); ++ static void Shutdown(); ++ }; ++ ++ // --------------------------------------------------------------- ++ KApplication* TDEInit::s_pKApplication = 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 (KApplication::kApplication() == NULL) ++ { ++ OSL_ENSURE(s_pKApplication == NULL, "TDEInit::Init: inconsistency in the application pointers!"); ++ ++ char *kabargs[1] = {(char*)"libkab1"}; ++ KCmdLineArgs::init(1, kabargs, "KAddressBook", *kabargs, "Address Book driver", KAB_DRIVER_VERSION); ++ ++ s_pKApplication = new KApplication(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); ++ KGlobal::locale()->setLanguage(aLanguage); ++ ++ // load TDE address book's localized messages ++ KGlobal::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 ++ KGlobal::locale()->removeCatalogue("kaddressbook"); ++ ++ if ( s_pKApplication != NULL ) ++ { ++ delete s_pKApplication; ++ s_pKApplication = NULL; ++ } ++ } ++ } ++} ++ ++// ======================================================================= ++namespace ++{ ++ double normalizeVersion( unsigned int major, unsigned int minor ) ++ { ++ return major + 1.0 * minor / 1000; ++ } ++} ++ ++// ----------------------------------------------------------------------- ++extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL initKApplication() ++{ ++ ::connectivity::kab::TDEInit::Init(); ++} ++ ++// ----------------------------------------------------------------------- ++extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL shutdownKApplication() ++{ ++ ::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 initKApplication() ++ ++ 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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionColumn : public KabCondition ++{ ++ protected: ++ sal_Int32 m_nFieldNumber; ++ ++ TQString value(const ::KABC::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 ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionNotNull : public KabConditionColumn ++{ ++ public: ++ KabConditionNotNull( ++ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException); ++ virtual sal_Bool eval(const ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::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 ::KABC::Addressee &aAddressee, sal_Int32 nFieldNumber) ++{ ++ switch (nFieldNumber) ++ { ++ case KAB_FIELD_REVISION: ++ return aAddressee.revision().toString("yyyy-MM-dd hh:mm:ss"); ++ default: ++ ::KABC::Field::List aFields = ::KABC::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 = KABC::Addressee::revisionLabel(); ++ aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); ++ if (columnName == aName) ++ return KAB_FIELD_REVISION; ++ ++ ::KABC::Field::List aFields = ::KABC::Field::allFields(); ++ ::KABC::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 ::KABC::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 ::KABC::Addressee &aAddressee1, const ::KABC::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 ::KABC::Addressee &aAddressee1, const ::KABC::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 ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const = 0; ++ }; ++ ++ class KabSimpleOrder : public KabOrder ++ { ++ sal_Int32 m_nFieldNumber; ++ sal_Bool m_bAscending; ++ ++ TQString value(const ::KABC::Addressee &aAddressee) const; ++ public: ++ KabSimpleOrder(::rtl::OUString &sColumnName, sal_Bool bAscending); ++ ++ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const; ++ }; ++ ++ class KabComplexOrder : public KabOrder ++ { ++ ::std::vector m_aOrders; ++ ++ public: ++ KabComplexOrder(); ++ virtual ~KabComplexOrder(); ++ ++ void addOrder(KabOrder *pOrder); ++ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::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) -lkabc ++ ++# --- 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; ++ initKApplication; ++ shutdownKApplication; ++ 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) -lkio -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) -lkio -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( KIO::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( KIO::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 ( !KIO::NetAccess::file_copy( rFileName, qDestURL, 0600, true, false, NULL ) ) ++ { ++ KMessageBox::error( 0, KIO::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 KCmdLineOptions sOptions[] = ++{ ++ { "winid ", I18N_NOOP("Window ID to which is the fpicker modal"), "0" }, ++ KCmdLineLastOption ++}; ++ ++int main( int argc, char* argv[] ) ++{ ++ // we fake the name of the application to have "OpenOffice.org" in the ++ // title ++ KAboutData qAboutData( "tdefilepicker", I18N_NOOP( "OpenOffice.org" ), ++ "0.1", I18N_NOOP( "tdefilepicker is an implementation of the TDE file dialog for OpenOffice.org." ), ++ KAboutData::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; ++ ++ KCmdLineArgs::addCmdLineOptions( sOptions ); ++ KCmdLineArgs::init( argc, argv, &qAboutData ); ++ ++ KLocale::setMainCatalogue( "kdialog" ); ++ ++ KApplication kApplication; ++ ++ // Setup the modality ++ KCmdLineArgs *pArgs = KCmdLineArgs::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) -lkio ++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 = KGlobalSettings::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 = KGlobalSettings::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( KGlobalSettings::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")) && ++ KApplication::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 ++ kmailservice "$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 -DQT_CLEAN_NAMESPACE ++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 KStyle::drawPrimitive() ++ KStyle *pStyle = static_cast< KStyle * >( &kapp->style() ); ++ pStyle->drawKStylePrimitive( KStyle::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 KConfig configuration repository. ++*/ ++static OUString readEntryUntranslated( KConfig *pConfig, const char *pKey ) ++{ ++ return OUString::createFromAscii( pConfig->readEntryUntranslated( pKey ).ascii() ); ++} ++ ++/** Helper function to read color from KConfig configuration repository. ++*/ ++static Color readColor( KConfig *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 ++ KConfig *pConfig = KGlobal::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 ); ++ ++ KMainWindow 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 ++ KToolBar *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 KApplications method for session management ++ * since it will interfere badly with our own. ++ */ ++class VCLTDEApplication : public KApplication ++{ ++ public: ++ VCLTDEApplication() : KApplication() {} ++ ++ 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 KApplication'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 KApplication ++ delete (VCLTDEApplication*)m_pApplication; ++ #endif ++ // free the faked cmdline arguments no longer needed by KApplication ++ 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(); ++ ++ KAboutData *kAboutData = new KAboutData( "LibreOffice", ++ I18N_NOOP( "LibreOffice" ), ++ "1.1.0", ++ I18N_NOOP( "LibreOffice with TDE Native Widget Support." ), ++ KAboutData::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 ++ // KApplication manipulates the pointers inside the argument vector ++ // note: KApplication bad ! ++ m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; ++ for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) ++ m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i]; ++ ++ KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData ); ++ ++ KApplication::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 ) ++ { ++ KStartupInfo::appStarted(); ++ m_bStartupDone = true; ++ #if OSL_DEBUG_LEVEL > 1 ++ fprintf( stderr, "called KStartupInfo::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( qVersion() ); ++#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: */ -- cgit v1.2.3