Author: jghali
Date: Thu Apr 16 12:22:52 2020
New Revision: 23616

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23616
Log:
Fix potential crash when converting a page to masterpage in case some of the 
page items are using patterns

Modified:
    
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
    trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h
    
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp

Modified: 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23616&path=/trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
==============================================================================
--- 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp  
    (original)
+++ 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp  
    Thu Apr 16 12:22:52 2020
@@ -215,7 +215,6 @@
        QStack<int> groupStackMI2;
        QStack<int> groupStackPI2;
 
-
        itemRemap.clear();
        itemNext.clear();
        itemCount = 0;
@@ -229,6 +228,11 @@
        bool firstElement = true;
        bool success = true;
 
+       ReadObjectParams readObjectParams;
+       readObjectParams.baseDir = fileDir;
+       readObjectParams.itemKind = PageItem::StandardItem;
+       readObjectParams.loadingPage = true;
+
        ScXmlStreamReader reader(data);
        ScXmlStreamAttributes attrs;
        while (!reader.atEnd() && !reader.hasError())
@@ -323,7 +327,7 @@
                if ((tagName == "ITEM") || (tagName == "PAGEOBJECT") || 
(tagName == "FRAMEOBJECT"))
                {
                        ItemInfo itemInfo;
-                       success = readObject(m_Doc, reader, itemInfo, fileDir, 
true);
+                       success = readObject(m_Doc, reader, readObjectParams, 
itemInfo);
                        if (!success)
                                break;
                        itemInfo.item->m_layerID = LayerToPaste;
@@ -785,6 +789,11 @@
        bool success = true;
        int  progress = 0;
 
+       ReadObjectParams readObjectParams;
+       readObjectParams.baseDir = fileDir;
+       readObjectParams.itemKind = PageItem::StandardItem;
+       readObjectParams.loadingPage = false;
+
        ScXmlStreamReader reader(f);
        ScXmlStreamAttributes attrs;
        while (!reader.atEnd() && !reader.hasError())
@@ -849,7 +858,7 @@
                if (tagName == "PAGEOBJECT" || tagName == "MASTEROBJECT" || 
tagName == "FRAMEOBJECT")
                {
                        ItemInfo itemInfo;
-                       success = readObject(m_Doc, reader, itemInfo, fileDir, 
false);
+                       success = readObject(m_Doc, reader, readObjectParams, 
itemInfo);
                        if (!success) break;
 
                        if (isNewFormat)
@@ -1204,7 +1213,6 @@
                if (!converted)
                        gItem->groupItemList = gpL;
        }
-
 
        while (groupStackF.count() > 0)
        {
@@ -1364,6 +1372,11 @@
        m_Doc->PageColors.clear();
        m_Doc->Layers.clear();
 
+       ReadObjectParams readObjectParams;
+       readObjectParams.baseDir = fileDir;
+       readObjectParams.itemKind = PageItem::StandardItem;
+       readObjectParams.loadingPage = false;
+
        bool firstElement = true;
        bool success = true;
        bool hasPageSets = false;
@@ -1549,7 +1562,7 @@
                if (tagName == "PAGEOBJECT" || tagName == "MASTEROBJECT" || 
tagName == "FRAMEOBJECT")
                {
                        ItemInfo itemInfo;
-                       success = readObject(m_Doc, reader, itemInfo, fileDir, 
false);
+                       success = readObject(m_Doc, reader, readObjectParams, 
itemInfo);
                        if (!success)
                                break;
 
@@ -3607,7 +3620,7 @@
                {
                        ScXmlStreamAttributes attrs = reader.scAttributes();
 
-                       QString label = "";
+                       QString label;
                        if (attrs.hasAttribute("label"))
                                label = attrs.valueAsString("label");
 
@@ -3615,7 +3628,7 @@
                        if (attrs.hasAttribute("type"))
                                type = (MarkType) attrs.valueAsInt("type");
 
-                       if (label != "" && type != MARKNoType)
+                       if (!label.isEmpty() && type != MARKNoType)
                        {
                                Mark* mark = doc->newMark();
                                mark->label=attrs.valueAsString("label");
@@ -3743,6 +3756,8 @@
                qDebug() << "scribus150format: corrupted masterpage with empty 
name detected";
                return true;
        }
+
+       bool savedMasterPageMode = m_Doc->masterPageMode();
        m_Doc->setMasterPageMode(!pageName.isEmpty());
        ScPage* newPage = pageName.isEmpty() ? doc->addPage(pageNum) : 
doc->addMasterPage(pageNum, pageName);
 
@@ -3772,8 +3787,6 @@
                        newPage->setSize(pageSize);
        }
 
-
-
        newPage->setInitialHeight(newPage->height());
        newPage->setInitialWidth(newPage->width());
        newPage->initialMargins.setTop(qMax(0.0, 
attrs.valueAsDouble("BORDERTOP")));
@@ -3783,8 +3796,9 @@
        newPage->marginPreset = attrs.valueAsInt("PRESET", 0);
        newPage->Margins.setTop(newPage->initialMargins.top());
        newPage->Margins.setBottom(newPage->initialMargins.bottom());
-       m_Doc->setMasterPageMode(false);
-       //m_Doc->Pages=&m_Doc->DocPages;
+
+       m_Doc->setMasterPageMode(savedMasterPageMode);
+
        // guides reading
        
newPage->guides.setHorizontalAutoGap(attrs.valueAsDouble("AGhorizontalAutoGap", 
0.0));
        
newPage->guides.setVerticalAutoGap(attrs.valueAsDouble("AGverticalAutoGap", 
0.0));
@@ -3815,12 +3829,13 @@
        return true;
 }
 
-bool Scribus150Format::readObject(ScribusDoc* doc, ScXmlStreamReader& reader, 
ItemInfo& info, const QString& baseDir, bool loadPage, const QString& 
renamedPageName)
+bool Scribus150Format::readObject(ScribusDoc* doc, ScXmlStreamReader& reader, 
const ReadObjectParams& readObjectParams, ItemInfo& info)
 {
        QStringRef tagName = reader.name();
        ScXmlStreamAttributes attrs = reader.scAttributes();
 
-       if (!loadPage)
+       bool savedMasterPageMode = doc->masterPageMode();
+       if (!readObjectParams.loadingPage)
        {
                if (tagName == "PAGEOBJECT" || tagName == "FRAMEOBJECT" || 
tagName == "PatternItem" || tagName == "ITEM")
                        doc->setMasterPageMode(false);
@@ -3834,18 +3849,23 @@
        else if (tagName =="PatternItem")
                itemKind = PageItem::PatternItem;
 
-       int pagenr = -1;
+       // We are loading patterns, force itemKind to PatternItem
+       if (readObjectParams.itemKind == PageItem::PatternItem)
+               itemKind = PageItem::PatternItem;
+
+       int pageNr = -1;
        QString masterPageName = attrs.valueAsString("OnMasterPage");
        if ((!masterPageName.isEmpty()) && (tagName == "MASTEROBJECT"))
        {
-               if (!renamedPageName.isEmpty())
-                       masterPageName = renamedPageName;
+               if (!readObjectParams.renamedMasterPage.isEmpty())
+                       masterPageName = readObjectParams.renamedMasterPage;
                
doc->setCurrentPage(doc->MasterPages.at(doc->MasterNames[masterPageName]));
-               pagenr = -2;
+               pageNr = -2;
        }
        layerFound = false;
-       clipPath = "";
-       PageItem* newItem = pasteItem(doc, attrs, baseDir, itemKind, pagenr);
+       clipPath.clear();
+
+       PageItem* newItem = pasteItem(doc, attrs, readObjectParams.baseDir, 
itemKind, pageNr);
        newItem->setRedrawBounding();
        if (tagName == "MASTEROBJECT")
                newItem->setOwnerPage(doc->OnPage(newItem));
@@ -3880,7 +3900,7 @@
                newItem->setLayer(doc->firstLayerID());
        }
 
-       info.item     = newItem;
+       info.item   = newItem;
        isNewFormat = attrs.hasAttribute("ItemID");
        if (isNewFormat)
        {
@@ -4174,25 +4194,28 @@
                        if (newItem->asGroupFrame())
                        {
                        //      bool success = true;
-                               QList<PageItem*>* DItems = doc->Items;
-                               QList<PageItem*> GroupItems;
-                               doc->Items = &GroupItems;
+                               QList<PageItem*>* docItems = doc->Items;
+                               QList<PageItem*> groupItems;
+                               doc->Items = &groupItems;
                                ItemInfo itemInfo;
                                // #12313: set the 'loadPage' parameter to true 
in order to
                                // avoid the change of page mode and the doc 
item lists switch
                                // when loading groups in masterpages
-                       //      success =
-                               readObject(doc, reader, itemInfo, baseDir, 
true);
-                               for (int as = 0; as < GroupItems.count(); ++as)
-                               {
-                                       PageItem* currItem = GroupItems.at(as);
+                               ReadObjectParams readObjectParams2;
+                               readObjectParams2.baseDir = 
readObjectParams.baseDir;
+                               readObjectParams2.itemKind = (itemKind == 
PageItem::PatternItem) ? PageItem::PatternItem : PageItem::StandardItem;
+                               readObjectParams2.loadingPage = true;
+                               readObject(doc, reader, readObjectParams2, 
itemInfo);
+                               for (int as = 0; as < groupItems.count(); ++as)
+                               {
+                                       PageItem* currItem = groupItems.at(as);
                                        newItem->groupItemList.append(currItem);
                                        currItem->Parent = newItem;
                                        currItem->m_layerID = 
newItem->m_layerID;
                                        currItem->OwnPage = newItem->OwnPage;
                                        currItem->OnMasterPage = 
newItem->OnMasterPage;
                                }
-                               doc->Items = DItems;
+                               doc->Items = docItems;
                        }
                }
                if (tName == "MARK")
@@ -4333,8 +4356,8 @@
                        }
                }
        }
-       if (!loadPage)
-               doc->setMasterPageMode(false);
+       if (!readObjectParams.loadingPage)
+               doc->setMasterPageMode(savedMasterPageMode);
        return !reader.hasError();
 }
 
@@ -4367,6 +4390,11 @@
        pat.scaleY  = attrs.valueAsDouble("scaleY", 0.0);
        pat.xoffset = attrs.valueAsDouble("xoffset", 0.0);
        pat.yoffset = attrs.valueAsDouble("yoffset", 0.0);
+       
+       ReadObjectParams readObjectParams;
+       readObjectParams.baseDir = baseDir;
+       readObjectParams.itemKind = PageItem::PatternItem;
+       readObjectParams.loadingPage = false;
 
        bool savedAlignGrid = m_Doc->SnapGrid;
        bool savedAlignGuides = m_Doc->SnapGuides;
@@ -4391,13 +4419,12 @@
                ScXmlStreamAttributes tAtt = reader.attributes();
                        
                ItemInfo itemInfo;
-               
-               //int ownPage = tAtt.valueAsInt("OwnPage");
-               success = readObject(doc, reader, itemInfo, baseDir, false);
+
+               success = readObject(doc, reader, readObjectParams, itemInfo);
                if (!success) break;
 
                itemInfo.item->OwnPage = -1 /*ownPage*/;
-               itemInfo.item->OnMasterPage = "";
+               itemInfo.item->OnMasterPage.clear();
                if (isNewFormat)
                {
                        if (itemInfo.item->isTableItem)
@@ -4906,7 +4933,7 @@
        return !reader.hasError();
 }
 
-PageItem* Scribus150Format::pasteItem(ScribusDoc *doc, ScXmlStreamAttributes& 
attrs, const QString& baseDir, PageItem::ItemKind itemKind, int pagenr)
+PageItem* Scribus150Format::pasteItem(ScribusDoc *doc, ScXmlStreamAttributes& 
attrs, const QString& baseDir, PageItem::ItemKind itemKind, int pageNr)
 {
        int z = 0;
        struct ImageLoadRequest loadingInfo;
@@ -4944,8 +4971,8 @@
        case PageItem::ItemType1:
                z = doc->itemAdd(PageItem::Polygon, PageItem::Ellipse, x, y, w, 
h, pw, Pcolor, Pcolor2, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        //
        case PageItem::ImageFrame:
@@ -4953,8 +4980,8 @@
        case PageItem::LatexFrame: /*Everything that is valid for image frames 
is also valid for latex frames*/
                z = doc->itemAdd(pt, PageItem::Unspecified, x, y, w, h, 1, 
doc->itemToolPrefs().imageFillColor, doc->itemToolPrefs().imageStrokeColor, 
itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                UndoManager::instance()->setUndoEnabled(false);
                currItem->ScaleType   = attrs.valueAsInt("SCALETYPE", 1);
                currItem->AspectRatio = attrs.valueAsInt("RATIO", 0);
@@ -5033,53 +5060,53 @@
        case PageItem::ItemType3:
                z = doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, x, y, 
w, h, pw, Pcolor, Pcolor2, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        //
        case PageItem::PathText:
                z = doc->itemAdd(PageItem::PathText, PageItem::Unspecified, x, 
y, w, h, pw, CommonStrings::None, Pcolor, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::NoteFrame:
        case PageItem::TextFrame:
                z = doc->itemAdd(pt, PageItem::Unspecified, x, y, w, h, pw, 
CommonStrings::None, Pcolor, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::Line:
                z = doc->itemAdd(PageItem::Line, PageItem::Unspecified, x, y, 
w, h, pw, CommonStrings::None, Pcolor2, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::Polygon:
                z = doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, x, 
y, w, h, pw, Pcolor, Pcolor2, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::PolyLine:
                z = doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, x, 
y, w, h, pw, Pcolor, Pcolor2, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::Symbol:
                z = doc->itemAdd(PageItem::Symbol, PageItem::Unspecified, x, y, 
w, h, 0, CommonStrings::None, CommonStrings::None, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                currItem->setPattern( attrs.valueAsString("pattern", "") );
                break;
        case PageItem::Group:
                z = doc->itemAdd(PageItem::Group, PageItem::Unspecified, x, y, 
w, h, 0, CommonStrings::None, CommonStrings::None, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                currItem->groupWidth = attrs.valueAsDouble("groupWidth", w);
                currItem->groupHeight = attrs.valueAsDouble("groupHeight", h);
                doc->GroupCounter++;
@@ -5087,26 +5114,26 @@
        case PageItem::RegularPolygon:
                z = doc->itemAdd(PageItem::RegularPolygon, 
PageItem::Unspecified, x, y, w, h, pw, Pcolor, Pcolor2, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::Arc:
                z = doc->itemAdd(PageItem::Arc, PageItem::Unspecified, x, y, w, 
h, pw, Pcolor, Pcolor2, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::Spiral:
                z = doc->itemAdd(PageItem::Spiral, PageItem::Unspecified, x, y, 
w, h, pw, Pcolor, Pcolor2, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2) 
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2) 
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::Table:
                z = doc->itemAdd(PageItem::Table, PageItem::Unspecified, x, y, 
w, h, 0.0, CommonStrings::None, CommonStrings::None, itemKind);
                currItem = doc->Items->at(z);
-               if (pagenr > -2)
-                       currItem->setOwnerPage(pagenr);
+               if (pageNr > -2)
+                       currItem->setOwnerPage(pageNr);
                break;
        case PageItem::Multiple:
                Q_ASSERT(false);
@@ -6164,6 +6191,12 @@
        }
 
        QString fileDir = QFileInfo(fileName).absolutePath();
+       
+       ReadObjectParams readObjectParams;
+       readObjectParams.baseDir = fileDir;
+       readObjectParams.itemKind = PageItem::StandardItem;
+       readObjectParams.loadingPage = true;
+       readObjectParams.renamedMasterPage = Mpage ? renamedPageName : 
QString();
 
        bool firstElement = true;
        bool success = true;
@@ -6394,8 +6427,7 @@
                        else
                        {
                                ItemInfo itemInfo;
-                               QString masterPageName = Mpage ? 
renamedPageName : QString();
-                               success = readObject(m_Doc, reader, itemInfo, 
fileDir, true, masterPageName);
+                               success = readObject(m_Doc, reader, 
readObjectParams, itemInfo);
                                if (!success) break;
 
                                PageItem* newItem = itemInfo.item;

Modified: 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23616&path=/trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h
==============================================================================
--- 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h    
    (original)
+++ 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.h    
    Thu Apr 16 12:22:52 2020
@@ -88,6 +88,17 @@
                        int itemID;
                        bool isGroupFlag;
                        bool isWeldFlag;
+               };
+
+               class ReadObjectParams
+               {
+               public:
+                       ReadObjectParams() {}
+
+                       PageItem::ItemKind itemKind { PageItem::StandardItem };
+                       bool    loadingPage { false };
+                       QString baseDir;
+                       QString renamedMasterPage;
                };
 
                void registerFormats();
@@ -119,7 +130,7 @@
                bool readLatexInfo(PageItem_LatexFrame* item, 
ScXmlStreamReader& reader);
                void readLayers(ScLayer& layer, ScXmlStreamAttributes& attrs);
                bool readMultiline(multiLine& ml, ScXmlStreamReader& reader);
-               bool readObject(ScribusDoc* doc, ScXmlStreamReader& reader, 
ItemInfo& info, const QString& baseDir, bool loadPage, const QString& 
renamedPageName = QString());
+               bool readObject(ScribusDoc* doc, ScXmlStreamReader& reader, 
const ReadObjectParams& loadParams, ItemInfo& info);
                bool readPage(ScribusDoc* doc, ScXmlStreamReader& reader);
                bool readPageItemAttributes(PageItem* item, ScXmlStreamReader& 
reader);
                bool readPageSets(ScribusDoc* doc, ScXmlStreamReader& reader);
@@ -154,7 +165,7 @@
                
                void updateNames2Ptr(); //after document load items pointers 
should be updated in markeredItemList
 
-               PageItem* pasteItem(ScribusDoc *doc, ScXmlStreamAttributes& 
attrs, const QString& baseDir, PageItem::ItemKind itemKind, int pagenr = -2 /* 
currentPage*/);
+               PageItem* pasteItem(ScribusDoc *doc, ScXmlStreamAttributes& 
attrs, const QString& baseDir, PageItem::ItemKind itemKind, int pageNr = -2 /* 
currentPage*/);
 
                void writeCheckerProfiles(ScXmlStreamWriter& docu);
                void writeLineStyles(ScXmlStreamWriter& docu);

Modified: 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23616&path=/trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
==============================================================================
--- 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
 (original)
+++ 
trunk/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
 Thu Apr 16 12:22:52 2020
@@ -1792,16 +1792,13 @@
                switch (master)
                {
                        case ItemSelectionMaster:
-//                             item = doc->MasterItems.at(j);
                                docu.writeStartElement("MASTEROBJECT");
                                break;
                        case ItemSelectionGroup:
                        case ItemSelectionPage:
-//                             item = doc->DocItems.at(j);
                                docu.writeStartElement("PAGEOBJECT");
                                break;
                        case ItemSelectionFrame:
-//                             item = doc->FrameItems.at(j);
                                docu.writeStartElement("FRAMEOBJECT");
                                break;
                        case ItemSelectionPattern:


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to