Zhang Xiaofei
Hi Mikhail,
Thanks for testing the patches, however I am afraid the result is
still uncertain. I rebuilt the full build and the crash still exist,
since my build is based on SRC680_m225, I guess it is better I
integrate the patches to a newer one and retest it? I have got the
source of SRC680_m238 but I hear SRC680_m239, which will be used as
the foundation of OOo 3.0 is being released soon, should I wait for
the latter one? I'm looking forward to your suggestions.
Thanks,
Felix.
P.S. I feel very sorry for the typos exist in the last patches, I
corrected them and made the new patches.
Mikhail Voitenko
Hi Felix,
Sorry for the delay. I have just tried your patch and it works pretty
well by me. So there seems to be something wrong with your build.
Best regards,
Mikhail.
Zhang Xiaofei wrote:
Hi Mikhail,
Thanks very much for your replay, I have modified the patch to sw,
however my modification caused the build to collapse. I feel awfully
sorry to bother you again and again, but apparently there is
something I misunderstood in your instructions, could you check the
patch and point it out for me, or direct me to an example that
inserts a wrapper into the MediaDescriptor service, please?
Thanks and Best Regards,
Felix.
Mikhail Voitenko 写道:
Hi Felix,
The problem is that the new writer patch does not exchange the
InteractionHandler any more. Instead it shows the broken package
notifications using the new wrapper, that is unnecessary. As I have
written in the last IRC meeting, the wrapper should be insert into
the InteractionHandler after the repairing has failed or user has
canceled the repairing, in other words it should be done just after
the NotifyBrokenPackage interaction is shown.
Best Regards,
Mikhail.
Zhang Xiaofei wrote:
Hi Mikhail,
Thanks to your advice in our last IRC meeting, I have remade the
patches so that the wrapper handles the interaction instead.
Unfortunately the modifications still do not prevent the filter
selection box from appearing. Could you help to review the patches
and give me some suggestions please?
With Thanks and Best Regards,
Felix.
zhangxiaofei 写道:
Hi Mikhail,
I'm sorry I encountered some problem. The implementation of the
wrapper was OK in the compilation phase, but when I tried to
initialize an instance of it, I got the link error as in the log.
I'm not sure if the problem lies in the implementation, or it is
because I did not initialize it in the right way. Could you help
me with this please?
Thanks and Best Regards,
Felix.
Mikhail Voitenko 写道:
Hi Felix,
In this case a wrapper is just an implementation that implements
the same set of interfaces as the original object, and redirects
most of the calls to the original object. It just slightly
changes the behavior by aborting the filter selection interception.
There is no necessity to register the wrapper as a service in
this case. The object will be just created with C++ "new"
operator and after that it's lifetime will be controlled by
refcounting as it happens for all the UNO-objects. In other
words the factory for the object is the source code itself in
this case, because of this the XInitialization interface is also
not necessary here ( XInitialization is used only on object
initialization and should not be used further ). Theoretically
XServiceInfo should be implemented, since it is a wrapper for
the service.
And since in this case the source code has access to the C++
interface, it can use C++ API in addition to the UNO API ( in
this case we will use the constructor to provide the original
interaction handler ). But only while the object is accessible
as C++ object. Since the InteractionHandler wrapper is inserted
into the MediaDescriptor ( in other words it is transported
using UNO API ), the source code that will retrieve it from
there will be able to use UNO API only.
Best Regards,
Mikhail.
Zhang Xiaofei wrote:
Hi Mikhail,
Thanks you very much for your instructions. Sorry I'm not very
familiar with this wrapper concept, so I may need your help on
these questions:
- Does a wrapper of an interface basically has the same
intention to an implementation of an service, only the latter
implements multiple interfaces?
- How can a implemented wrapper be used in further programming?
Since there's not registration as a component I guess we should
just make an instance of the class and call its member functions?
Thanks and Best Regards,
Felix.
Mikhail Voitenko 写道:
Hi Felix,
thank you for the stacks. The problem here is that after the
user has decided to do no recovery the filter detection
process actually should be stopped. Unfortunately it seems
that the current design does not allow to do it, and the shown
filter selection dialog is just a part of the filter detection
process that goes further.
We could use a workaround, implement a wrapper around
interaction handler, that would prevent showing of the filter
selection dialog. We could probably prevent appearing of any
dialog during the further detection, but I would prefer to
avoid possibility of non wished quite actions. Even if they
are not possible now, they could be implemented in future.
So the wrapper will implement the task::XInteractionHandler
interface. The constructor will get the original interaction
handler and in case XInteractionHandler::handle() call is
called the implementation will call the original handler
except the case that the "document::NoSuchFilterRequest" is
provided.
You can find an example of similar wrapper implementation in
sfx2/source/doc/docfile.cxx:SfxMediumHandler_Impl. I think it
makes sense that the class is implemented in "comphelper"
since the problem should be solved not only for writer, but
also for other applications.
Best Regards,
Mikhail.
Zhang Xiaofei wrote:
Hi Mikhail,
I'm glad to know the previous issue is solved. :-)
The problem of i63661 is still reproducible here, I recorded
the stacks respectively to all the three boxes are shown,
(while the third one may be not so useful,) the previous two
are almost the same except for the 16th line:
===================================
+swd680mi.dll!SwFilterDetect::detect(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>
& lDescriptor={...}) Line 317 + 0x22 C++
(stack1_promptdialog)
-swd680mi.dll!SwFilterDetect::detect(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>
& lDescriptor={...}) Line 326 + 0x22 C++
(stack2_notifydialog)
-----------------------------------
Some tracing shows that bRepairAllowed has the right value 0,
sorry I didn't got enough time to finish the tracing, maybe
the problem lies around line 426 of
G:\OOo\SRC680_m225\sw\source\ui\uno\swdetect.cxx. I'll have
to continue it next Monday. Could you give me some hints on
this, please?
Thanks and Best Regards,
Felix.
Mikhail Voitenko 写道:
Hi Felix,
Thank you for checking the scenario. I have marked the issue
as non reproducible and have sent it to QA.
A new task could the the issue i63661. Please test whether
the problem is still reproducible. If it is, please get the
call stack at the place where the dialog regarding document
repair is shown, just break in the debugger while the dialog
is visible. There are two places, where the recovery might
be activated, so we need to detect which one is affected.
Best Regards,
Mikhail.
------------------------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
------------------------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
diff -urNpw @comphelper/inc/comphelper/InteractionHandlerWrapper.hxx
comphelper/inc/comphelper/InteractionHandlerWrapper.hxx
--- @comphelper/inc/comphelper/InteractionHandlerWrapper.hxx 1970-01-01
08:00:00.000000000 +0800
+++ comphelper/inc/comphelper/InteractionHandlerWrapper.hxx 2007-12-06
10:02:08.000000000 +0800
@@ -0,0 +1,110 @@
+/*************************************************************************
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* $RCSfile: accessiblewrapper.hxx,v $
+*
+* $Revision: 1.10 $
+*
+* last change: $Author: hr $ $Date: 2006/06/19 22:41:57 $
+*
+* The Contents of this file are made available subject to
+* the terms of GNU Lesser General Public License Version 2.1.
+*
+*
+* GNU Lesser General Public License Version 2.1
+* =============================================
+* Copyright 2005 by Sun Microsystems, Inc.
+* 901 San Antonio Road, Palo Alto, CA 94303, USA
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License version 2.1, as published by the Free Software Foundation.
+*
+* This library 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 for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+* MA 02111-1307 USA
+*
+************************************************************************/
+
+#ifndef _COMPHELPER_INTERACTIONHANDLERWRAPPER_HXX_
+#define _COMPHELPER_INTERACTIONHANDLERWRAPPER_HXX_
+
+#ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_
+#include <com/sun/star/task/XInteractionHandler.hpp>
+#endif
+#ifndef _COM_SUN_STAR_TASK_XINTERACITONREQUEST_
+#include <com/sun/star/task/XInteractionRequest.hpp>
+#endif
+#ifndef _COM_SUN_STAR_LANG_XINITIALIZATION_
+#include <com/sun/star/lang/XInitialization.hpp>
+#endif
+#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#endif
+#ifndef _COM_SUN_STAR_FRAME_DOUBLEINITIALIZATIONEXCEPTION_
+#include <com/sun/star/frame/DoubleInitializationException.hpp>
+#endif
+
+#ifndef _CPPUHELPER_IMPLBASE3_HXX_
+#include <cppuhelper/implbase3.hxx>
+#endif
+#ifndef INCLUDED_COMPHELPERDLLAPI_H
+#include "comphelper/comphelperdllapi.h"
+#endif
+
+namespace comphelper {
+
+ class COMPHELPER_DLLPUBLIC OInteractionHandlerWrapper : public
::cppu::WeakImplHelper3
+ < ::com::sun::star::task::XInteractionHandler
+ , ::com::sun::star::lang::XInitialization
+ , ::com::sun::star::lang::XServiceInfo >
+ {
+ com::sun::star::uno::Reference<
com::sun::star::task::XInteractionHandler > m_xInter;
+
+ public:
+ OInteractionHandlerWrapper( com::sun::star::uno::Reference<
com::sun::star::task::XInteractionHandler > xInteraction );
+ ~OInteractionHandlerWrapper();
+
+ static ::rtl::OUString SAL_CALL impl_staticGetImplementationName();
+ static ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL
impl_staticGetSupportedServiceNames();
+
+
+
//____________________________________________________________________________________________________
+ // XInteractionHandler
+
//____________________________________________________________________________________________________
+
+ virtual void SAL_CALL handle( const com::sun::star::uno::Reference<
com::sun::star::task::XInteractionRequest >& xRequest)
+ throw( com::sun::star::uno::RuntimeException );
+
+
//____________________________________________________________________________________________________
+ // XInitialization
+
//____________________________________________________________________________________________________
+
+ virtual void SAL_CALL initialize( const
::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
+ throw ( ::com::sun::star::uno::Exception,
+ ::com::sun::star::uno::RuntimeException,
+ ::com::sun::star::frame::DoubleInitializationException ) ;
+
+
//____________________________________________________________________________________________________
+ // 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 );
+
+ };
+}
+#endif
diff -urNpw @comphelper/source/misc/InteractionHandlerWrapper.cxx
comphelper/source/misc/InteractionHandlerWrapper.cxx
--- @comphelper/source/misc/InteractionHandlerWrapper.cxx 1970-01-01
08:00:00.000000000 +0800
+++ comphelper/source/misc/InteractionHandlerWrapper.cxx 2007-12-06
10:02:26.000000000 +0800
@@ -0,0 +1,129 @@
+/*************************************************************************
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* $RCSfile: accessiblewrapper.hxx,v $
+*
+* $Revision: 1.10 $
+*
+* last change: $Author: hr $ $Date: 2006/06/19 22:41:57 $
+*
+* The Contents of this file are made available subject to
+* the terms of GNU Lesser General Public License Version 2.1.
+*
+*
+* GNU Lesser General Public License Version 2.1
+* =============================================
+* Copyright 2005 by Sun Microsystems, Inc.
+* 901 San Antonio Road, Palo Alto, CA 94303, USA
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License version 2.1, as published by the Free Software Foundation.
+*
+* This library 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 for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+* MA 02111-1307 USA
+*
+************************************************************************/
+
+#include "precompiled_comphelper.hxx"
+
+#ifndef _COMPHELPER_INTERACTIONHANDLERWRAPPER_HXX_
+#include "comphelper/InteractionHandlerWrapper.hxx"
+#endif
+
+#ifndef _COM_SUN_STAR_DOCUMENT_NOSUCHFILTERREQUEST_
+#include <com/sun/star/document/NoSuchFilterRequest.hpp>
+#endif
+
+//.........................................................................
+namespace comphelper
+{
+//.........................................................................
+
+ using namespace ::com::sun::star;
+
+
//----------------------------------------------------------------------------------------------------
+ OInteractionHandlerWrapper::OInteractionHandlerWrapper( uno::Reference<
task::XInteractionHandler > xInteraction )
+ :m_xInter( xInteraction )
+ {
+ }
+
+ OInteractionHandlerWrapper::~OInteractionHandlerWrapper()
+ {
+ }
+
+
//----------------------------------------------------------------------------------------------------
+ uno::Sequence< ::rtl::OUString > SAL_CALL
OInteractionHandlerWrapper::impl_staticGetSupportedServiceNames()
+ {
+ uno::Sequence< ::rtl::OUString > aRet(1);
+ aRet[0] =
::rtl::OUString::createFromAscii("com.sun.star.task.InteractionHandlerWrapper");
+ return aRet;
+ }
+
+ ::rtl::OUString SAL_CALL
OInteractionHandlerWrapper::impl_staticGetImplementationName()
+ {
+ return
::rtl::OUString::createFromAscii("com.sun.star.comp.task.InteractionHandlerWrapper");
+ }
+
+
//----------------------------------------------------------------------------------------------------
+ // XInteractionHandler
+
//----------------------------------------------------------------------------------------------------
+ void SAL_CALL OInteractionHandlerWrapper::handle( const uno::Reference<
task::XInteractionRequest >& xRequest)
+ {
+ if( !m_xInter.is() )
+ return;
+
+ uno::Any aRequest = xRequest->getRequest();
+ document::NoSuchFilterRequest aNoSuchFilterRequest;
+ if ( aRequest >>= aNoSuchFilterRequest )
+ return;
+ else
+ m_xInter->handle( xRequest );
+ }
+
+
//----------------------------------------------------------------------------------------------------
+ // XInitialization
+
//----------------------------------------------------------------------------------------------------
+ void SAL_CALL OInteractionHandlerWrapper::initialize( const uno::Sequence<
uno::Any >& aArguments )
+ throw ( uno::Exception,
+ uno::RuntimeException,
+ frame::DoubleInitializationException )
+ {
+ }
+
+
//----------------------------------------------------------------------------------------------------
+ // XServiceInfo
+
//----------------------------------------------------------------------------------------------------
+
+ ::rtl::OUString SAL_CALL
OInteractionHandlerWrapper::getImplementationName()
+ throw ( uno::RuntimeException )
+ {
+ return impl_staticGetImplementationName();
+ }
+
+ ::sal_Bool SAL_CALL OInteractionHandlerWrapper::supportsService( const
::rtl::OUString& ServiceName )
+ throw ( uno::RuntimeException )
+ {
+ uno::Sequence< ::rtl::OUString > aSeq =
impl_staticGetSupportedServiceNames();
+
+ for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
+ if ( ServiceName.compareTo( aSeq[nInd] ) == 0 )
+ return sal_True;
+
+ return sal_False;
+ }
+
+ uno::Sequence< ::rtl::OUString > SAL_CALL
OInteractionHandlerWrapper::getSupportedServiceNames()
+ throw ( uno::RuntimeException )
+ {
+ return impl_staticGetSupportedServiceNames();
+ }
+}
diff -urNpw @comphelper/source/misc/makefile.mk
comphelper/source/misc/makefile.mk
--- @comphelper/source/misc/makefile.mk 2007-07-06 18:25:04.000000000 +0800
+++ comphelper/source/misc/makefile.mk 2007-11-26 15:21:54.000000000 +0800
@@ -83,7 +83,8 @@ SLOFILES= \
$(SLO)$/officeresourcebundle.obj \
$(SLO)$/SelectionMultiplex.obj \
$(SLO)$/namedvaluecollection.obj \
- $(SLO)$/logging.obj
+ $(SLO)$/logging.obj \
+ $(SLO)$/InteractionHandlerWrapper.obj
# --- Targets ----------------------------------
diff -urNpw @sw/source/ui/uno/swdetect.cxx sw/source/ui/uno/swdetect.cxx
--- @sw/source/ui/uno/swdetect.cxx 2007-11-26 17:21:04.000000000 +0800
+++ sw/source/ui/uno/swdetect.cxx 2007-12-04 16:36:56.000000000 +0800
@@ -101,6 +101,7 @@
#include <sfx2/brokenpackageint.hxx>
#include <svx/impgrf.hxx>
#include <svtools/FilterConfigItem.hxx>
+#include <comphelper/InteractionHandlerWrapper.hxx>
#ifndef INCLUDED_SVTOOLS_MODULEOPTIONS_HXX
#include <svtools/moduleoptions.hxx>
@@ -159,6 +160,7 @@ SwFilterDetect::~SwFilterDetect()
sal_Int32 nIndexOfReadOnlyFlag = -1;
sal_Int32 nIndexOfTemplateFlag = -1;
sal_Int32 nIndexOfDocumentTitle = -1;
+ sal_Int32 nIndexOfInteractionHandler = -1;
for( sal_Int32 nProperty=0; nProperty<nPropertyCount; ++nProperty )
{
@@ -199,7 +201,10 @@ SwFilterDetect::~SwFilterDetect()
nIndexOfTemplateFlag = nProperty;
}
else if( lDescriptor[nProperty].Name ==
OUString(RTL_CONSTASCII_USTRINGPARAM("InteractionHandler")) )
+ {
lDescriptor[nProperty].Value >>= xInteraction;
+ nIndexOfInteractionHandler = nProperty;
+ }
else if( lDescriptor[nProperty].Name ==
OUString(RTL_CONSTASCII_USTRINGPARAM("RapairPackage")) )
lDescriptor[nProperty].Value >>= bRepairPackage;
else if( lDescriptor[nProperty].Name ==
OUString(RTL_CONSTASCII_USTRINGPARAM("DocumentTitle")) )
@@ -322,8 +327,12 @@ SwFilterDetect::~SwFilterDetect()
{
//
repair either not allowed or not successful
NotifyBrokenPackage* pNotifyRequest = new NotifyBrokenPackage( aDocumentTitle );
+ xInteraction->handle( pNotifyRequest );
uno::Reference<
task::XInteractionRequest > xRequest ( pNotifyRequest );
-
xInteraction->handle( xRequest );
+ ::comphelper::OInteractionHandlerWrapper*
pHandler = new ::comphelper::OInteractionHandlerWrapper( xInteraction );
+ if ( nIndexOfInteractionHandler != -1 )
+
lDescriptor[nIndexOfInteractionHandler].Value <<= ( REFERENCE<
XInteractionHandler > )pHandler;
+
aMedium.SetError( ERRCODE_ABORT );
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]