FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const { if (this == pOther) return TRUE; if (!pOther) return FALSE; if (pOther->m_Type != m_Type) { if (IsReference() && GetDirect()) return GetDirect()->IsIdentical(pOther); if (pOther->IsReference()) return IsIdentical(pOther->GetDirect()); return FALSE; } switch (m_Type) { case PDFOBJ_BOOLEAN: return AsBoolean()->Identical(pOther->AsBoolean()); case PDFOBJ_NUMBER: return AsNumber()->Identical(pOther->AsNumber()); case PDFOBJ_STRING: return AsString()->Identical(pOther->AsString()); case PDFOBJ_NAME: return AsName()->Identical(pOther->AsName()); case PDFOBJ_ARRAY: return AsArray()->Identical(pOther->AsArray()); case PDFOBJ_DICTIONARY: return AsDictionary()->Identical(pOther->AsDictionary()); case PDFOBJ_NULL: return TRUE; case PDFOBJ_STREAM: return AsStream()->Identical(pOther->AsStream()); case PDFOBJ_REFERENCE: return AsReference()->Identical(pOther->AsReference()); } return FALSE; }
void CPDF_Object::SetString(const CFX_ByteString& str) { switch (m_Type) { case PDFOBJ_BOOLEAN: AsBoolean()->m_bValue = (str == "true"); return; case PDFOBJ_NUMBER: AsNumber()->SetString(str); return; case PDFOBJ_STRING: AsString()->m_String = str; return; case PDFOBJ_NAME: AsName()->m_Name = str; return; } ASSERT(FALSE); }
CFX_ByteString CPDF_Object::GetString() const { switch (m_Type) { case PDFOBJ_BOOLEAN: return AsBoolean()->m_bValue ? "true" : "false"; case PDFOBJ_NUMBER: return AsNumber()->GetString(); case PDFOBJ_STRING: return AsString()->m_String; case PDFOBJ_NAME: return AsName()->m_Name; case PDFOBJ_REFERENCE: { const CPDF_Reference* pRef = AsReference(); if (!pRef->m_pObjList) break; CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr); return pObj ? pObj->GetString() : CFX_ByteString(); } } return CFX_ByteString(); }
int CPDF_Object::GetInteger() const { CFX_AutoRestorer<int> restorer(&s_nCurRefDepth); if (++s_nCurRefDepth > kObjectRefMaxDepth) return 0; switch (m_Type) { case PDFOBJ_BOOLEAN: return AsBoolean()->m_bValue; case PDFOBJ_NUMBER: return AsNumber()->GetInteger(); case PDFOBJ_REFERENCE: { const CPDF_Reference* pRef = AsReference(); PARSE_CONTEXT context; FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT)); if (!pRef->m_pObjList) return 0; CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), &context); return pObj ? pObj->GetInteger() : 0; } } return 0; }
CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, std::set<FX_DWORD>* visited) const { switch (m_Type) { case PDFOBJ_BOOLEAN: return new CPDF_Boolean(AsBoolean()->m_bValue); case PDFOBJ_NUMBER: { const CPDF_Number* pThis = AsNumber(); return new CPDF_Number(pThis->m_bInteger ? pThis->m_Integer : pThis->m_Float); } case PDFOBJ_STRING: { const CPDF_String* pString = AsString(); return new CPDF_String(pString->m_String, pString->IsHex()); } case PDFOBJ_NAME: return new CPDF_Name(AsName()->m_Name); case PDFOBJ_ARRAY: { CPDF_Array* pCopy = new CPDF_Array(); const CPDF_Array* pThis = AsArray(); int n = pThis->GetCount(); for (int i = 0; i < n; i++) { CPDF_Object* value = pThis->m_Objects.GetAt(i); pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited)); } return pCopy; } case PDFOBJ_DICTIONARY: { CPDF_Dictionary* pCopy = new CPDF_Dictionary(); const CPDF_Dictionary* pThis = AsDictionary(); for (const auto& it : *pThis) { pCopy->m_Map.insert(std::make_pair( it.first, it.second->CloneInternal(bDirect, visited))); } return pCopy; } case PDFOBJ_NULL: { return new CPDF_Null; } case PDFOBJ_STREAM: { const CPDF_Stream* pThis = AsStream(); CPDF_StreamAcc acc; acc.LoadAllData(pThis, TRUE); FX_DWORD streamSize = acc.GetSize(); CPDF_Dictionary* pDict = pThis->GetDict(); if (pDict) { pDict = ToDictionary(pDict->CloneInternal(bDirect, visited)); } return new CPDF_Stream(acc.DetachData(), streamSize, pDict); } case PDFOBJ_REFERENCE: { const CPDF_Reference* pRef = AsReference(); FX_DWORD obj_num = pRef->GetRefObjNum(); if (bDirect && !pdfium::ContainsKey(*visited, obj_num)) { visited->insert(obj_num); auto* pDirect = pRef->GetDirect(); return pDirect ? pDirect->CloneInternal(TRUE, visited) : nullptr; } return new CPDF_Reference(pRef->m_pObjList, obj_num); } } return NULL; }
XPath_Value * XPath_Value::ConvertToBooleanL (XPath_Context *context) { return MakeBooleanL (context, AsBoolean ()); }