basebmp/inc/polypolygonrenderer.hxx | 9 binaryurp/source/bridge.cxx | 2 binaryurp/source/writer.cxx | 32 + cppuhelper/source/defaultbootstrap.cxx | 22 - cppuhelper/source/gcc3.map | 1 cppuhelper/source/servicemanager.cxx | 111 +++++ cppuhelper/source/servicemanager.hxx | 2 desktop/Library_sofficeapp.mk | 1 desktop/qa/data/hidden-row.ods |binary desktop/qa/desktop_lib/test_desktop_lib.cxx | 35 + desktop/source/lib/init.cxx | 198 ++++++--- framework/source/helper/persistentwindowstate.cxx | 4 framework/source/loadenv/loadenv.cxx | 6 framework/source/services/substitutepathvars.cxx | 8 include/LibreOfficeKit/LibreOfficeKit.hxx | 5 include/cppuhelper/bootstrap.hxx | 14 include/oox/ppt/slidepersist.hxx | 3 include/vcl/bmpacc.hxx | 2 jurt/com/sun/star/lib/uno/environments/remote/Job.java | 4 jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java | 94 +++- jurt/com/sun/star/lib/uno/environments/remote/Message.java | 37 + officecfg/registry/schema/org/openoffice/Office/Common.xcs | 4 oox/source/ppt/pptshapegroupcontext.cxx | 9 oox/source/ppt/slidefragmenthandler.cxx | 3 oox/source/ppt/slidepersist.cxx | 3 sal/osl/all/log.cxx | 3 sal/osl/unx/file_url.cxx | 7 sc/CppunitTest_sc_tiledrendering.mk | 62 ++ sc/Module_sc.mk | 1 sc/qa/unit/tiledrendering/data/select-row-cols.ods |binary sc/qa/unit/tiledrendering/data/sort-range.ods |binary sc/qa/unit/tiledrendering/tiledrendering.cxx | 260 ++++++++++++ sc/sdi/scalc.sdi | 4 sc/source/ui/docshell/docsh.cxx | 8 sc/source/ui/docshell/docsh3.cxx | 8 sc/source/ui/inc/tabview.hxx | 17 sc/source/ui/unoobj/docuno.cxx | 2 sc/source/ui/view/cellsh2.cxx | 7 sc/source/ui/view/cellsh4.cxx | 31 + sc/source/ui/view/gridwin.cxx | 13 sc/source/ui/view/gridwin4.cxx | 11 sc/source/ui/view/tabview.cxx | 3 sc/source/ui/view/tabview3.cxx | 39 + sd/qa/unit/data/pptx/tdf93868.pptx |binary sd/qa/unit/import-tests.cxx | 14 sd/qa/unit/tiledrendering/data/insert-delete.odp |binary sd/qa/unit/tiledrendering/tiledrendering.cxx | 123 +++++ sd/source/core/drawdoc2.cxx | 14 sd/source/core/stlsheet.cxx | 13 sd/source/ui/func/fuinsert.cxx | 14 sd/source/ui/slidesorter/model/SlideSorterModel.cxx | 8 sd/source/ui/table/tablefunction.cxx | 20 sd/source/ui/unoidl/unomodel.cxx | 8 sfx2/source/control/unoctitm.cxx | 11 smoketest/libtest.cxx | 24 + svx/source/table/tablecontroller.cxx | 20 sw/inc/view.hxx | 10 sw/source/uibase/uiview/view.cxx | 3 sw/source/uibase/uiview/viewport.cxx | 10 sw/source/uibase/uno/unotxdoc.cxx | 3 vcl/generic/fontmanager/fontmanager.cxx | 21 vcl/source/app/svdata.cxx | 4 vcl/source/app/svmain.cxx | 31 + 63 files changed, 1300 insertions(+), 136 deletions(-)
New commits: commit 6b7bbca3415b5020e8964c41675633f599a339a8 Author: Matus Uzak <matus.u...@gmail.com> Date: Tue Mar 8 21:44:21 2016 +0100 tdf#93868: PPTX import: Incorrect inheritance of shape fill properties DrawingML: The useBgFill attribute specifies that the shape fill should be set to that of the slide background. Reviewed-on: https://gerrit.libreoffice.org/23039 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Katarina Behrens <katarina.behr...@cib.de> (cherry picked from commit f3d1ac75c4b7fa63022e54a9cbff46ba99535076) Change-Id: I8b568e730f00326d51e7b604579f4ff990b26f8a diff --git a/include/oox/ppt/slidepersist.hxx b/include/oox/ppt/slidepersist.hxx index 3c08f68..1a61603 100644 --- a/include/oox/ppt/slidepersist.hxx +++ b/include/oox/ppt/slidepersist.hxx @@ -83,7 +83,7 @@ public: oox::drawingml::ClrMapPtr getClrMap() const { return mpClrMapPtr; } void setBackgroundProperties( const oox::drawingml::FillPropertiesPtr& rFillPropertiesPtr ){ mpBackgroundPropertiesPtr = rFillPropertiesPtr; } - oox::drawingml::Color& getBackgroundColor() { return maBackgroundColor; } + const oox::drawingml::FillPropertiesPtr getBackgroundProperties() const { return mpBackgroundPropertiesPtr; } bool isMasterPage() const { return mbMaster; } bool isNotesPage() const { return mbNotes; } @@ -127,7 +127,6 @@ private: SlidePersistPtr mpMasterPagePtr; oox::drawingml::ShapePtr maShapesPtr; - oox::drawingml::Color maBackgroundColor; oox::drawingml::FillPropertiesPtr mpBackgroundPropertiesPtr; ::std::list< std::shared_ptr< TimeNode > > maTimeNodeList; diff --git a/oox/source/ppt/pptshapegroupcontext.cxx b/oox/source/ppt/pptshapegroupcontext.cxx index 3b3d20c..d02acab 100644 --- a/oox/source/ppt/pptshapegroupcontext.cxx +++ b/oox/source/ppt/pptshapegroupcontext.cxx @@ -98,11 +98,10 @@ ContextHandlerRef PPTShapeGroupContext::onCreateContext( sal_Int32 aElementToken std::shared_ptr<PPTShape> pShape( new PPTShape( meShapeLocation, "com.sun.star.drawing.CustomShape" ) ); if( rAttribs.getBool( XML_useBgFill, false ) ) { - ::oox::drawingml::FillProperties &aFill = pShape->getFillProperties(); - aFill.moFillType = XML_solidFill; - // This is supposed to fill with slide (background) color, but - // TODO: We are using white here, because thats the closest we can assume (?) - aFill.maFillColor.setSrgbClr( API_RGB_WHITE ); + const oox::drawingml::FillPropertiesPtr pBackgroundPropertiesPtr = mpSlidePersistPtr->getBackgroundProperties(); + if ( pBackgroundPropertiesPtr ) { + pShape->getFillProperties().assignUsed( *pBackgroundPropertiesPtr ); + } } pShape->setModelId(rAttribs.getString( XML_modelId ).get()); return new PPTShapeContext( *this, mpSlidePersistPtr, mpGroupShapePtr, pShape ); diff --git a/oox/source/ppt/slidefragmenthandler.cxx b/oox/source/ppt/slidefragmenthandler.cxx index 2d75afc..d8c4735 100644 --- a/oox/source/ppt/slidefragmenthandler.cxx +++ b/oox/source/ppt/slidefragmenthandler.cxx @@ -166,9 +166,8 @@ SlideFragmentHandler::~SlideFragmentHandler() if( mpSlidePersistPtr->getTheme() ) pFillProperties = mpSlidePersistPtr->getTheme()->getFillStyle( rAttribs.getInteger( XML_idx, -1 ) ); FillPropertiesPtr pFillPropertiesPtr( pFillProperties ? new FillProperties( *pFillProperties ) : new FillProperties() ); - ContextHandlerRef ret = new ColorContext( *this, mpSlidePersistPtr->getBackgroundColor() ); mpSlidePersistPtr->setBackgroundProperties( pFillPropertiesPtr ); - return ret; + return this; } break; diff --git a/oox/source/ppt/slidepersist.cxx b/oox/source/ppt/slidepersist.cxx index d6e3f99..f527868 100644 --- a/oox/source/ppt/slidepersist.cxx +++ b/oox/source/ppt/slidepersist.cxx @@ -166,8 +166,7 @@ void SlidePersist::createBackground( const XmlFilterBase& rFilterBase ) { if ( mpBackgroundPropertiesPtr ) { - sal_Int32 nPhClr = maBackgroundColor.isUsed() ? - maBackgroundColor.getColor( rFilterBase.getGraphicHelper() ) : API_RGB_TRANSPARENT; + sal_Int32 nPhClr = mpBackgroundPropertiesPtr->getBestSolidColor().getColor( rFilterBase.getGraphicHelper() ); ::oox::drawingml::ShapePropertyMap aPropMap( rFilterBase.getModelObjectHelper() ); mpBackgroundPropertiesPtr->pushToPropMap( aPropMap, rFilterBase.getGraphicHelper(), 0, nPhClr ); diff --git a/sd/qa/unit/data/pptx/tdf93868.pptx b/sd/qa/unit/data/pptx/tdf93868.pptx new file mode 100644 index 0000000..f54fb04 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf93868.pptx differ diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index fca3a8a..eb039b2 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -112,6 +112,7 @@ public: void testTdf93830(); void testTdf93097(); void testTdf93124(); + void testTdf93868(); CPPUNIT_TEST_SUITE(SdImportTest); @@ -155,6 +156,7 @@ public: CPPUNIT_TEST(testTdf93830); CPPUNIT_TEST(testTdf93097); CPPUNIT_TEST(testTdf93124); + CPPUNIT_TEST(testTdf93868); CPPUNIT_TEST_SUITE_END(); }; @@ -1218,6 +1220,18 @@ void SdImportTest::testTdf93124() #endif } +void SdImportTest::testTdf93868() +{ + sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("/sd/qa/unit/data/pptx/tdf93868.pptx"), PPTX); + + const SdrPage *pPage = &(GetPage( 1, xDocShRef )->TRG_GetMasterPage()); + CPPUNIT_ASSERT_EQUAL(size_t(5), pPage->GetObjCount()); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, dynamic_cast<const XFillStyleItem&>(pPage->GetObj(0)->GetMergedItem(XATTR_FILLSTYLE)).GetValue()); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, dynamic_cast<const XFillStyleItem&>(pPage->GetObj(1)->GetMergedItem(XATTR_FILLSTYLE)).GetValue()); + + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest); CPPUNIT_PLUGIN_IMPLEMENT(); commit e529dd401d435a62b4a340161d61ae2e771d14d4 Author: Akshay Deep <akshaydeepi...@gmail.com> Date: Mon Mar 7 08:45:54 2016 +0400 tdf#94760 Better default values for graphics cache Changed Total Graphic Cache Size to 64 Mb. Changed Object Cache Size to 12 Mb. Change-Id: I772b92f9412ccbf40c1df4e4182dcff6d634b7de Reviewed-on: https://gerrit.libreoffice.org/22967 Reviewed-by: Michael Meeks <michael.me...@collabora.com> Tested-by: Michael Meeks <michael.me...@collabora.com> (cherry picked from commit 75c272c146045235783e1dfe26a162a8f4dee493) (cherry picked from commit 8d0455e4bba7516550227326c32c46273ffa00da) diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs index 8662cfc..fef43d6 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Common.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Common.xcs @@ -1486,7 +1486,7 @@ objects.</desc> <label>Total Graphic Cache Size</label> </info> - <value>22000000</value> + <value>67110000</value> </prop> <prop oor:name="ObjectCacheSize" oor:type="xs:int" oor:nillable="false"> <info> @@ -1494,7 +1494,7 @@ object.</desc> <label>Graphic Object Cache Size</label> </info> - <value>5500000</value> + <value>12600000</value> </prop> <prop oor:name="ObjectReleaseTime" oor:type="xs:int" oor:nillable="false"> <info> commit 22dc6c8cc00ef1f3330ffbfe6455115de846e25c Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri Mar 25 20:26:52 2016 +0100 use the ScRefCellValue already available, tdf#97989 Change-Id: Iccfff23f72d33ee012f91a230f2598b8fe3131cf Reviewed-on: https://gerrit.libreoffice.org/23514 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> (cherry picked from commit 007b317fef91aa809deff8380a9e62c350eaf511) (cherry picked from commit 3dae33bd19062c2328464f6d48a9ee0869679b58) diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index 452a03a..c80425b 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -1982,7 +1982,7 @@ void ScDocShell::AsciiSave( SvStream& rStream, const ScImportOptions& rAsciiOpt if ( bFixedWidth || bSaveAsShown ) { Color* pDummy; - aString = ScCellFormat::GetString(aDocument, aPos, nFormat, &pDummy, rFormatter); + ScCellFormat::GetString(*pCell, nFormat, aString, &pDummy, rFormatter, &aDocument); bString = bSaveAsShown && rFormatter.IsTextFormat( nFormat); } else @@ -1997,7 +1997,7 @@ void ScDocShell::AsciiSave( SvStream& rStream, const ScImportOptions& rAsciiOpt { sal_uInt32 nFormat = aDocument.GetNumberFormat(aPos); Color* pDummy; - aString = ScCellFormat::GetString(aDocument, aPos, nFormat, &pDummy, rFormatter); + ScCellFormat::GetString(*pCell, nFormat, aString, &pDummy, rFormatter, &aDocument); } else aString = pCell->mpFormula->GetString().getString(); @@ -2010,7 +2010,7 @@ void ScDocShell::AsciiSave( SvStream& rStream, const ScImportOptions& rAsciiOpt { sal_uInt32 nFormat = aDocument.GetNumberFormat(aPos); Color* pDummy; - aString = ScCellFormat::GetString(aDocument, aPos, nFormat, &pDummy, rFormatter); + ScCellFormat::GetString(*pCell, nFormat, aString, &pDummy, rFormatter, &aDocument); } else aString = pCell->mpString->getString(); @@ -2032,7 +2032,7 @@ void ScDocShell::AsciiSave( SvStream& rStream, const ScImportOptions& rAsciiOpt if ( bFixedWidth || bSaveAsShown ) { Color* pDummy; - aString = ScCellFormat::GetString(aDocument, aPos, nFormat, &pDummy, rFormatter); + ScCellFormat::GetString(*pCell, nFormat, aString, &pDummy, rFormatter, &aDocument); bString = bSaveAsShown && rFormatter.IsTextFormat( nFormat); } else commit 29eefe96ee9602ca6ddf286e2514001c0aa40ebd Author: Michael Meeks <michael.me...@collabora.com> Date: Tue Apr 19 09:23:30 2016 +0100 tdf#99387 - protect LOK document size API from corner-cases. Change-Id: I5dd1d37ea783a65f0c8f3ad9c3c9cabf72ae036d (cherry picked from commit 10448704b50a5cb24d38602a76656c266f8e0366) diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx index 8025a4b..0a26a84 100644 --- a/sd/source/ui/unoidl/unomodel.cxx +++ b/sd/source/ui/unoidl/unomodel.cxx @@ -2352,7 +2352,13 @@ Size SdXImpressDocument::getDocumentSize() if (!pViewSh) return Size(); - SdrPageView* pCurPageView = pViewSh->GetView()->GetSdrPageView(); + SdrView *pSdrView = pViewSh->GetView(); + if (!pSdrView) + return Size(); + + SdrPageView* pCurPageView = pSdrView->GetSdrPageView(); + if (!pCurPageView) + return Size(); Size aSize = pCurPageView->GetPageRect().GetSize(); // Convert the size in 100th mm to TWIP commit 3d9295da60f44ca48efa5d1f26ee6ed8f757fd71 Author: Michael Meeks <michael.me...@collabora.com> Date: Wed Apr 13 17:19:57 2016 +0100 Unit test hook for online / fonts. Change-Id: I2ae50c826f7fc66367a379447ab3b99cd1f29b4d (cherry picked from commit 205b2be73a970508fda071310f26c0e1156da057) diff --git a/vcl/generic/fontmanager/fontmanager.cxx b/vcl/generic/fontmanager/fontmanager.cxx index f8cbc7d..3a7c60d 100644 --- a/vcl/generic/fontmanager/fontmanager.cxx +++ b/vcl/generic/fontmanager/fontmanager.cxx @@ -2218,4 +2218,25 @@ std::list< sal_Unicode > PrintFontManager::getUnicodeFromAdobeName( const OStri return aRet; } +/// used by online unit tests via dlopen. +extern "C" { +SAL_DLLPUBLIC_EXPORT const char * unit_online_get_fonts(void) +{ + std::list< fontID > aFontIDs; + PrintFontManager &rMgr = PrintFontManager::get(); + rMgr.getFontList(aFontIDs); + OStringBuffer aBuf; + aBuf.append( (sal_Int32)aFontIDs.size() ); + aBuf.append( " PS fonts.\n" ); + for( auto nId : aFontIDs ) + { + const OUString& rName = rMgr.getPSName( nId ); + aBuf.append( OUStringToOString( rName, RTL_TEXTENCODING_UTF8 ) ); + aBuf.append( "\n" ); + } + static OString aResult = aBuf.makeStringAndClear(); + return aResult.getStr(); +} +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 39af786db06e8b754e857494dbcf5f5904ab064a Author: Michael Meeks <michael.me...@collabora.com> Date: Fri Apr 1 15:27:52 2016 +0100 Java debugging agro. (cherry picked from commit 964787c6b9cf834639298081b0168dd1593ee4e1) diff --git a/jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java b/jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java index a25e31a..5c52bc1 100644 --- a/jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java +++ b/jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java @@ -19,6 +19,7 @@ package com.sun.star.lib.uno.environments.remote; import java.text.*; +import java.util.*; import com.sun.star.lang.DisposedException; /** @@ -85,6 +86,24 @@ public class JobQueue { } } + public static void printTrace() + { + Map<Thread, StackTraceElement[]> trace = Thread.getAllStackTraces(); + Set<Thread> set = trace.keySet(); + Iterator<Thread> i = set.iterator(); + while(i.hasNext()) + { + Thread key = i.next(); + System.out.println("Trace information for the thread " + key); + StackTraceElement[] frames = trace.get(key); + + for(int j = 0; j < frames.length; j++){ + System.err.println(frames[j]); + } + System.err.println(); + } + } + /** * A thread for dispatching jobs. */ @@ -288,13 +307,16 @@ public class JobQueue { int count = 0; for (Job i = _head; i != null; i = i._next) { - if (i.isRequest()) + if (!i.isRequest()) multipleReturns = true; count++; } if (multipleReturns) - printDebug("ERROR: MULTIPLE RETURNS"); + { + printDebug("ERROR: MULTIPLE RETURNS.patch.2"); + printTrace(); + } if(DEBUG) printDebug("##### " + getClass().getName() + ".putJob to queue of " + count); printDebug("new job : " + job.toString()); for (Job i = _head; i != null; i = i._next) commit 6883f204cafe89e65d6d234ceca47dc5f94e6d95 Author: Jan Holesovsky <ke...@collabora.com> Date: Thu Mar 31 12:26:54 2016 +0200 sd lok bccu#1525: Don't rely on the window size in the LOK case. Otherwise the table is inserted in the top left corner. Change-Id: Ia5d7099d4bace6f18cd7e8d3409427119240b756 (cherry picked from commit ee246512cb0103f22f8afc0de245ea7f82143776) diff --git a/sd/source/ui/table/tablefunction.cxx b/sd/source/ui/table/tablefunction.cxx index 7535798..e3354bf 100644 --- a/sd/source/ui/table/tablefunction.cxx +++ b/sd/source/ui/table/tablefunction.cxx @@ -23,6 +23,7 @@ #include <com/sun/star/awt/KeyModifier.hpp> #include <com/sun/star/lang/XInitialization.hpp> +#include <comphelper/lok.hxx> #include <cppuhelper/basemutex.hxx> #include <vcl/svapp.hxx> @@ -149,16 +150,25 @@ void DrawViewShell::FuTable(SfxRequest& rReq) Size aSize( 14100, 2000 ); Point aPos; - Rectangle aWinRect(aPos, GetActiveWindow()->GetOutputSizePixel() ); + Rectangle aWinRect(aPos, GetActiveWindow()->GetOutputSizePixel()); aWinRect = GetActiveWindow()->PixelToLogic(aWinRect); // make sure that the default size of the table fits on the paper and is inside the viewing area. // if zoomed in close, don't make the table bigger than the viewing window. Size aMaxSize = getCurrentPage()->GetSize(); - if( aMaxSize.Height() > aWinRect.getHeight() ) - aMaxSize.setHeight( aWinRect.getHeight() ); - if( aMaxSize.Width() > aWinRect.getWidth() ) - aMaxSize.setWidth( aWinRect.getWidth() ); + + if (comphelper::LibreOfficeKit::isActive()) + { + // aWinRect is nonsensical in the LOK case + aWinRect = Rectangle(aPos, aMaxSize); + } + else + { + if( aMaxSize.Height() > aWinRect.getHeight() ) + aMaxSize.setHeight( aWinRect.getHeight() ); + if( aMaxSize.Width() > aWinRect.getWidth() ) + aMaxSize.setWidth( aWinRect.getWidth() ); + } if( aSize.Width() > aMaxSize.getWidth() ) aSize.setWidth( aMaxSize.getWidth() ); commit ede915c1d9ff8fb7c0aabff533946dee427f8e36 Author: Michael Meeks <michael.me...@collabora.com> Date: Mon Mar 28 22:08:25 2016 +0100 handle failure to expand ~ in path elements. This can occur in some online corner-cases. Change-Id: Id8b419179d775a21110d682ba76d8a02f45eb828 (cherry picked from commit 24f351bda04a0a6198336981c54c5438c6dad723) diff --git a/framework/source/services/substitutepathvars.cxx b/framework/source/services/substitutepathvars.cxx index 3bf6c89..3460223 100644 --- a/framework/source/services/substitutepathvars.cxx +++ b/framework/source/services/substitutepathvars.cxx @@ -820,9 +820,8 @@ OUString SubstitutePathVariables::GetHomeVariableValue() const OUString SubstitutePathVariables::GetPathVariableValue() const { - OUString aRetStr; - const char* pEnv = getenv( "PATH" ); + const char* pEnv = getenv( "PATH" ); if ( pEnv ) { @@ -836,9 +835,10 @@ OUString SubstitutePathVariables::GetPathVariableValue() const do { OUString sToken = aPathList.getToken(0, SAL_PATHSEPARATOR, nToken); - if (!sToken.isEmpty()) + if (!sToken.isEmpty() && + osl::FileBase::getFileURLFromSystemPath( sToken, aTmp ) == + osl::FileBase::RC::E_None ) { - osl::FileBase::getFileURLFromSystemPath( sToken, aTmp ); if ( bAppendSep ) aPathStrBuffer.append( ";" ); // Office uses ';' as path separator aPathStrBuffer.append( aTmp ); diff --git a/sal/osl/unx/file_url.cxx b/sal/osl/unx/file_url.cxx index cc9907a..6c279f5 100644 --- a/sal/osl/unx/file_url.cxx +++ b/sal/osl/unx/file_url.cxx @@ -257,20 +257,23 @@ oslFileError SAL_CALL osl_getFileURLFromSystemPath( rtl_uString *ustrSystemPath, if( '~' == ustrSystemPath->buffer[0] ) { /* check if another user is specified */ - if( ( 1 == ustrSystemPath->length ) || ( '/' == ustrSystemPath->buffer[1] ) ) + if( ( 1 == ustrSystemPath->length ) || + ( '/' == ustrSystemPath->buffer[1] ) ) { /* osl_getHomeDir returns file URL */ oslSecurity pSecurity = osl_getCurrentSecurity(); osl_getHomeDir( pSecurity , &pTmp ); osl_freeSecurityHandle( pSecurity ); + if (!pTmp) + return osl_File_E_INVAL; + /* remove "file://" prefix */ rtl_uString_newFromStr_WithLength( &pTmp, pTmp->buffer + 7, pTmp->length - 7 ); /* replace '~' in original string */ rtl_uString_newReplaceStrAt( &pTmp, ustrSystemPath, 0, 1, pTmp ); } - else { /* FIXME: replace ~user with users home directory */ commit 7f09682826bb29d5a4355cdb04cb22fa0e904385 Author: Michael Meeks <michael.me...@collabora.com> Date: Wed Jan 27 23:49:51 2016 +0100 Cleanup previous commit etc. (cherry picked from commit ec60e33dd83b1bdec01b2c4a1dbaa15e92c9f6b5) diff --git a/binaryurp/source/bridge.cxx b/binaryurp/source/bridge.cxx index a2d68e7..d24221d 100644 --- a/binaryurp/source/bridge.cxx +++ b/binaryurp/source/bridge.cxx @@ -286,7 +286,7 @@ void Bridge::terminate(bool final) { } w = writer_; joinW = !isThread(writer_.get()); - assert(!final || joinW); + assert(!final || joinW); // horror crash here ? .... if (joinW) { writer_.clear(); } diff --git a/binaryurp/source/writer.cxx b/binaryurp/source/writer.cxx index b63e737..63187c4 100644 --- a/binaryurp/source/writer.cxx +++ b/binaryurp/source/writer.cxx @@ -118,7 +118,7 @@ void Writer::queueRequest( items_.set(); SAL_DEBUG("writer::queueRequest tid " << getAsString(tid) << - " type " << OUString(type.get()->pTypeName) << +// " type " << OUString(type.get()->pTypeName) << " member " << OUString(member.get()->pTypeName)); } @@ -215,10 +215,10 @@ void Writer::sendRequest( css::uno::UnoInterfaceReference const & currentContext) { SAL_DEBUG("writer::sendRequest tid " << getAsString(tid) << - " type " << OUString(type.get()->pTypeName) << +// " type " << OUString(type.get()->pTypeName) << " member " << OUString(member.get()->pTypeName) << - " cctx mode? " << currentContextMode << - " cur ctx " << currentContext.get()); + " cctx mode? " << currentContextMode); +// " cur ctx " << currentContext.get()); - currentContext ref -> null OSL_ASSERT(tid.getLength() != 0 && !oid.isEmpty() && member.is()); css::uno::TypeDescription t(type); commit a59f5fdfb5b2cbb61bd13519d77afc9c1b9df23d Author: Michael Meeks <michael.me...@collabora.com> Date: Tue Jan 26 17:09:53 2016 +0000 Write-queue timestamped debugging. (cherry picked from commit 436745ea87a642789b5960eae7efd8d1e09eb512) diff --git a/binaryurp/source/writer.cxx b/binaryurp/source/writer.cxx index 7558f82..b63e737 100644 --- a/binaryurp/source/writer.cxx +++ b/binaryurp/source/writer.cxx @@ -35,6 +35,17 @@ #include "currentcontext.hxx" #include "specialfunctionids.hxx" #include "writer.hxx" +#include <rtl/ustrbuf.hxx> + +namespace { + OUString getAsString(const rtl::ByteSequence &tid) + { + OUStringBuffer aStr; + for (sal_Int32 i = 0; i < tid.getLength(); ++i) + aStr.append((sal_Int32)tid[i], 16); + return aStr.makeStringAndClear(); + } +} namespace binaryurp { @@ -105,6 +116,10 @@ void Writer::queueRequest( osl::MutexGuard g(mutex_); queue_.push_back(Item(tid, oid, type, member, inArguments, cc)); items_.set(); + + SAL_DEBUG("writer::queueRequest tid " << getAsString(tid) << + " type " << OUString(type.get()->pTypeName) << + " member " << OUString(member.get()->pTypeName)); } void Writer::queueReply( @@ -119,6 +134,12 @@ void Writer::queueReply( tid, member, setter, exception, returnValue, outArguments, setCurrentContextMode)); items_.set(); + + SAL_DEBUG("writer::queueReply tid " << getAsString(tid) << + " member " << OUString(member.get()->pTypeName) << + " exception? " << exception << + " setter " << setter << + " setCurrentContextMode " << setCurrentContextMode); } void Writer::unblock() { @@ -193,6 +214,12 @@ void Writer::sendRequest( std::vector< BinaryAny > const & inArguments, bool currentContextMode, css::uno::UnoInterfaceReference const & currentContext) { + SAL_DEBUG("writer::sendRequest tid " << getAsString(tid) << + " type " << OUString(type.get()->pTypeName) << + " member " << OUString(member.get()->pTypeName) << + " cctx mode? " << currentContextMode << + " cur ctx " << currentContext.get()); + OSL_ASSERT(tid.getLength() != 0 && !oid.isEmpty() && member.is()); css::uno::TypeDescription t(type); sal_Int32 functionId = 0; @@ -341,6 +368,11 @@ void Writer::sendReply( bool exception, BinaryAny const & returnValue, std::vector< BinaryAny > const & outArguments) { + SAL_DEBUG("writer::sendReply tid " << getAsString(tid) << + " member " << OUString(member.get()->pTypeName) << + " exception? " << exception << + " setter " << setter); + OSL_ASSERT(tid.getLength() != 0 && member.is() && member.get()->bComplete); std::vector< unsigned char > buf; bool newTid = tid != lastTid_; diff --git a/sal/osl/all/log.cxx b/sal/osl/all/log.cxx index 994169a..fe17931 100644 --- a/sal/osl/all/log.cxx +++ b/sal/osl/all/log.cxx @@ -240,6 +240,9 @@ void log( syslog(prio, "%s", s.str().c_str()); #endif } else { + TimeValue pTime = { 0, 0 }; + osl_getSystemTime(&pTime); + std::fprintf(stderr, "T%ld.%.9ld - ", (long)pTime.Seconds, (long)pTime.Nanosec); std::fputs(s.str().c_str(), stderr); std::fflush(stderr); } commit 2a0a87516fb17bc63515aaeb90e948b0256ac77b Author: Michael Meeks <michael.me...@collabora.com> Date: Fri Jan 22 11:13:57 2016 +0000 Implement jurt message and job printing ... (cherry picked from commit 1d875b385f125542c12b3935561f5b3fef72c956) diff --git a/jurt/com/sun/star/lib/uno/environments/remote/Job.java b/jurt/com/sun/star/lib/uno/environments/remote/Job.java index a9cd28d..f2043f3 100644 --- a/jurt/com/sun/star/lib/uno/environments/remote/Job.java +++ b/jurt/com/sun/star/lib/uno/environments/remote/Job.java @@ -139,6 +139,10 @@ public class Job { return _iMessage.isSynchronous(); } + public String toString() { + return _iMessage.toString(); + } + public void dispose() { // _oId = null; // _iReceiver = null; diff --git a/jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java b/jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java index f6ff174..a25e31a 100644 --- a/jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java +++ b/jurt/com/sun/star/lib/uno/environments/remote/JobQueue.java @@ -18,6 +18,7 @@ package com.sun.star.lib.uno.environments.remote; +import java.text.*; import com.sun.star.lang.DisposedException; /** @@ -40,7 +41,7 @@ public class JobQueue { /** * When set to true, enables various debugging output. */ - private static final boolean DEBUG = false; + private static final boolean DEBUG = true; protected Job _head; // the head of the job list protected Job _tail; // the tail of the job list @@ -62,6 +63,28 @@ public class JobQueue { protected JavaThreadPoolFactory _javaThreadPoolFactory; + public static String getTime() + { + try { + DecimalFormat df = new DecimalFormat("000000.000000000"); + return "T" + df.format((double)System.currentTimeMillis()/1000) + " "; + } catch (Exception e) { + return "Texcept " + e; + } + } + + public static void printDebug(String str) + { + if (DEBUG) + { + + String print = getTime() + " [" + + Thread.currentThread().getId() + "] " + str; + System.err.println(print); + System.err.flush(); + } + } + /** * A thread for dispatching jobs. */ @@ -71,7 +94,7 @@ public class JobQueue { JobDispatcher(Object disposeId) { super("JobDispatcher"); - if(DEBUG) System.err.println("JobQueue$JobDispatcher.<init>:" + _threadId); + if(DEBUG) printDebug("JobQueue$JobDispatcher.<init>:" + _threadId); _disposeId = disposeId; } @@ -82,13 +105,13 @@ public class JobQueue { @Override public void run() { - if(DEBUG) System.err.println("ThreadPool$JobDispatcher.run: " + Thread.currentThread()); + if(DEBUG) printDebug("ThreadPool$JobDispatcher.run"); try { enter(2000, _disposeId); } catch(Throwable throwable) { if(_head != null || _active) { // there was a job in progress, so give a stack - System.err.println(getClass().getName() + " - exception occurred:" + throwable); + printDebug(getClass().getName() + " - exception occurred:" + throwable); throwable.printStackTrace(System.err); } } @@ -96,7 +119,7 @@ public class JobQueue { release(); } - if(DEBUG) System.err.println("##### " + getClass().getName() + ".run - exit:" + _threadId); + if(DEBUG) printDebug("##### " + getClass().getName() + ".run - exit:" + _threadId); } } @@ -125,7 +148,7 @@ public class JobQueue { acquire(); - if(DEBUG) System.err.println("##### " + getClass().getName() + " - init:" + _threadId); + if(DEBUG) printDebug("##### " + getClass().getName() + " - init:" + _threadId); } /** @@ -141,7 +164,7 @@ public class JobQueue { _createThread = createThread; _createThread_now = createThread; - if(DEBUG) System.err.println("##### " + getClass().getName() + " - init:" + _threadId + " " + createThread); + if(DEBUG) printDebug("##### " + getClass().getName() + " - init:" + _threadId + " " + createThread); } /** @@ -185,7 +208,7 @@ public class JobQueue { * @return a job or null if timed out. */ private Job removeJob(int waitTime) { - if(DEBUG) System.err.println("##### " + getClass().getName() + ".removeJob:" + _head + " " + _threadId); + if(DEBUG) printDebug("##### " + getClass().getName() + ".removeJob:" + _head + " " + _threadId); Job job = null; synchronized (this) { @@ -230,7 +253,7 @@ public class JobQueue { synchronized(_async_jobQueue) { // wait for async queue to be empty and last job to be done while(_async_jobQueue._active || _async_jobQueue._head != null) { - if(DEBUG) System.err.println("waiting for async:" + _async_jobQueue._head + " " + _async_jobQueue._worker_thread); + if(DEBUG) printDebug("waiting for async:" + _async_jobQueue._head + " " + _async_jobQueue._worker_thread); if(_doDispose == _disposeId) { _doDispose = null; @@ -247,6 +270,9 @@ public class JobQueue { } } + if(DEBUG) + printDebug("##### " + getClass().getName() + ".removeJob: - returns job: " + job); + return job; } @@ -257,7 +283,23 @@ public class JobQueue { * @param disposeId a dispose id. */ synchronized void putJob(Job job, Object disposeId) { - if(DEBUG) System.err.println("##### " + getClass().getName() + ".putJob todoes: " + " job:" + job); + + boolean multipleReturns = false; + int count = 0; + for (Job i = _head; i != null; i = i._next) + { + if (i.isRequest()) + multipleReturns = true; + count++; + } + + if (multipleReturns) + printDebug("ERROR: MULTIPLE RETURNS"); + if(DEBUG) printDebug("##### " + getClass().getName() + ".putJob to queue of " + count); + printDebug("new job : " + job.toString()); + for (Job i = _head; i != null; i = i._next) + printDebug("queued : " + i.toString()); + printDebug(""); if(_tail != null) _tail._next = job; @@ -296,7 +338,7 @@ public class JobQueue { * @return the result of the final job (reply). */ Object enter(int waitTime, Object disposeId) throws Throwable { - if(DEBUG) System.err.println("#####" + getClass().getName() + ".enter: " + _threadId); + if(DEBUG) printDebug("##### " + getClass().getName() + ".enter: " + _threadId); boolean quit = false; @@ -332,11 +374,9 @@ public class JobQueue { } else quit = true; - - } finally { // ensure that this queue becomes disposed, if necessary - if(DEBUG) System.err.println("##### " + getClass().getName() + ".enter leaving: " + _threadId + " " + _worker_thread + " " + hold_worker_thread + " " + result); + if(DEBUG) printDebug("##### " + getClass().getName() + ".enter leaving: " + _threadId + " " + _worker_thread + " " + hold_worker_thread + " " + result); synchronized(this) { if(job != null || (quit && _head == null)) { @@ -356,6 +396,8 @@ public class JobQueue { } } + if(DEBUG) printDebug("##### " + getClass().getName() + ".enter: returns " + result + " on thread: " + _threadId); + return result; } @@ -370,7 +412,7 @@ public class JobQueue { _throwable = throwable; // get thread out of wait and let it throw the throwable - if(DEBUG) System.err.println(getClass().getName() + ".dispose - notifying thread"); + if(DEBUG) printDebug(getClass().getName() + ".dispose - notifying thread"); notifyAll(); } diff --git a/jurt/com/sun/star/lib/uno/environments/remote/Message.java b/jurt/com/sun/star/lib/uno/environments/remote/Message.java index cfdd1f3..67803ed 100644 --- a/jurt/com/sun/star/lib/uno/environments/remote/Message.java +++ b/jurt/com/sun/star/lib/uno/environments/remote/Message.java @@ -173,6 +173,43 @@ public class Message { return arguments; } + public final String toString() + { + String aResult; + aResult = request ? "request: " : "reply: "; + aResult = aResult + (synchronous ? "sync " : "async "); + if (abnormalTermination) + aResult = aResult + "!abnormal! "; + aResult = aResult + "tid: " + threadId + " "; + aResult = aResult + "oid: " + objectId + " "; + + if (type != null) + aResult = aResult + type.getTypeName() + " "; + else + aResult = aResult + "<null type> "; + + if (method != null) + aResult = aResult + method.getName() + " "; + else + aResult = aResult + "<null method> "; + + if (arguments != null) + { + aResult = aResult + "( "; + for (int i = 0; i < arguments.length; ++i) + aResult = aResult + arguments[i] + ", "; + aResult = aResult + ") "; + } + else + aResult = aResult + "<nullargs> "; + + if (result != null) + aResult = aResult + "result " + result; + else + aResult = aResult + "<noresult> "; + return aResult; + } + private final ThreadId threadId; private final boolean request; private final String objectId; commit 9d1fefaa6c14810915720c36416a61a8debe8faf Author: Tor Lillqvist <t...@collabora.com> Date: Tue Mar 22 14:06:15 2016 +0200 Some more sanity asserts can't hurt Change-Id: I9b2f70ea98968aa98498cb754c2ebe494b6ecda7 (cherry picked from commit 6a215542794b71acc2a76984f2ab485876825c34) diff --git a/include/vcl/bmpacc.hxx b/include/vcl/bmpacc.hxx index 4e9c44f..e2efa91 100644 --- a/include/vcl/bmpacc.hxx +++ b/include/vcl/bmpacc.hxx @@ -351,7 +351,9 @@ inline Scanline BitmapReadAccess::GetScanline(long nY) const inline BitmapColor BitmapReadAccess::GetPixel(long nY, long nX) const { assert(mpBuffer && mpScanBuf && "Access is not valid!"); + assert(nX >= 0 && "x-coordinate out of range!"); assert(nX < mpBuffer->mnWidth && "x-coordinate out of range!"); + assert(nY >= 0 && "y-coordinate out of range!"); assert(nY < mpBuffer->mnHeight && "y-coordinate out of range!"); return mFncGetPixel(mpScanBuf[nY], nX, maColorMask ); commit 6de58f5c7ff0e5ee0f7d942cf2fc9ae73b5bb3f9 Author: Henry Castro <hcas...@collabora.com> Date: Mon Sep 7 17:21:38 2015 -0400 preInitBootstrap call takes context Change-Id: I85b951f7d28d3d8af40b7d5f86b310021a079428 (cherry picked from commit 1c565696231ae5296a47bbb9df78d80d2da031f4) (cherry picked from commit df63131bfa652328f5b46bd638eb6f88deeeadf6) diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 075cb4f..2148d33 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1851,7 +1851,7 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char { InitVCL(); // pre-load all component libraries. - cppu::preInitBootstrap(); + cppu::preInitBootstrap(xContext); // Release Solar Mutex, lo_startmain thread should acquire it. Application::ReleaseSolarMutex(); } commit 1ce3fbfa868bda383b89ea1e54a37b8bc44c7be5 Author: Henry Castro <hcas...@collabora.com> Date: Sat Sep 12 12:11:43 2015 -0400 vcl: desktop terminate, to dispose objects In the preinit stage, the Desktop terminate() method is never called when lo_startmain thread is disposing objects. This produces debug assertions and osl assertions. It is forced to call terminate() method, when a tiled rendering case is active then it has a clean disposing objects process. However DBGGUI_DEINIT_SOLARMUTEXCHECK() check is moved at the end to prevent debug assertions solar mutex complains. Change-Id: I4a9b6398296d9150ab748a8d48868a08e7232909 (cherry picked from commit ba29b6ddf4c079a93a8484e95aa42daf2b54a54b) (cherry picked from commit 58c4cd90d34aab5eb13380ef05d67ea7d2aaa225) diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index e6f4be1..e59f73d 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -28,6 +28,7 @@ #include "tools/resmgr.hxx" #include "comphelper/processfactory.hxx" +#include "comphelper/lok.hxx" #include "unotools/syslocaleoptions.hxx" #include "vcl/svapp.hxx" @@ -449,8 +450,6 @@ void DeInitVCL() } pSVData->mpDefaultWin.disposeAndClear(); - DBGGUI_DEINIT_SOLARMUTEXCHECK(); - if ( pSVData->mpUnoWrapper ) { try @@ -458,6 +457,12 @@ void DeInitVCL() uno::Reference<frame::XDesktop2> const xDesktop = frame::Desktop::create( comphelper::getProcessComponentContext() ); xDesktop->addEventListener(new VCLUnoWrapperDeleter()); + + if (comphelper::LibreOfficeKit::isActive()) + { + SAL_WARN_IF(!xDesktop.is(), "desktop.app", "No Desktop interface"); + xDesktop->terminate(); + } } catch (uno::Exception const&) { @@ -577,6 +582,8 @@ void DeInitVCL() } EmbeddedFontsHelper::clearTemporaryFontFiles(); + + DBGGUI_DEINIT_SOLARMUTEXCHECK(); } // only one call is allowed commit 0da9ee6aa521b8a5c8606f45d17e796a7e2b1f57 Author: Henry Castro <hcas...@collabora.com> Date: Mon Sep 7 17:43:04 2015 -0400 vcl: assign NULL after deleting In the preinit stage, the VCL initialization is done by the parent process and when the lo_startmain thread de-initialize the VCL, some services are disposed early, and it causes segmentation violation. So it is ensured that pointers to service objetcs is set NULL after the delete. Change-Id: I65ecfc2d2694a981ec2986988efabdfd28d0cce4 (cherry picked from commit fca0980ec866279cc40ed1233bbddb2e4abe2fae) (cherry picked from commit 48eac22cce93c08d13022a7215b9549379453695) diff --git a/vcl/source/app/svdata.cxx b/vcl/source/app/svdata.cxx index fbde610..b830f83 100644 --- a/vcl/source/app/svdata.cxx +++ b/vcl/source/app/svdata.cxx @@ -100,10 +100,10 @@ void ImplDeInitSVData() // delete global instance data if( pSVData->mpSettingsConfigItem ) - delete pSVData->mpSettingsConfigItem; + delete pSVData->mpSettingsConfigItem, pSVData->mpSettingsConfigItem = NULL; if( pSVData->mpDockingManager ) - delete pSVData->mpDockingManager; + delete pSVData->mpDockingManager, pSVData->mpDockingManager = NULL; if( pSVData->maCtrlData.mpFieldUnitStrings ) delete pSVData->maCtrlData.mpFieldUnitStrings, pSVData->maCtrlData.mpFieldUnitStrings = nullptr; diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index d2c13f7..e6f4be1 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -394,7 +394,7 @@ void DeInitVCL() delete pSVData->mpSettingsConfigItem, pSVData->mpSettingsConfigItem = nullptr; if ( pSVData->maAppData.mpIdleMgr ) - delete pSVData->maAppData.mpIdleMgr; + delete pSVData->maAppData.mpIdleMgr, pSVData->maAppData.mpIdleMgr = NULL; Scheduler::ImplDeInitScheduler(); if ( pSVData->maWinData.mpMsgBoxImgList ) @@ -564,7 +564,11 @@ void DeInitVCL() pSVData->mpSalTimer = nullptr; // Deinit Sal - DestroySalInstance( pSVData->mpDefInst ); + if (pSVData->mpDefInst) + { + DestroySalInstance( pSVData->mpDefInst ); + pSVData->mpDefInst = NULL; + } if( pOwnSvApp ) { commit 77e5a301643ff13b02246083945eb3216c79726d Author: Henry Castro <hcas...@collabora.com> Date: Mon Sep 7 17:33:09 2015 -0400 vcl: add isInitVCL, to not initialize twice In the preinit stage, the VCL is initialized in the parent process and when the lo_startmain thread is started, the thread initialize VCL again. It is not necessary to initialize twice. Change-Id: I819cf0125afe7760c3f4d91c420d36a3a383902c (cherry picked from commit f0f7eb475ba402ceafa1d6f1956e7dfe7779615d) (cherry picked from commit 19349554e77a23c0cb551b886f51e854ca174df0) diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index 41243b6..d2c13f7 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -92,6 +92,8 @@ using namespace ::com::sun::star; +bool isInitVCL(); + oslSignalAction SAL_CALL VCLExceptionSignal_impl( void* /*pData*/, oslSignalInfo* pInfo) { static bool bIn = false; @@ -161,7 +163,7 @@ int ImplSVMain() int nReturn = EXIT_FAILURE; - bool bInit = InitVCL(); + bool bInit = (!isInitVCL() ? InitVCL() : true); if( bInit ) { @@ -244,6 +246,14 @@ uno::Any SAL_CALL DesktopEnvironmentContext::getValueByName( const OUString& Nam return retVal; } +bool isInitVCL() +{ + ImplSVData* pSVData = ImplGetSVData(); + return pExceptionHandler != NULL && + pSVData->mpApp != NULL && + pSVData->mpDefInst != NULL; +} + bool InitVCL() { if( pExceptionHandler != nullptr ) commit 074a0b78b14c69f713e6d1840ea1e62c4ce38906 Author: Henry Castro <hcas...@collabora.com> Date: Mon Sep 7 17:17:22 2015 -0400 cppuhelper: add preInitBootstrap symbol In the preinit stage, the preInitBootstrap is called to load implementations for each service registered by the service manager. All service requests are: initial Component Context and the process service factory is set. However, some services require that VCL is properly initialized. (cherry picked from commit 78df8373b6442ee3d3b09101988817cf621c189b) Change-Id: Ib116e3da172b860f2df4d672f6181b5de0b7e6b2 diff --git a/cppuhelper/source/defaultbootstrap.cxx b/cppuhelper/source/defaultbootstrap.cxx index 6720434..5a46ed4 100644 --- a/cppuhelper/source/defaultbootstrap.cxx +++ b/cppuhelper/source/defaultbootstrap.cxx @@ -42,19 +42,6 @@ rtl::OUString getBootstrapVariable( } return v; } - -void default_preInitBootstrap(rtl::OUString const & aUri) -{ - rtl::Bootstrap bsUri(aUri); - if (bsUri.getHandle() == 0) - throw css::uno::DeploymentException("Cannot open uno ini " + aUri); - - // create the service manager - rtl::Reference< cppuhelper::ServiceManager > aManager(new cppuhelper::ServiceManager); - // read rdb files - aManager->init(getBootstrapVariable(bsUri, "UNO_SERVICES")); - aManager->loadImplementations(); -} } css::uno::Reference< css::uno::XComponentContext > @@ -120,8 +107,24 @@ cppu::defaultBootstrap_InitialComponentContext() } void -cppu::preInitBootstrap() +cppu::preInitBootstrap(css::uno::Reference< css::uno::XComponentContext > const & xContext) { - default_preInitBootstrap(getUnoIniUri()); + if (!xContext.is()) + throw css::uno::DeploymentException("preInit: XComponentContext is not created"); + + css::uno::Reference< css::uno::XInterface > xService; + xContext->getValueByName("/singletons/com.sun.star.lang.theServiceManager") >>= xService; + if (!xService.is()) + throw css::uno::DeploymentException("preInit: XMultiComponentFactory is not created"); + + rtl::Reference<cppuhelper::ServiceManager> aService(reinterpret_cast<cppuhelper::ServiceManager*>(xService.get())); + + // pre-requisites: + // In order to load implementations and invoke + // component factory it is required: + // 1) defaultBootstrap_InitialComponentContext() + // 2) comphelper::setProcessServiceFactory(xSFactory); + // 3) InitVCL() + aService->loadImplementations(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cppuhelper/source/gcc3.map b/cppuhelper/source/gcc3.map index 3d7a5c6..6344bc2 100644 --- a/cppuhelper/source/gcc3.map +++ b/cppuhelper/source/gcc3.map @@ -423,7 +423,7 @@ global: # enableChangeListenerNotification _ZN4cppu19OPropertySetHelper232enableChangeListenerNotificationEh; _ZThn*_N4cppu19OPropertySetHelper232enableChangeListenerNotificationEh; - _ZN4cppu16preInitBootstrapEv; + _ZN4cppu16preInitBootstrapERKN3com3sun4star3uno9ReferenceINS3_17XComponentContextEEE; } UDK_3.7; LIBO_UDK_3.9 { # LibO 3.7 diff --git a/include/cppuhelper/bootstrap.hxx b/include/cppuhelper/bootstrap.hxx index 0330d46..67335ad 100644 --- a/include/cppuhelper/bootstrap.hxx +++ b/include/cppuhelper/bootstrap.hxx @@ -57,6 +57,16 @@ CPPUHELPER_DLLPUBLIC sal_Bool SAL_CALL installTypeDescriptionManager( CPPUHELPER_DLLPUBLIC css::uno::Reference< css::uno::XComponentContext > SAL_CALL defaultBootstrap_InitialComponentContext(); +/** preload component shared library with service manager upon + information from bootstrap variables. + + This function tries to find its parameters via these bootstrap variables: + + - UNO_SERVICES -- a space separated list of file urls of service rdbs + +*/ +CPPUHELPER_DLLPUBLIC void SAL_CALL +preInitBootstrap(css::uno::Reference< css::uno::XComponentContext > const & xContext); /** Bootstraps an initial component context with service manager upon information from an ini file. @@ -72,6 +82,7 @@ defaultBootstrap_InitialComponentContext(); @param iniFile ini filename to get bootstrap variables @return component context */ + CPPUHELPER_DLLPUBLIC css::uno::Reference< css::uno::XComponentContext > SAL_CALL defaultBootstrap_InitialComponentContext(const ::rtl::OUString & iniFile); commit bcfef8da178cbb4bd1015ca34e4a25612090b4d6 Author: Henry Castro <hcas...@collabora.com> Date: Mon Sep 7 17:11:45 2015 -0400 cppuhelper: method 1, load implementations to invoke component factory In the preinit stage, for each library that is registered by the service manager, is loaded with the flag SAL_LOADMODULE_NOW and the component factory is invoked to initialize its data. Change-Id: Ie6f6d769b611c8440ddab802545e6bdc482d1476 (cherry picked from commit 0e008a27e7f4e9b08a7b2bbd33702df336f1bca4) (cherry picked from commit 194f58dc19743e4f21789e09ff8220ce3ce68383) diff --git a/cppuhelper/source/servicemanager.cxx b/cppuhelper/source/servicemanager.cxx index 5ad7b69..2cdc724 100644 --- a/cppuhelper/source/servicemanager.cxx +++ b/cppuhelper/source/servicemanager.cxx @@ -33,6 +33,8 @@ #include <cppuhelper/implbase1.hxx> #include <cppuhelper/implbase3.hxx> #include <cppuhelper/supportsservice.hxx> +#include <cppuhelper/factory.hxx> +#include <cppuhelper/shlib.hxx> #include <osl/file.hxx> #include <rtl/ref.hxx> #include <rtl/uri.hxx> @@ -880,13 +882,16 @@ void cppuhelper::ServiceManager::loadImplementations() { rtl::OUString aUri; osl::MutexGuard g(rBHelper.rMutex); + css::uno::Environment aSourceEnv(css::uno::Environment::getCurrent()); + // loop all implementations for (Data::NamedImplementations::const_iterator iterator( data_.namedImplementations.begin()); iterator != data_.namedImplementations.end(); ++iterator) { try { + // expand absolute URI implementation component library aUri = cppu::bootstrap_expandUri(iterator->second->info->uri); } catch (css::lang::IllegalArgumentException& aError) @@ -899,13 +904,84 @@ void cppuhelper::ServiceManager::loadImplementations() if (iterator->second->info->loader == "com.sun.star.loader.SharedLibrary" && iterator->second->status != Data::Implementation::STATUS_LOADED) { - oslModule aModule = osl_loadModule( aUri.pData, SAL_LOADMODULE_NOW | SAL_LOADMODULE_GLOBAL ); - SAL_INFO("lok", "loaded component library " << aUri << ( aModule ? " ok" : " no")); + // load component library + osl::Module aModule(aUri, SAL_LOADMODULE_NOW | SAL_LOADMODULE_GLOBAL); + SAL_INFO("lok", "loaded component library " << aUri << ( aModule.is() ? " ok" : " no")); - // leak aModule - // osl_unloadModule(aModule); - if ( aModule ) + if (aModule.is() && + !iterator->second->info->environment.isEmpty()) + { + OUString aSymFactory; + oslGenericFunction fpFactory; + css::uno::Environment aTargetEnv; + css::uno::Reference<css::uno::XInterface> xFactory; + + if(iterator->second->info->constructor.isEmpty()) + { + // expand full name component factory symbol + if (iterator->second->info->prefix == "direct") + aSymFactory = iterator->second->info->name.replace('.', '_') + "_" COMPONENT_GETFACTORY; + else if (!iterator->second->info->prefix.isEmpty()) + aSymFactory = iterator->second->info->prefix + "_" COMPONENT_GETFACTORY; + else + aSymFactory = COMPONENT_GETFACTORY; + + // get function symbol component factory + fpFactory = aModule.getFunctionSymbol(aSymFactory); + if (fpFactory == 0) + { + throw css::loader::CannotActivateFactoryException( + ("no factory symbol \"" + aSymFactory + "\" in component library :" + aUri), + css::uno::Reference<css::uno::XInterface>()); + } + + aTargetEnv = cppuhelper::detail::getEnvironment(iterator->second->info->environment, iterator->second->info->name); + component_getFactoryFunc fpComponentFactory = reinterpret_cast<component_getFactoryFunc>(fpFactory); + + if (aSourceEnv.get() == aTargetEnv.get()) + { + // invoke function component factory + OString aImpl(rtl::OUStringToOString(iterator->second->info->name, RTL_TEXTENCODING_ASCII_US)); + xFactory.set(css::uno::Reference<css::uno::XInterface>(static_cast<css::uno::XInterface *>( + (*fpComponentFactory)(aImpl.getStr(), this, 0)), SAL_NO_ACQUIRE)); + } + } + else + { + // get function symbol component factory + fpFactory = aModule.getFunctionSymbol(iterator->second->info->constructor); + } + + css::uno::Reference<css::lang::XSingleComponentFactory> xSCFactory; + css::uno::Reference<css::lang::XSingleServiceFactory> xSSFactory; + + // query interface XSingleComponentFactory or XSingleServiceFactory + if (xFactory.is()) + { + xSCFactory.set(xFactory, css::uno::UNO_QUERY); + if (!xSCFactory.is()) + { + xSSFactory.set(xFactory, css::uno::UNO_QUERY); + if (!xSSFactory.is()) + { + throw css::uno::DeploymentException( + ("Implementation " + iterator->second->info->name + + " does not provide a constructor or factory"), + static_cast< cppu::OWeakObject * >(this)); + } + } + } + + if (!iterator->second->info->constructor.isEmpty() && fpFactory) + iterator->second->constructor = reinterpret_cast<ImplementationConstructorFn *>(fpFactory); + + iterator->second->factory1 = xSCFactory; + iterator->second->factory2 = xSSFactory; iterator->second->status = Data::Implementation::STATUS_LOADED; + + } + // leak aModule + aModule.release(); } } } commit 9d4e7e7f0242819eeaefddc452893c8d644dc0c0 Author: Andras Timar <andras.ti...@collabora.com> Date: Sun Jun 12 22:06:14 2016 +0200 build fix Change-Id: I86ba87c7022bbfa45bff45576a9a65ad65e8e7a8 diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx index 6549784..1843357 100644 --- a/sc/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx @@ -97,7 +97,7 @@ ScModelObj* ScTiledRenderingTest::createDoc(const char* pName) { if (mxComponent.is()) mxComponent->dispose(); - mxComponent = loadFromDesktop(m_directories.getURLFromSrc(DATA_DIRECTORY) + OUString::createFromAscii(pName), "com.sun.star.sheet.SpreadsheetDocument"); + mxComponent = loadFromDesktop(getURLFromSrc(DATA_DIRECTORY) + OUString::createFromAscii(pName), "com.sun.star.sheet.SpreadsheetDocument"); ScModelObj* pModelObj = dynamic_cast<ScModelObj*>(mxComponent.get()); CPPUNIT_ASSERT(pModelObj); pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>()); commit 49fbe72f326423fdedfa511cca1df69858d6e78e Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Thu Jan 28 18:31:03 2016 -0500 Restoring preinit (cherry picked from commit 62a2d525a7db09c7223a21907e1a0f4989398c15) Change-Id: I65341c57d00308d246ec90deab8050b2c4bb3e61 diff --git a/cppuhelper/source/defaultbootstrap.cxx b/cppuhelper/source/defaultbootstrap.cxx index bede6b5..6720434 100644 --- a/cppuhelper/source/defaultbootstrap.cxx +++ b/cppuhelper/source/defaultbootstrap.cxx @@ -43,6 +43,18 @@ rtl::OUString getBootstrapVariable( return v; } +void default_preInitBootstrap(rtl::OUString const & aUri) +{ + rtl::Bootstrap bsUri(aUri); + if (bsUri.getHandle() == 0) + throw css::uno::DeploymentException("Cannot open uno ini " + aUri); + + // create the service manager + rtl::Reference< cppuhelper::ServiceManager > aManager(new cppuhelper::ServiceManager); + // read rdb files + aManager->init(getBootstrapVariable(bsUri, "UNO_SERVICES")); + aManager->loadImplementations(); +} } css::uno::Reference< css::uno::XComponentContext > @@ -107,4 +119,9 @@ cppu::defaultBootstrap_InitialComponentContext() return defaultBootstrap_InitialComponentContext(getUnoIniUri()); } +void +cppu::preInitBootstrap() +{ + default_preInitBootstrap(getUnoIniUri()); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cppuhelper/source/gcc3.map b/cppuhelper/source/gcc3.map index 12c29834a..3d7a5c6 100644 --- a/cppuhelper/source/gcc3.map +++ b/cppuhelper/source/gcc3.map @@ -423,6 +423,7 @@ global: # enableChangeListenerNotification _ZN4cppu19OPropertySetHelper232enableChangeListenerNotificationEh; _ZThn*_N4cppu19OPropertySetHelper232enableChangeListenerNotificationEh; + _ZN4cppu16preInitBootstrapEv; } UDK_3.7; LIBO_UDK_3.9 { # LibO 3.7 diff --git a/cppuhelper/source/servicemanager.cxx b/cppuhelper/source/servicemanager.cxx index 9f93d70..5ad7b69 100644 --- a/cppuhelper/source/servicemanager.cxx +++ b/cppuhelper/source/servicemanager.cxx @@ -40,6 +40,7 @@ #include <rtl/strbuf.hxx> #include <sal/log.hxx> #include <uno/environment.hxx> +#include <osl/module.hxx> #include "loadsharedlibcomponentfactory.hxx" @@ -875,6 +876,40 @@ void cppuhelper::ServiceManager::loadImplementation( } } +void cppuhelper::ServiceManager::loadImplementations() +{ + rtl::OUString aUri; + osl::MutexGuard g(rBHelper.rMutex); + + for (Data::NamedImplementations::const_iterator iterator( + data_.namedImplementations.begin()); + iterator != data_.namedImplementations.end(); ++iterator) + { + try + { + aUri = cppu::bootstrap_expandUri(iterator->second->info->uri); + } + catch (css::lang::IllegalArgumentException& aError) + { + throw css::uno::DeploymentException( + "Cannot expand URI" + iterator->second->info->uri + ": " + aError.Message, + static_cast< cppu::OWeakObject * >(this)); + } + + if (iterator->second->info->loader == "com.sun.star.loader.SharedLibrary" && + iterator->second->status != Data::Implementation::STATUS_LOADED) + { + oslModule aModule = osl_loadModule( aUri.pData, SAL_LOADMODULE_NOW | SAL_LOADMODULE_GLOBAL ); + SAL_INFO("lok", "loaded component library " << aUri << ( aModule ? " ok" : " no")); + + // leak aModule + // osl_unloadModule(aModule); + if ( aModule ) + iterator->second->status = Data::Implementation::STATUS_LOADED; + } + } +} + void cppuhelper::ServiceManager::disposing() { std::vector< css::uno::Reference<css::lang::XComponent> > sngls; std::vector< css::uno::Reference< css::lang::XComponent > > comps; diff --git a/cppuhelper/source/servicemanager.hxx b/cppuhelper/source/servicemanager.hxx index d7f8f90..8da1927 100644 --- a/cppuhelper/source/servicemanager.hxx +++ b/cppuhelper/source/servicemanager.hxx @@ -203,6 +203,8 @@ public: css::uno::Reference< css::uno::XComponentContext > const & context, std::shared_ptr< Data::Implementation > & implementation); + void loadImplementations(); + private: virtual ~ServiceManager() {} diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk index ef95ecf..b041233 100644 --- a/desktop/Library_sofficeapp.mk +++ b/desktop/Library_sofficeapp.mk @@ -60,6 +60,7 @@ $(eval $(call gb_Library_use_libraries,sofficeapp,\ ucbhelper \ utl \ vcl \ + xmlreader \ $(gb_UWINAPI) \ )) diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 20beed9..075cb4f 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -47,6 +47,8 @@ #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/ucb/XContentProvider.hpp> #include <com/sun/star/ucb/XUniversalContentBroker.hpp> +#include <com/sun/star/container/XContentEnumerationAccess.hpp> +#include <com/sun/star/container/XHierarchicalNameAccess.hpp> #include <com/sun/star/util/URLTransformer.hpp> #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> @@ -1710,6 +1712,7 @@ static bool initialize_uno(const OUString& aAppProgramURL) #endif xContext = cppu::defaultBootstrap_InitialComponentContext(); + if (!xContext.is()) { gImpl->maLastExceptionMsg = "XComponentContext could not be created"; @@ -1742,6 +1745,9 @@ static void lo_startmain(void*) { osl_setThreadName("lo_startmain"); + if (GetpApp()) + Application::GetSolarMutex().tryToAcquire(); + soffice_main(); } @@ -1770,20 +1776,39 @@ static void lo_status_indicator_callback(void *data, comphelper::LibreOfficeKit: static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char* pUserProfilePath) { + enum { + PRE_INIT, // setup shared data in master process + SECOND_INIT, // complete init. after fork + FULL_INIT // do a standard complete init. + } eStage; + + // Did we do a pre-initialize + static bool bPreInited = false; + + // What stage are we at ? + if (pThis == NULL) + eStage = PRE_INIT; + else if (bPreInited) + eStage = SECOND_INIT; + else + eStage = FULL_INIT; + LibLibreOffice_Impl* pLib = static_cast<LibLibreOffice_Impl*>(pThis); if (bInitialized) return 1; - comphelper::LibreOfficeKit::setActive(); + if (eStage != SECOND_INIT) + comphelper::LibreOfficeKit::setActive(); static bool bViewCallback = getenv("LOK_VIEW_CALLBACK"); comphelper::LibreOfficeKit::setViewCallback(bViewCallback); - comphelper::LibreOfficeKit::setStatusIndicatorCallback(lo_status_indicator_callback, pLib); + if (eStage != PRE_INIT) + comphelper::LibreOfficeKit::setStatusIndicatorCallback(lo_status_indicator_callback, pLib); - if (pUserProfilePath) - rtl::Bootstrap::set("UserInstallation", OUString(pUserProfilePath, strlen(pUserProfilePath), RTL_TEXTENCODING_UTF8)); + if (eStage != SECOND_INIT && pUserProfilePath) + rtl::Bootstrap::set(OUString("UserInstallation"), OUString(pUserProfilePath, strlen(pUserProfilePath), RTL_TEXTENCODING_UTF8)); OUString aAppPath; if (pAppPath) @@ -1805,22 +1830,34 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char try { - SAL_INFO("lok", "Attempting to initalize UNO"); - if (!initialize_uno(aAppURL)) + if (eStage != SECOND_INIT) { - return false; - } - force_c_locale(); + SAL_INFO("lok", "Attempting to initalize UNO"); + + if (!initialize_uno(aAppURL)) + return false; - // Force headless -- this is only for bitmap rendering. - rtl::Bootstrap::set("SAL_USE_VCLPLUGIN", "svp"); + // Force headless -- this is only for bitmap rendering. + rtl::Bootstrap::set("SAL_USE_VCLPLUGIN", "svp"); - // We specifically need to make sure we have the "headless" - // command arg set (various code specifically checks via - // CommandLineArgs): - desktop::Desktop::GetCommandLineArgs().setHeadless(); + // We specifically need to make sure we have the "headless" + // command arg set (various code specifically checks via + // CommandLineArgs): + desktop::Desktop::GetCommandLineArgs().setHeadless(); - Application::EnableHeadlessMode(true); + Application::EnableHeadlessMode(true); + + if (eStage == PRE_INIT) + { + InitVCL(); + // pre-load all component libraries. + cppu::preInitBootstrap(); + // Release Solar Mutex, lo_startmain thread should acquire it. + Application::ReleaseSolarMutex(); + } + + force_c_locale(); + } // This is horrible crack. I really would want to go back to simply just call // InitVCL() here. The OfficeIPCThread thing is just horrible. @@ -1841,27 +1878,34 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char // the Thread from wherever (it's done again in Desktop::Main), and can // then use it to wait until we're definitely ready to continue. - SAL_INFO("lok", "Enabling OfficeIPCThread"); - OfficeIPCThread::EnableOfficeIPCThread(); - SAL_INFO("lok", "Starting soffice_main"); - pLib->maThread = osl_createThread(lo_startmain, nullptr); - SAL_INFO("lok", "Waiting for OfficeIPCThread"); - OfficeIPCThread::WaitForReady(); - SAL_INFO("lok", "OfficeIPCThread ready -- continuing"); - - // If the Thread has been disabled again that indicates that a - // restart is required (or in any case we don't have a useable - // process around). - if (!OfficeIPCThread::IsEnabled()) + if (eStage != PRE_INIT) { - fprintf(stderr, "LOK init failed -- restart required\n"); - return false; + SAL_INFO("lok", "Enabling OfficeIPCThread"); + OfficeIPCThread::EnableOfficeIPCThread(); + SAL_INFO("lok", "Starting soffice_main"); + pLib->maThread = osl_createThread(lo_startmain, NULL); + SAL_INFO("lok", "Waiting for OfficeIPCThread"); + OfficeIPCThread::WaitForReady(); + SAL_INFO("lok", "OfficeIPCThread ready -- continuing"); + + // If the Thread has been disabled again that indicates that a + // restart is required (or in any case we don't have a useable + // process around). + if (!OfficeIPCThread::IsEnabled()) + { + fprintf(stderr, "LOK init failed -- restart required\n"); + return false; + } } - ErrorHandler::RegisterDisplay(aBasicErrorFunc); + if (eStage != SECOND_INIT) + ErrorHandler::RegisterDisplay(aBasicErrorFunc); SAL_INFO("lok", "LOK Initialized"); - bInitialized = true; + if (eStage == PRE_INIT) + bPreInited = true; + else + bInitialized = true; } catch (css::uno::Exception& exception) { @@ -1909,6 +1953,12 @@ LibreOfficeKit *libreofficekit_hook(const char* install_path) return libreofficekit_hook_2(install_path, nullptr); } +SAL_JNI_EXPORT +int lok_preinit(const char* install_path, const char* user_profile_path) +{ + return lo_initialize(NULL, install_path, user_profile_path); +} + static void lo_destroy(LibreOfficeKit* pThis) { bool bSuccess = false; diff --git a/include/cppuhelper/bootstrap.hxx b/include/cppuhelper/bootstrap.hxx index e9a0c2d..0330d46 100644 --- a/include/cppuhelper/bootstrap.hxx +++ b/include/cppuhelper/bootstrap.hxx @@ -75,6 +75,9 @@ defaultBootstrap_InitialComponentContext(); CPPUHELPER_DLLPUBLIC css::uno::Reference< css::uno::XComponentContext > SAL_CALL defaultBootstrap_InitialComponentContext(const ::rtl::OUString & iniFile); +CPPUHELPER_DLLPUBLIC void SAL_CALL +preInitBootstrap(); + /** * An exception indicating a bootstrap error. * diff --git a/smoketest/libtest.cxx b/smoketest/libtest.cxx index b720525..ed4546c 100644 --- a/smoketest/libtest.cxx +++ b/smoketest/libtest.cxx @@ -83,7 +83,29 @@ int main (int argc, char **argv) return 1; // coverity[tainted_string] - build time test tool - Office *pOffice = lok_cpp_init( argv[1] ); + char *install_path = argv[1]; + + if( argc > 4 ) + { + fprintf( stderr, "testing preinit\n"); + char *imp_lib; + void *dlhandle; + dlhandle = lok_dlopen( install_path, &imp_lib ); + if( !dlhandle ) + { + fprintf( stderr, "Failed to link '%s'\n", lok_dlerror() ); + return -1; + } + LokHookPreInit *preinit = (LokHookPreInit *) lok_dlsym( dlhandle, "lok_preinit" ); + if( !preinit ) + { + fprintf( stderr, "Failed to find pre-init symbol: %s\n", lok_dlerror() ); + return -1; + } + preinit( install_path, NULL ); + } + + Office *pOffice = lok_cpp_init( install_path ); if( !pOffice ) { fprintf( stderr, "Failed to initialize\n" ); commit c503f7ec7fa6d4ebd3f7dff07a9573a83f22145c Author: Pranav Kant <pran...@collabora.com> Date: Wed Mar 16 22:13:08 2016 +0530 sc tiled rendering: Unit test for extended .uno:SelectRow/Column Change-Id: I0ab89598af28e12bebc271f7bce1e6166cb83b1d (cherry picked from commit 3cbdfeeb2b1765d6399ae7656a7b9ff91290bb7b) diff --git a/sc/qa/unit/tiledrendering/data/select-row-cols.ods b/sc/qa/unit/tiledrendering/data/select-row-cols.ods new file mode 100644 index 0000000..83cb8f1 Binary files /dev/null and b/sc/qa/unit/tiledrendering/data/select-row-cols.ods differ diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx index e5154d8..6549784 100644 --- a/sc/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx @@ -46,11 +46,13 @@ public: virtual void tearDown() SAL_OVERRIDE; #if !defined(WNT) && !defined(MACOSX) + void testRowColumnSelections(); void testSortAscendingDescending(); #endif CPPUNIT_TEST_SUITE(ScTiledRenderingTest); #if !defined(WNT) && !defined(MACOSX) + CPPUNIT_TEST(testRowColumnSelections); CPPUNIT_TEST(testSortAscendingDescending); #endif CPPUNIT_TEST_SUITE_END(); @@ -144,6 +146,73 @@ void ScTiledRenderingTest::callbackImpl(int /*nType*/, const char* /*pPayload*/) //} } +void ScTiledRenderingTest::testRowColumnSelections() +{ + comphelper::LibreOfficeKit::setActive(); + ScModelObj* pModelObj = createDoc("select-row-cols.ods"); + //ScDocument* pDoc = pModelObj->GetDocument(); + + uno::Sequence<beans::PropertyValue> aArgs(2); + + // Select the 5th row with no modifier + aArgs[0].Name = OUString::fromUtf8("Row"); + aArgs[0].Value <<= static_cast<sal_Int32>(5 - 1); + aArgs[1].Name = OUString::fromUtf8("Modifier"); + aArgs[1].Value <<= static_cast<sal_uInt16>(0); + comphelper::dispatchCommand(".uno:SelectRow", aArgs); + + // Check if it is selected + OString aUsedMimeType; + OString aResult = pModelObj->getTextSelection("text/plain;charset=utf-8", aUsedMimeType); + OString aExpected("1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\t21\n"); + CPPUNIT_ASSERT_EQUAL(aExpected, aResult); + + // Select the 10th row with shift modifier + aArgs[0].Name = OUString::fromUtf8("Row"); + aArgs[0].Value <<= static_cast<sal_Int32>(10 - 1); + aArgs[1].Name = OUString::fromUtf8("Modifier"); + aArgs[1].Value <<= static_cast<sal_uInt16>(KEY_SHIFT); + comphelper::dispatchCommand(".uno:SelectRow", aArgs); + + // Check if all the rows from 5th to 10th get selected + aResult = pModelObj->getTextSelection("text/plain;charset=utf-8", aUsedMimeType); + aExpected = "1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\t21\n2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\t21\t22\n3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\t21\t22\t23\n4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\t21\t22\t23\t24\n5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\t21\t22\t23\t24\t25\n6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17\t18\t19\t20\t21\t22\t23\t24\t25\t26\n"; + CPPUNIT_ASSERT_EQUAL(aExpected, aResult); + + // Select the 10th row with ctrl modifier + aArgs[0].Name = OUString::fromUtf8("Row"); + aArgs[0].Value <<= static_cast<sal_Int32>(13 - 1); + aArgs[1].Name = OUString::fromUtf8("Modifier"); + aArgs[1].Value <<= static_cast<sal_uInt16>(KEY_MOD1); + comphelper::dispatchCommand(".uno:SelectRow", aArgs); + + // When we copy this, we don't get anything useful, but we must not crash + // (used to happen) + aResult = pModelObj->getTextSelection("text/plain;charset=utf-8", aUsedMimeType); + CPPUNIT_ASSERT_EQUAL(OString(), aResult); + + // TODO check that we really selected what we wanted here + + // Select Column 5 with ctrl modifier + aArgs[0].Name = OUString::fromUtf8("Col"); + aArgs[0].Value <<= static_cast<sal_Int32>(5 - 1); + aArgs[1].Name = OUString::fromUtf8("Modifier"); + aArgs[1].Value <<= static_cast<sal_uInt16>(KEY_MOD1); + comphelper::dispatchCommand(".uno:SelectColumn", aArgs); + + // When we copy this, we don't get anything useful, but we must not crash + // (used to happen) + aResult = pModelObj->getTextSelection("text/plain;charset=utf-8", aUsedMimeType); + CPPUNIT_ASSERT_EQUAL(OString(), aResult); + + // TODO check that we really selected what we wanted here + + // TODO: Add test for negative selection: .uno:SelectRow/Column on already + // selected row/column should deselect it. + + comphelper::LibreOfficeKit::setActive(false); +} + void ScTiledRenderingTest::testSortAscendingDescending() { comphelper::LibreOfficeKit::setActive(); commit 06b4ed6ef10a6cdf2f51e9d0d8c205637363b6cf Author: Jan Holesovsky <ke...@collabora.com> Date: Fri Mar 18 16:23:26 2016 +0100 sc lok bccu#1602: Don't crash when the copy functionality is not allowed. Change-Id: I0fe5871782d5892f9eda201be042648a45b9f9d4 (cherry picked from commit 9fa5e2b62e45843eafac3f34bbea1e57ad36078d) diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 5227750..e81336a 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -752,7 +752,7 @@ OString ScModelObj::getTextSelection(const char* pMimeType, OString& rUsedMimeTy else aFlavor.DataType = cppu::UnoType< uno::Sequence<sal_Int8> >::get(); - if (!xTransferable->isDataFlavorSupported(aFlavor)) + if (!xTransferable.is() || !xTransferable->isDataFlavorSupported(aFlavor)) return OString(); uno::Any aAny(xTransferable->getTransferData(aFlavor)); commit 4d606b3d02d39b5b310bd39df1de523b95df705c Author: Jan Holesovsky <ke...@collabora.com> Date: Fri Mar 18 15:52:55 2016 +0100 sc lok bccu#1519: More general solution to detecting cell resizes. This covers even the row height updates when the text in the cell changes etc. Change-Id: Idb570fa2c3c4d3c6bcdb381f8ce07a0311354083 (cherry picked from commit e35ae1b6726166f443e8309b8ce96bc243c8a355) diff --git a/sc/source/ui/docshell/docsh3.cxx b/sc/source/ui/docshell/docsh3.cxx index efcf435..a805c01 100644 --- a/sc/source/ui/docshell/docsh3.cxx +++ b/sc/source/ui/docshell/docsh3.cxx @@ -63,6 +63,9 @@ #include "markdata.hxx" #include <memory> +#include <comphelper/lok.hxx> +#include <LibreOfficeKit/LibreOfficeKitEnums.h> + // Redraw - Benachrichtigungen void ScDocShell::PostEditView( ScEditEngineDefaulter* pEditEngine, const ScAddress& rCursorPos ) @@ -159,6 +162,11 @@ void ScDocShell::PostPaint( const ScRangeList& rRanges, sal_uInt16 nPart, sal_uI } Broadcast(ScPaintHint(aPaintRanges.Combine(), nPart)); + + // LOK: we are supposed to update the row / columns headers (and actually + // the document size too - cell size affects that, obviously) + if ((nPart & (PAINT_TOP | PAINT_LEFT)) && comphelper::LibreOfficeKit::isActive() && aDocument.GetDrawLayer()) + aDocument.GetDrawLayer()->libreOfficeKitCallback(LOK_CALLBACK_DOCUMENT_SIZE_CHANGED, ""); } void ScDocShell::PostPaintGridAll() diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index 33d89c7..4c64e57 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -157,9 +157,6 @@ bool ScViewFunc::AdjustBlockHeight( bool bPaint, ScMarkData* pMarkData ) if ( bPaint && bAnyChanged ) pDocSh->UpdateOle(&GetViewData()); - if (bAnyChanged && comphelper::LibreOfficeKit::isActive() && rDoc.GetDrawLayer()) - rDoc.GetDrawLayer()->libreOfficeKitCallback(LOK_CALLBACK_DOCUMENT_SIZE_CHANGED, ""); - return bAnyChanged; } commit 2430551d2e815f982940b37f956f44783cd6ae76 Author: Jan Holesovsky <ke...@collabora.com> Date: Thu Mar 17 19:53:40 2016 +0100 sc: Improve documentation, and a cosmetic change. Change-Id: Id99b963602816710a2c6767795343a9518833b43 (cherry picked from commit 6ed0bbf32160386ac1287e77279105b11f25ff50) diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index 748e430..0e21f09 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -475,19 +475,21 @@ public: void MarkRows(); /** - * @brief Called to select a full column + * Called to select the specified full column. * * @param nCol: Column number to do operation on - * @param nModifier: + * @param nModifier: 0, KEY_SHIFT, KEY_MOD1, KEY_SHIFT | KEY_MOD1 */ + void MarkColumns(SCCOL nCol, sal_Int16 nModifier); /** - * @brief Called to select a full row + * Called to select the specified full row. * * @param nRow: Row number to do operation on - * @param nModifier: + * @param nModifier: 0, KEY_SHIFT, KEY_MOD1, KEY_SHIFT | KEY_MOD1 */ void MarkRows(SCROW nRow, sal_Int16 nModifier); + void MarkDataArea( bool bIncludeCursor = true ); void MarkMatrixFormula(); void Unmark(); diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index cd6d39a..0e592b4 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -1402,12 +1402,10 @@ void ScTabView::MarkColumns(SCCOL nCol, sal_Int16 nModifier) SCTAB nTab = aViewData.GetTabNo(); bool bTestNeg = true; - switch( nModifier ) + if ((nModifier & KEY_SHIFT) == KEY_SHIFT) { - case KEY_SHIFT: - case KEY_MOD1 + KEY_SHIFT: - nStartCol = aViewData.GetCurX(); - bTestNeg = false; + nStartCol = aViewData.GetCurX(); + bTestNeg = false; } DoneBlockMode( nModifier != 0 ); @@ -1423,12 +1421,10 @@ void ScTabView::MarkRows(SCROW nRow, sal_Int16 nModifier) SCTAB nTab = aViewData.GetTabNo(); bool bTestNeg = true; - switch ( nModifier ) + if ((nModifier & KEY_SHIFT) == KEY_SHIFT) { - case KEY_SHIFT: - case KEY_MOD1 + KEY_SHIFT: - nStartRow = aViewData.GetCurY(); - bTestNeg = false; + nStartRow = aViewData.GetCurY(); + bTestNeg = false; } DoneBlockMode( nModifier != 0 ); commit 705ac2f604c533425c8e4516729ae8f3562f0a29 Author: Pranav Kant <pran...@collabora.com> Date: Tue Mar 15 15:35:27 2016 +0530 sc lok: Extend uno commands: .uno:SelectRow/Column Now also accepts a row/column index with modifier key to do various selection/block selection/negative selection operations Change-Id: Idfb56b94ca2eb4553eb9388b786f5d1e89448ec2 Reviewed-on: https://gerrit.libreoffice.org/23256 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Jan Holesovsky <ke...@collabora.com> (cherry picked from commit ede2f9fb6dc7131970581eaac1a8d7d34947aeab) diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi index 75f0233..4746117 100644 --- a/sc/sdi/scalc.sdi +++ b/sc/sdi/scalc.sdi @@ -6291,7 +6291,7 @@ SfxVoidItem SelectOLE SID_OLE_SELECT SfxVoidItem SelectColumn SID_SELECT_COL -() +(SfxInt32Item Col FN_PARAM_1,SfxInt16Item Modifier FN_PARAM_2) [ /* flags: */ AutoUpdate = FALSE, @@ -6540,7 +6540,7 @@ SfxObjectItem Selection SID_SC_SELECTION SfxVoidItem SelectRow SID_SELECT_ROW -() +(SfxInt32Item Row FN_PARAM_1,SfxInt16Item Modifier FN_PARAM_2) [ /* flags: */ AutoUpdate = FALSE, diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index 244073f..748e430 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -473,6 +473,21 @@ public: void MarkColumns(); void MarkRows(); + + /** + * @brief Called to select a full column + * + * @param nCol: Column number to do operation on + * @param nModifier: + */ + void MarkColumns(SCCOL nCol, sal_Int16 nModifier); + /** + * @brief Called to select a full row + * + * @param nRow: Row number to do operation on + * @param nModifier: + */ + void MarkRows(SCROW nRow, sal_Int16 nModifier); void MarkDataArea( bool bIncludeCursor = true ); void MarkMatrixFormula(); void Unmark(); diff --git a/sc/source/ui/view/cellsh4.cxx b/sc/source/ui/view/cellsh4.cxx index 5fe24c6..aa8442d 100644 --- a/sc/source/ui/view/cellsh4.cxx +++ b/sc/source/ui/view/cellsh4.cxx @@ -275,6 +275,7 @@ void ScCellShell::ExecuteMove( SfxRequest& rReq ) { ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell(); sal_uInt16 nSlotId = rReq.GetSlot(); + const SfxItemSet* pReqArgs = rReq.GetArgs(); if(nSlotId != SID_CURSORTOPOFSCREEN && nSlotId != SID_CURSORENDOFSCREEN) pTabViewShell->ExecuteInputDirect(); @@ -316,11 +317,37 @@ void ScCellShell::ExecuteMove( SfxRequest& rReq ) break; case SID_SELECT_COL: - pTabViewShell->MarkColumns(); + { + const SfxPoolItem* pColItem; + const SfxPoolItem* pModifierItem; + if ( pReqArgs && pReqArgs->HasItem( FN_PARAM_1, &pColItem ) && + pReqArgs->HasItem( FN_PARAM_2, &pModifierItem ) ) + { + SCCOL nCol = static_cast<SCCOL>(static_cast<const SfxInt16Item*>(pColItem)->GetValue());; + sal_Int16 nModifier = static_cast<sal_Int16>(static_cast<const SfxInt16Item*>(pModifierItem)->GetValue()); + + pTabViewShell->MarkColumns( nCol, nModifier ); + } + else + pTabViewShell->MarkColumns(); + } break; case SID_SELECT_ROW: - pTabViewShell->MarkRows(); + { + const SfxPoolItem* pRowItem; + const SfxPoolItem* pModifierItem; + if ( pReqArgs && pReqArgs->HasItem( FN_PARAM_1, &pRowItem ) && + pReqArgs->HasItem( FN_PARAM_2, &pModifierItem ) ) + { + SCROW nRow = static_cast<SCROW>(static_cast<const SfxInt32Item*>(pRowItem)->GetValue());; + sal_Int16 nModifier = static_cast<sal_Int16>(static_cast<const SfxInt16Item*>(pModifierItem)->GetValue()); + + pTabViewShell->MarkRows( nRow, nModifier ); + } + else + pTabViewShell->MarkRows(); + } break; case SID_SELECT_NONE: diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 731c560..2aec1cb 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -1621,6 +1621,17 @@ void ScGridWindow::GetSelectionRects( ::std::vector< Rectangle >& rPixelRects ) if (nY2 > nYBottom) nY2 = nYBottom; } + else + { + SCCOL nMaxTiledCol; + SCROW nMaxTiledRow; + pDoc->GetTiledRenderingArea( nTab, nMaxTiledCol, nMaxTiledRow ); + + if (nX2 > nMaxTiledCol) + nX2 = nMaxTiledCol; + if (nY2 > nMaxTiledRow) + nY2 = nMaxTiledRow; + } double nPPTX = pViewData->GetPPTX(); double nPPTY = pViewData->GetPPTY(); diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index d6e31a5..cd6d39a 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -1395,6 +1395,49 @@ void ScTabView::MarkRows() SelectionChanged(); } + +void ScTabView::MarkColumns(SCCOL nCol, sal_Int16 nModifier) +{ + SCCOL nStartCol = nCol; + SCTAB nTab = aViewData.GetTabNo(); + bool bTestNeg = true; + + switch( nModifier ) + { + case KEY_SHIFT: + case KEY_MOD1 + KEY_SHIFT: + nStartCol = aViewData.GetCurX(); + bTestNeg = false; + } + + DoneBlockMode( nModifier != 0 ); + InitBlockMode( nStartCol, 0, nTab, bTestNeg, true, false ); + MarkCursor( nCol, MAXROW, nTab ); + SetCursor( nCol, 0 ); + SelectionChanged(); +} + +void ScTabView::MarkRows(SCROW nRow, sal_Int16 nModifier) +{ + SCROW nStartRow = nRow; + SCTAB nTab = aViewData.GetTabNo(); + bool bTestNeg = true; + + switch ( nModifier ) + { + case KEY_SHIFT: + case KEY_MOD1 + KEY_SHIFT: + nStartRow = aViewData.GetCurY(); + bTestNeg = false; + } + + DoneBlockMode( nModifier != 0 ); + InitBlockMode( 0, nStartRow, nTab, bTestNeg, false, true ); + MarkCursor( MAXCOL, nRow, nTab ); + SetCursor( 0, nRow ); + SelectionChanged(); +} + void ScTabView::MarkDataArea( bool bIncludeCursor ) { ScDocument* pDoc = aViewData.GetDocument(); commit 6715a7c2eb0b48e59511c3ade5d543345a641289 Author: Caolán McNamara <caol...@redhat.com> Date: Fri Mar 11 16:15:16 2016 +0000 Resolves: tdf#94392 huge negative Y causes length exception because this rendering stuff is deleted in later versions of LibreOffice and replaced with cairo rendering, just bodge this case to give up and go home. Change-Id: I4e60184b0919dc719edfe223ebb2d8ef684608e8 Reviewed-on: https://gerrit.libreoffice.org/23154 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: David Tardon <dtar...@redhat.com> (cherry picked from commit 93772371096b4caf542146e673a44d8d346a09ab) (cherry picked from commit 0c4ee554c04a38ff0c6d2ac22e559baa95dddaf5) diff --git a/basebmp/inc/polypolygonrenderer.hxx b/basebmp/inc/polypolygonrenderer.hxx index fef2f7f..a23ab84 100644 --- a/basebmp/inc/polypolygonrenderer.hxx +++ b/basebmp/inc/polypolygonrenderer.hxx @@ -161,7 +161,14 @@ namespace basebmp return; // really, nothing to do then. detail::VectorOfVectorOfVertices aGET; // the Global Edge Table - aGET.resize( nMaxY - nMinY + 1 ); + try + { + aGET.resize( nMaxY - nMinY + 1 ); + } + catch (...) + { + return; + } sal_uInt32 const nVertexCount( detail::setupGlobalEdgeTable( aGET, rPoly, nMinY ) ); commit a839c01356c28f23c7e45f9b3babfa36b50c4182 Author: Jan Holesovsky <ke...@collabora.com> Date: Wed Mar 16 15:35:49 2016 +0100 sc lok bccu#1519: Broadcast cell size changes, they affect the document size. Change-Id: Icd42c0252c28a24ac9c6c535a146a2f3b3beda17 (cherry picked from commit 9b504d41523ceabbff1235f7ffc1ef409cca504a) diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index 4c64e57..33d89c7 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -157,6 +157,9 @@ bool ScViewFunc::AdjustBlockHeight( bool bPaint, ScMarkData* pMarkData ) if ( bPaint && bAnyChanged ) pDocSh->UpdateOle(&GetViewData()); + if (bAnyChanged && comphelper::LibreOfficeKit::isActive() && rDoc.GetDrawLayer()) + rDoc.GetDrawLayer()->libreOfficeKitCallback(LOK_CALLBACK_DOCUMENT_SIZE_CHANGED, ""); + return bAnyChanged; } commit 54028fe68ba34d373259de6f60d76c065d8decd0 Author: Jan Holesovsky <ke...@collabora.com> Date: Fri Mar 11 20:45:02 2016 +0100 lok: Avoid dereferencing nullptr. Change-Id: I40a53cf08e2a789299cd7a05d531b4f920653989 (cherry picked from commit 97c872d015350810fb0180ffdb10de7f039363a4) diff --git a/svx/source/table/tablecontroller.cxx b/svx/source/table/tablecontroller.cxx index beb75e0..718b500 100644 --- a/svx/source/table/tablecontroller.cxx +++ b/svx/source/table/tablecontroller.cxx @@ -245,9 +245,17 @@ bool SvxTableController::onKeyInput(const KeyEvent& rKEvt, vcl::Window* pWindow return executeAction( nAction, rKEvt.GetKeyCode().IsShift(), pWindow ); } +namespace { -// css::awt::XMouseClickHandler: +Point pixelToLogic(const Point& rPoint, vcl::Window* pWindow) +{ + if (!pWindow) + return rPoint; + return pWindow->PixelToLogic(rPoint); +} + +} bool SvxTableController::onMouseButtonDown(const MouseEvent& rMEvt, vcl::Window* pWindow ) { @@ -268,7 +276,7 @@ bool SvxTableController::onMouseButtonDown(const MouseEvent& rMEvt, vcl::Window* if( !rMEvt.IsRight() && mpView->PickAnything(rMEvt,SdrMouseEventKind::BUTTONDOWN, aVEvt) == SDRHIT_HANDLE ) return false; - TableHitKind eHit = static_cast< SdrTableObj* >(mxTableObj.get())->CheckTableHit( pWindow->PixelToLogic(rMEvt.GetPosPixel()), maMouseDownPos.mnCol, maMouseDownPos.mnRow, 0 ); + TableHitKind eHit = static_cast< SdrTableObj* >(mxTableObj.get())->CheckTableHit(pixelToLogic(rMEvt.GetPosPixel(), pWindow), maMouseDownPos.mnCol, maMouseDownPos.mnRow, 0); mbLeftButtonDown = (rMEvt.GetClicks() == 1) && rMEvt.IsLeft(); @@ -286,11 +294,7 @@ bool SvxTableController::onMouseButtonDown(const MouseEvent& rMEvt, vcl::Window* { RemoveSelection(); - Point aPnt(rMEvt.GetPosPixel()); - if (pWindow!=nullptr) - aPnt=pWindow->PixelToLogic(aPnt); - - SdrHdl* pHdl = mpView->PickHandle(aPnt); + SdrHdl* pHdl = mpView->PickHandle(pixelToLogic(rMEvt.GetPosPixel(), pWindow)); if( pHdl ) { @@ -356,7 +360,7 @@ bool SvxTableController::onMouseMove(const MouseEvent& rMEvt, vcl::Window* pWind SdrTableObj* pTableObj = dynamic_cast< SdrTableObj* >( mxTableObj.get() ); CellPos aPos; - if( mbLeftButtonDown && pTableObj && pTableObj->CheckTableHit( pWindow->PixelToLogic(rMEvt.GetPosPixel()), aPos.mnCol, aPos.mnRow, 0 ) != SDRTABLEHIT_NONE ) + if (mbLeftButtonDown && pTableObj && pTableObj->CheckTableHit(pixelToLogic(rMEvt.GetPosPixel(), pWindow), aPos.mnCol, aPos.mnRow, 0 ) != SDRTABLEHIT_NONE) { if(aPos != maMouseDownPos) { commit 8049caf981fd4169d9bd4ca2d46134e2d6383ff5 Author: Jan Holesovsky <ke...@collabora.com> Date: Thu Mar 10 18:50:54 2016 +0100 sc lok: Don't interact with the user during .uno:SortAscending or Descending. Change-Id: Ib3679413ba59e86438dac83abfa9b624e291e5a9 (cherry picked from commit 235136c17868627412db8dda148d3c4103907c0c) diff --git a/sc/CppunitTest_sc_tiledrendering.mk b/sc/CppunitTest_sc_tiledrendering.mk new file mode 100644 index 0000000..995cdc8 --- /dev/null +++ b/sc/CppunitTest_sc_tiledrendering.mk @@ -0,0 +1,62 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,sc_tiledrendering)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sc_tiledrendering, \ + sc/qa/unit/tiledrendering/tiledrendering \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sc_tiledrendering, \ + comphelper \ + cppu \ + cppuhelper \ + editeng \ + sal \ + sfx \ + svl \ + svt \ + svxcore \ + sc \ + scui \ + test \ + unotest \ + vcl \ + tl \ + utl \ + $(gb_UWINAPI) \ +)) + +$(eval $(call gb_CppunitTest_use_externals,sc_tiledrendering,\ + boost_headers \ + libxml2 \ +)) + +$(eval $(call gb_CppunitTest_set_include,sc_tiledrendering,\ + -I$(SRCDIR)/sc/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_api,sc_tiledrendering,\ + offapi \ + udkapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,sc_tiledrendering)) +$(eval $(call gb_CppunitTest_use_vcl,sc_tiledrendering)) + +$(eval $(call gb_CppunitTest_use_rdb,sc_tiledrendering,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sc_tiledrendering)) + +$(call gb_CppunitTest_get_target,sc_tiledrendering) : $(call gb_AllLangResTarget_get_target,sc) + +# vim: set noet sw=4 ts=4: diff --git a/sc/Module_sc.mk b/sc/Module_sc.mk index 3dcb39a..d656f71 100644 --- a/sc/Module_sc.mk +++ b/sc/Module_sc.mk @@ -46,6 +46,7 @@ $(eval $(call gb_Module_add_check_targets,sc,\ CppunitTest_sc_filters_test \ CppunitTest_sc_rangelst_test \ CppunitTest_sc_core \ + CppunitTest_sc_tiledrendering \ )) $(eval $(call gb_Module_add_slowcheck_targets,sc, \ diff --git a/sc/qa/unit/tiledrendering/data/sort-range.ods b/sc/qa/unit/tiledrendering/data/sort-range.ods new file mode 100644 index 0000000..cd9e4e4 Binary files /dev/null and b/sc/qa/unit/tiledrendering/data/sort-range.ods differ diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx new file mode 100644 index 0000000..e5154d8 --- /dev/null +++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx @@ -0,0 +1,191 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> +#include <test/xmltesttools.hxx> +#include <boost/property_tree/json_parser.hpp> + +#define LOK_USE_UNSTABLE_API +#include <LibreOfficeKit/LibreOfficeKitEnums.h> +#include <com/sun/star/frame/Desktop.hpp> +#include <comphelper/dispatchcommand.hxx> +#include <comphelper/processfactory.hxx> +#include <comphelper/propertysequence.hxx> +#include <comphelper/string.hxx> +#include <editeng/editids.hrc> +#include <editeng/editview.hxx> +#include <editeng/outliner.hxx> +#include <osl/conditn.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/viewfrm.hxx> +#include <svl/srchitem.hxx> + +#include <comphelper/lok.hxx> + +#include <document.hxx> +#include <docuno.hxx> + +using namespace css; + +#if !defined(WNT) && !defined(MACOSX) +static const char* DATA_DIRECTORY = "/sc/qa/unit/tiledrendering/data/"; +#endif + +class ScTiledRenderingTest : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools +{ +public: + ScTiledRenderingTest(); + virtual void setUp() SAL_OVERRIDE; + virtual void tearDown() SAL_OVERRIDE; + +#if !defined(WNT) && !defined(MACOSX) + void testSortAscendingDescending(); +#endif + + CPPUNIT_TEST_SUITE(ScTiledRenderingTest); +#if !defined(WNT) && !defined(MACOSX) + CPPUNIT_TEST(testSortAscendingDescending); +#endif + CPPUNIT_TEST_SUITE_END(); + +private: +#if !defined(WNT) && !defined(MACOSX) + ScModelObj* createDoc(const char* pName); + static void callback(int nType, const char* pPayload, void* pData); + void callbackImpl(int nType, const char* pPayload); +#endif + + uno::Reference<lang::XComponent> mxComponent; +#if !defined(WNT) && !defined(MACOSX) + // TODO various test-related members - when needed +#endif +}; + +ScTiledRenderingTest::ScTiledRenderingTest() +#if !defined(WNT) && !defined(MACOSX) + // TODO various test-related members - when needed +#endif +{ +} + +void ScTiledRenderingTest::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(css::frame::Desktop::create(comphelper::getComponentContext(getMultiServiceFactory()))); +} + +void ScTiledRenderingTest::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +#if !defined(WNT) && !defined(MACOSX) +ScModelObj* ScTiledRenderingTest::createDoc(const char* pName) +{ + if (mxComponent.is()) + mxComponent->dispose(); + mxComponent = loadFromDesktop(m_directories.getURLFromSrc(DATA_DIRECTORY) + OUString::createFromAscii(pName), "com.sun.star.sheet.SpreadsheetDocument"); + ScModelObj* pModelObj = dynamic_cast<ScModelObj*>(mxComponent.get()); + CPPUNIT_ASSERT(pModelObj); + pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>()); + return pModelObj; +} + +void ScTiledRenderingTest::callback(int nType, const char* pPayload, void* pData) +{ + static_cast<ScTiledRenderingTest*>(pData)->callbackImpl(nType, pPayload); +} + +/* TODO when needed... +static std::vector<OUString> lcl_convertSeparated(const OUString& rString, sal_Unicode nSeparator) +{ + std::vector<OUString> aRet; + + sal_Int32 nIndex = 0; + do + { + OUString aToken = rString.getToken(0, nSeparator, nIndex); + aToken = aToken.trim(); + if (!aToken.isEmpty()) + aRet.push_back(aToken); + } + while (nIndex >= 0); + + return aRet; +} + +static void lcl_convertRectangle(const OUString& rString, Rectangle& rRectangle) +{ + uno::Sequence<OUString> aSeq = comphelper::string::convertCommaSeparated(rString); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), aSeq.getLength()); + rRectangle.setX(aSeq[0].toInt32()); + rRectangle.setY(aSeq[1].toInt32()); + rRectangle.setWidth(aSeq[2].toInt32()); + rRectangle.setHeight(aSeq[3].toInt32()); +} +*/ + +void ScTiledRenderingTest::callbackImpl(int /*nType*/, const char* /*pPayload*/) +{ + // TODO when needed... + //switch (nType) + //{ + //} +} + +void ScTiledRenderingTest::testSortAscendingDescending() +{ + comphelper::LibreOfficeKit::setActive(); + ScModelObj* pModelObj = createDoc("sort-range.ods"); + ScDocument* pDoc = pModelObj->GetDocument(); + + // select the values in the first column + pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, 551, 129, 1); + pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEMOVE, 820, 1336, 1); + pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, 820, 1359, 1); + + // sort ascending + uno::Sequence<beans::PropertyValue> aArgs; + comphelper::dispatchCommand(".uno:SortAscending", aArgs); + + // check it's sorted + for (SCROW r = 0; r < 6; ++r) + { + CPPUNIT_ASSERT_EQUAL(double(r + 1), pDoc->GetValue(ScAddress(0, r, 0))); + } + + // sort descending + comphelper::dispatchCommand(".uno:SortDescending", aArgs); + + // check it's sorted + for (SCROW r = 0; r < 6; ++r) + { + CPPUNIT_ASSERT_EQUAL(double(6 - r), pDoc->GetValue(ScAddress(0, r, 0))); + } + + // nothing else was sorted + CPPUNIT_ASSERT_EQUAL(double(1), pDoc->GetValue(ScAddress(1, 0, 0))); + CPPUNIT_ASSERT_EQUAL(double(3), pDoc->GetValue(ScAddress(1, 1, 0))); + CPPUNIT_ASSERT_EQUAL(double(2), pDoc->GetValue(ScAddress(1, 2, 0))); + + comphelper::LibreOfficeKit::setActive(false); +} + +#endif + +CPPUNIT_TEST_SUITE_REGISTRATION(ScTiledRenderingTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx index 354ae1f..ca73059 100644 --- a/sc/source/ui/view/cellsh2.cxx +++ b/sc/source/ui/view/cellsh2.cxx @@ -20,6 +20,7 @@ #include <config_features.h> #include "scitems.hxx" +#include <comphelper/lok.hxx> #include <sfx2/viewfrm.hxx> #include <sfx2/app.hxx> #include <sfx2/request.hxx> @@ -164,8 +165,10 @@ static bool lcl_GetSortParam( const ScViewData* pData, ScSortParam& rSortParam ) aExternalRange.aEnd.SetRow( nEndRow ); aExternalRange.aEnd.SetCol( nEndCol ); - if(( rSortParam.nCol1 == rSortParam.nCol2 && aExternalRange.aStart.Col() != aExternalRange.aEnd.Col() ) || - ( rSortParam.nRow1 == rSortParam.nRow2 && aExternalRange.aStart.Row() != aExternalRange.aEnd.Row() ) ) + // with LibreOfficeKit, don't try to interact with the user + if (!comphelper::LibreOfficeKit::isActive() && ... etc. - the rest is truncated
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits