internal void Propagate(PdfObject obj, PdfIndirectReference refo, bool restricted)
{
if (obj == null)
return;
// if (refo != null)
// AddToBody(obj, refo);
if (obj is PdfIndirectReference)
return;
switch (obj.Type) {
case PdfObject.DICTIONARY:
case PdfObject.STREAM: {
PdfDictionary dic = (PdfDictionary)obj;
foreach (PdfName key in dic.Keys) {
if (restricted && (key.Equals(PdfName.PARENT) || key.Equals(PdfName.KIDS)))
continue;
PdfObject ob = dic.Get(key);
if (ob != null && ob.IsIndirect()) {
PRIndirectReference ind = (PRIndirectReference)ob;
if (!SetVisited(ind) && !IsPage(ind)) {
PdfIndirectReference refi = GetNewReference(ind);
Propagate(PdfReader.GetPdfObjectRelease(ind), refi, restricted);
}
}
else
Propagate(ob, null, restricted);
}
break;
}
case PdfObject.ARRAY: {
//PdfArray arr = new PdfArray();
for (ListIterator<PdfObject> it = ((PdfArray)obj).GetListIterator(); it.HasNext();) {
PdfObject ob = it.Next();
if (ob != null && ob.IsIndirect()) {
PRIndirectReference ind = (PRIndirectReference)ob;
if (!IsVisited(ind) && !IsPage(ind)) {
PdfIndirectReference refi = GetNewReference(ind);
Propagate(PdfReader.GetPdfObjectRelease(ind), refi, restricted);
}
}
else
Propagate(ob, null, restricted);
}
break;
}
case PdfObject.INDIRECT: {
throw new Exception(MessageLocalization.GetComposedMessage("reference.pointing.to.reference"));
}
}
}