tdf#155512: oox: ppt: fix import master slides

Import all master slides according to
the relationship with slide layouts.

Adjust unit test values:

SdOOXMLExportTest2::testTdf106867
I do not know why those values change since
importing embedded video source code was not touched

SdOOXMLExportTest2::testAccentColor
The accent6 is a constant value.

Signed-off-by: Henry Castro <hcastro@collabora.com>
Change-Id: Ic7c70d2c4ce30a7f2d2d1cf22604f1119a66f5f7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157387
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
(cherry picked from commit 08ed103d734ebf65202dc097c7bb0990573f8fd1)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157532
Tested-by: Jenkins
diff --git a/include/oox/ppt/presentationfragmenthandler.hxx b/include/oox/ppt/presentationfragmenthandler.hxx
index 4685ea2..29204b2 100644
--- a/include/oox/ppt/presentationfragmenthandler.hxx
+++ b/include/oox/ppt/presentationfragmenthandler.hxx
@@ -54,8 +54,8 @@ private:
    void importSlide(sal_uInt32 nSlide, bool bFirstSlide, bool bImportNotes);
    oox::ppt::SlidePersistPtr importMasterSlide(const ::com::sun::star::uno::Reference<::com::sun::star::frame::XModel>& xModel,
                                                ::oox::ppt::PowerPointImport& rFilter,
                                                const OUString& rLayoutFragmentPath,
                                                const OUString& rMasterFragmentPath);
                                                std::u16string_view rLayoutFragmentPath,
                                                std::u16string_view rMasterFragmentPath);
    void saveThemeToGrabBag(const oox::drawingml::ThemePtr& pThemePtr, sal_Int32 nThemeIdx);
    void importCustomSlideShow(std::vector<CustomShow>& rCustomShowList);
    static void importSlideNames(::oox::core::XmlFilterBase& rFilter, const std::vector<SlidePersistPtr>& rSlidePersist);
diff --git a/oox/source/ppt/presentationfragmenthandler.cxx b/oox/source/ppt/presentationfragmenthandler.cxx
index 538d79d..5dd0095 100644
--- a/oox/source/ppt/presentationfragmenthandler.cxx
+++ b/oox/source/ppt/presentationfragmenthandler.cxx
@@ -217,75 +217,88 @@ void PresentationFragmentHandler::importCustomSlideShow(std::vector<CustomShow>&

SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<frame::XModel>& xModel,
                                                               PowerPointImport& rFilter,
                                                               const OUString& rLayoutFragmentPath,
                                                               const OUString& rMasterFragmentPath)
                                                               std::u16string_view rLayoutFragmentPath,
                                                               std::u16string_view rMasterFragmentPath)
{
    SlidePersistPtr pMasterPersistPtr;
    OUString aLayoutFragmentPath;
    OUString aMasterFragmentPath(rMasterFragmentPath);
    SlidePersistPtr pMasterPersistPtr, pMasterPtr;
    Reference< drawing::XDrawPage > xMasterPage;
    Reference< drawing::XMasterPagesSupplier > xMPS( xModel, uno::UNO_QUERY_THROW );
    Reference< drawing::XDrawPages > xMasterPages( xMPS->getMasterPages(), uno::UNO_SET_THROW );
    RelationsRef xMasterRelations = rFilter.importRelations( aMasterFragmentPath );

    sal_Int32 nIndex;
    if( rFilter.getMasterPages().empty() )
    for (const auto& rEntry : *xMasterRelations)
    {
        nIndex = 0;
        xMasterPages->getByIndex( nIndex ) >>= xMasterPage;
    }
    else
    {
        nIndex = xMasterPages->getCount();
        xMasterPage = xMasterPages->insertNewByIndex( nIndex );
    }
        aLayoutFragmentPath = xMasterRelations->getFragmentPathFromRelation(rEntry.second);

    pMasterPersistPtr = std::make_shared<SlidePersist>( rFilter, true, false, xMasterPage,
                                                        std::make_shared<PPTShape>( Master, "com.sun.star.drawing.GroupShape" ), mpTextListStyle );
    pMasterPersistPtr->setLayoutPath( rLayoutFragmentPath );
    rFilter.getMasterPages().push_back( pMasterPersistPtr );
    rFilter.setActualSlidePersist( pMasterPersistPtr );
    FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( rFilter, rMasterFragmentPath, pMasterPersistPtr, Master ) );

    // set the correct theme
    OUString aThemeFragmentPath = xMasterFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc( u"theme" );
    if( !aThemeFragmentPath.isEmpty() )
    {
        std::map< OUString, oox::drawingml::ThemePtr >& rThemes( rFilter.getThemes() );
        std::map< OUString, oox::drawingml::ThemePtr >::iterator aIter2( rThemes.find( aThemeFragmentPath ) );
        if( aIter2 == rThemes.end() )
        sal_Int32 nIndex;
        if( rFilter.getMasterPages().empty() )
        {
            oox::drawingml::ThemePtr pThemePtr = std::make_shared<oox::drawingml::Theme>();
            pMasterPersistPtr->setTheme( pThemePtr );
            Reference<xml::dom::XDocument> xDoc=
                rFilter.importFragment(aThemeFragmentPath);

            auto pTheme = std::make_shared<model::Theme>();
            pThemePtr->setTheme(pTheme);

            rFilter.importFragment(
                new ThemeFragmentHandler(rFilter, aThemeFragmentPath, *pThemePtr, *pTheme),
                Reference<xml::sax::XFastSAXSerializable>(
                    xDoc,
                    UNO_QUERY_THROW));
            rThemes[ aThemeFragmentPath ] = pThemePtr;
            pThemePtr->setFragment(xDoc);
            saveThemeToGrabBag(pThemePtr, nIndex + 1);
            nIndex = 0;
            xMasterPages->getByIndex( nIndex ) >>= xMasterPage;
        }
        else
        {
            pMasterPersistPtr->setTheme( (*aIter2).second );
            nIndex = xMasterPages->getCount();
            xMasterPage = xMasterPages->insertNewByIndex( nIndex );
        }

        pMasterPersistPtr = std::make_shared<SlidePersist>( rFilter, true, false, xMasterPage,
                                                            std::make_shared<PPTShape>( Master, "com.sun.star.drawing.GroupShape" ), mpTextListStyle );
        pMasterPersistPtr->setLayoutPath( aLayoutFragmentPath );
        rFilter.getMasterPages().push_back( pMasterPersistPtr );
        rFilter.setActualSlidePersist( pMasterPersistPtr );
        FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( rFilter, aMasterFragmentPath, pMasterPersistPtr, Master ) );

        // set the correct theme
        OUString aThemeFragmentPath = xMasterFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc( u"theme" );
        if( !aThemeFragmentPath.isEmpty() )
        {
            std::map< OUString, oox::drawingml::ThemePtr >& rThemes( rFilter.getThemes() );
            std::map< OUString, oox::drawingml::ThemePtr >::iterator aIter2( rThemes.find( aThemeFragmentPath ) );
            if( aIter2 == rThemes.end() )
            {
                oox::drawingml::ThemePtr pThemePtr = std::make_shared<oox::drawingml::Theme>();
                pMasterPersistPtr->setTheme( pThemePtr );
                Reference<xml::dom::XDocument> xDoc=
                    rFilter.importFragment(aThemeFragmentPath);

                auto pTheme = std::make_shared<model::Theme>();
                pThemePtr->setTheme(pTheme);

                rFilter.importFragment(
                    new ThemeFragmentHandler(rFilter, aThemeFragmentPath, *pThemePtr, *pTheme),
                    Reference<xml::sax::XFastSAXSerializable>(
                        xDoc,
                        UNO_QUERY_THROW));
                rThemes[ aThemeFragmentPath ] = pThemePtr;
                pThemePtr->setFragment(xDoc);
                saveThemeToGrabBag(pThemePtr, nIndex + 1);
            }
            else
            {
                pMasterPersistPtr->setTheme( (*aIter2).second );
            }
        }
        importSlide( xMasterFragmentHandler, pMasterPersistPtr );
        rFilter.importFragment( new LayoutFragmentHandler( rFilter, aLayoutFragmentPath, pMasterPersistPtr ) );
        pMasterPersistPtr->createBackground( rFilter );
        pMasterPersistPtr->createXShapes( rFilter );

        oox::drawingml::ThemePtr pTheme = pMasterPersistPtr->getTheme();
        if (pTheme)
        {
            pTheme->addTheme(pMasterPersistPtr->getPage());
        }

        if (pMasterPersistPtr->getLayoutPath() == rLayoutFragmentPath)
        {
            pMasterPtr = pMasterPersistPtr;
        }
    }
    importSlide( xMasterFragmentHandler, pMasterPersistPtr );
    rFilter.importFragment( new LayoutFragmentHandler( rFilter, rLayoutFragmentPath, pMasterPersistPtr ) );
    pMasterPersistPtr->createBackground( rFilter );
    pMasterPersistPtr->createXShapes( rFilter );

    oox::drawingml::ThemePtr pTheme = pMasterPersistPtr->getTheme();
    if (pTheme)
    {
        pTheme->addTheme(pMasterPersistPtr->getPage());
    }

    return pMasterPersistPtr;
    return pMasterPtr;
}

void PresentationFragmentHandler::saveThemeToGrabBag(const oox::drawingml::ThemePtr& pThemePtr,
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
index 0abd41b..43e27b6 100644
--- a/sd/qa/unit/export-tests-ooxml2.cxx
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -1312,7 +1312,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf106867)
                "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/"
                "p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:cmd/"
                "p:cBhvr/p:tgtEl/p:spTgt",
                "spid", "42");
                "spid", "491");
}

CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112280)
@@ -1693,7 +1693,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testAccentColor)
                "70ad47");
    xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme2.xml");
    assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr", "val",
                "deb340");
                "70ad47");

    // Without the accompanying fix in place, this test would have failed with:
    // - Expected: Motyw pakietu Office