Layercake: From UNO code to Writer Core Bjoern Michaelsen Deputy Member, Board of Directors The Document Foundation Ubuntu LibreOffice package maintainer Canonical
Interfaces, Services and Implementations A quick race through some UNO concepts ...
Interfaces, Services and Implementations Interfaces say what you can do with a UNO-thing usually named com::sun::star... and then a name prefixed with X Services promise to provide a set of Interfaces and then a name not prefixed with X Implementations can provide a service or a set of Interfaces usually named … inconsistently have some some real core code behind it
XCargoStorage XTransport
Lorry service still abstract implements XTransport and XCargoStorage
Lorry implementation concrete implements a service has some real code behind it
UNO Runtime Reflection How to find out what kind of UNO thing you are holding ...
XInterface
XServiceInfo
The css.script.theServiceDocumenter singleton Getting to the UNO documentation from your extension or script quickly ...
TheServiceDocumenter.showServiceDocs(...) void showServiceDocs( [in] com::sun::star::lang::XServiceInfo xService ); opens documentation for all services supported by this implementation in a browser
TheServiceDocumenter.showInterfaceDocs(...) void showInterfaceDocs( [in] com::sun::star::lang::XTypeProvider xTypeProvider ); opens documentation for all interfaces (types) supported by this implementation in a browser
Example Ad-hoc StarBasic TheServiceDocumenter = GetDefaultContext().getValueByName( "/singletons/com.sun.star.util.theServiceDocumenter") ' old style reflection helpers MsgBox(TheServiceDocumenter.Dbg_Methods) MsgBox(TheServiceDocumenter.Dbg_Properties) MsgBox(TheServiceDocumenter.Dbg_SupportedInterfaces) ' using the Service Documenter TheServiceDocumenter.showServiceDocs(ThisComponent) 'TheServiceDocumenter.showInterfaceDocs(ThisComponent)
Hard Things There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors. – Phil Karlton
Interfaces, Services, UNO Wrappers and Core Interfaces say what you can do with a UNO-thing usually named com::sun::star... and then a name prefixed with X Services promise to provide a set of Interfaces and then a name not prefixed with X UNO Wrappers (implementations) can provide a service or a set of Interfaces usually named … inconsistently call real core code behind it Core implementations do the real work and usually are older than UNO
Interfaces, Services, UNO Wrappers and Core core implementation UNO Wrapper Interfaces and Services
Writer Python Tests Directory sw/qa/python has the tests Makefile sw/PythonTest_sw_python triggers them So, to trigger them manually: make PythonTest_sw_python
Debugging Python Tests: symbols ./autogen.sh --enable-symbols && make make sw.clean && make sw DEBUG=T
Debugging Python Tests Callgrinding tests: VALGRIND=callgrind make PythonTest_sw_python ls -lh ./workdir/PythonTest/sw_python/done.core/ callgrind_annotate $FILE \ --inclusive=yes \ --threshold=100 \ | grep sw/source/core/unocore \ | head -10 Debugging into tests: CPPUNITTRACE="gdb --args" make PythonTest_sw_python
check_styles.py: callgrind 32,453,621 unostyle.cxx:sw::XStyleFamily::getByName(rtl::OUString const&) [libswlo.so] 23,155,924 unostyle.cxx:non-virtual thunk to sw::XStyleFamily::getByName(rtl::OUString const&) [libswlo.so] 11,395,863 unostyle.cxx:com::sun::star::uno::Reference<com::sun::star::style::XStyle> lcl_CreateStyle<(SfxStyleFamily)2>(SfxStyleSheetBasePool*, SwDocShell*, rtl::OUString const&) [libswlo.so] 11,132,842 unostyle.cxx:SwXStyle::SwXStyle(SfxStyleSheetBasePool*, SfxStyleFamily, SwDoc*, rtl::OUString const&) [libswlo.so] 10,673,960 unostyle.cxx:non-virtual thunk to sw::XStyleFamily::getElementNames() [libswlo.so]
check_styles.py: backtrace (gdb) bt #0 SwDocStyleSheet::PresetNameAndFamily (this=0x7fffe1544638, rName=...) at ...sw/source/uibase/app/docstyle.cxx:2209 #1 0x00007fffdccad7f8 in SwStyleSheetIterator::Next (this=0x1640780) at ...sw/source/uibase/app/docstyle.cxx:3098 #2 0x00007fffdccad6df in SwStyleSheetIterator::First (this=0x1640780) at ...sw/source/uibase/app/docstyle.cxx:3087 #3 0x00007fffdca9da6d in sw::XStyleFamily::getElementNames (this=0x7fffd6da5998) at ...sw/source/core/unocore/unostyle.cxx:873 #4 0x00007ffff1796907 in gcc3::callVirtualMethod (pThis=0x7fffd6da59c0, nVtableIndex=6, pRegisterReturn=0x7fffffff1d40, pReturnTypeRef=0x862ed0, bSimpleReturn=false, pStack=0x7fffffff1ab0, nStack=0, pGPR=0x7fffffff1bd0, pFPR=0x7fffffff1c00) at ...bridges/source/cpp_uno/gcc3_linux_x86- 64/callvirtualmethod.cxx:133
Interfaces, Services, UNO Wrappers and Core core implementation: SwDocStyleSheet, SwStyleSheetIterator UNO Wrapper: SwXStyleFamily Interfaces and Services: com::sun::star::text::Text::ParagraphStyle
check_table.py: callgrind 118,911,501 unotbl.cxx:SwXTextTable::getData() 109,031,858 unotbl.cxx:SwXCellRange::getData() 107,979,526 unotext.cxx:SwXText::getString() [libswlo.so] 101,504,055 unotbl.cxx:SwXCell::getValue() [libswlo.so] 88,469,311 unoobj.cxx:SwXTextCursor::getString() [libswlo.so]
check_table.py: backtrace #0 sw_GetTableBoxColStr (nCol=0, rNm=...) at ...sw/source/core/table/swtable.cxx:1793 #1 0x00007fffdc6e7526 in sw_GetCellName (nColumn=0, nRow=0) at ...sw/source/core/unocore/unotbl.cxx:522 #2 0x00007fffdc6e7955 in lcl_CreateXCell (pFormat=0x7fffd69cf000, nColumn=0, nRow=0) at ...sw/source/core/unocore/unotbl.cxx:584 #3 0x00007fffdc6f8846 in SwXCellRange::GetCells (this=0x7fffd69f4698) at ...sw/source/core/unocore/unotbl.cxx:3342 #4 0x00007fffdc570ccc in SwChartDataSequence::GetCells (this=0x7fffd7683210) at ...sw/source/core/unocore/unochart.cxx:2149 #5 0x00007fffdc5710af in SwChartDataSequence::getNumericalData (this=0x7fffd7683210) at ...sw/source/core/unocore/unochart.cxx:2184 #6 0x00007ffff1799907 in gcc3::callVirtualMethod (pThis=0x7fffd7683248, nVtableIndex=3, pRegisterReturn=0x7fffffff1e60, pReturnTypeRef=0x1636620, bSimpleReturn=false, pStack=0x7fffffff1bd0, nStack=0, pGPR=0x7fffffff1cf0, pFPR=0x7fffffff1d20) at ...bridges/source/cpp_uno/gcc3_linux_x86- 64/callvirtualmethod.cxx:133
Interfaces, Services, UNO Wrappers and Core core implementation: sw_GetTableBoxColString() UNO Wrapper: SwXCellRange Interfaces and Services Com::sun::star::text::XTextTable
Thank you! @Sweet5hark See you at the LibreOffice Conference in Brno 2016 Find out more at http://conference.libreoffice.org
Default Slide Example Here is space for your content … Some hints: Use the master pages being the basis for the default slides It would be useful to add your presentation title to the footer. Add it via Insert – Page Number … – Footer Use the LibreOffice Color Palette delivered with LibreOffice (libreoffice.soc)
Pre-defined Shapes Here are some pre-defined shapes for your convenience: copy the shapes, copy their formatting, or use the LibO styles. Green Dark Green Bright You may add your code examples, XML statements, or debug output here ;-) Blue Dark Blue Bright Orange Dark Orange Bright Purple Dark Purple Bright Yellow Dark Yellow Bright
Section Header Example You may add additional text here ...
XTypeProvider
WIP: using the css. script WIP: using the css.script.theServiceDocumenter singleton for finding core implementations Getting to the C++ documentation of your implementation from your extension or script quickly ...
clang, the Ultimate: best solution: leak the information with a clang plugin triggering on getImplementationName(..) There might be some cases where the implementation name is dynamically generated That likely a bad idea anyway, so fix that then (or worst case: fallback on the scripted solution via component files)
The old manual ways: ad-hoc: Just search for the implementation name on http://opengrok.libreoffice.org lots of clutter from testcode etc. though somewhat more reliable: finding implementation in .component files, then find the implemenation in the cxx files of that library best solution: leak the information with a clang plugin triggering on getImplementationName(..)
Example Ad-hoc StarBasic TheServiceDocumenter = GetDefaultContext().getValueByName( "/singletons/com.sun.star.util.theServiceDocumenter") ' old style reflection helpers MsgBox(TheServiceDocumenter.Dbg_Methods) MsgBox(TheServiceDocumenter.Dbg_Properties) MsgBox(TheServiceDocumenter.Dbg_SupportedInterfaces) ' using the Service Documenter TheServiceDocumenter.CoreBaseUrl = "http://people.canonical.com/~bjoern/implref/5.1/" TheServiceDocumenter.showCoreDocs(ThisComponent) WIP: only works for SwXTextDocument for now Opens http://docs.libreoffice.org/sw/html/classSwXTextDocument.html
Finding implementation via .component files for f in `git ls-tree -r --name-only HEAD|grep '.component$'` do grep 'implementation name' $f|nl -s ",$f," done > componentgrep.csv In the second row, we then find the path of the component file In the third row, we then find the implemenation name thus we can find the ${module}/Library_${libname}.mk for each implementation and the cxx files where it could be implemented f
How should the Core Documentation Reference work in the end? It just opens “{$CoreBaseUrl}/{$ImplementationName}” in a browser and the URLs at ${CoreBaseUrl} are just statically generated redirects to http://docs.libreoffice.org (possibly we could also link to github or opengrok) later