POpcPackagePart COpcPackageReader::createPart(_In_ std::wstring sPath) { std::wstring sRealPath = fnRemoveLeadingPathDelimiter (sPath); auto iPartIterator = m_Parts.find(sRealPath); if (iPartIterator != m_Parts.end()) { return iPartIterator->second; } PImportStream pStream = openZIPEntry(sRealPath); if (pStream.get() == nullptr) throw CNMRException(NMR_ERROR_COULDNOTCREATEOPCPART); POpcPackagePart pPart = std::make_shared<COpcPackagePart>(sRealPath, pStream); m_Parts.insert(std::make_pair(sRealPath, pPart)); std::wstring sRelationShipName = fnExtractFileName(sRealPath); std::wstring sRelationShipPath = sRealPath.substr(0, sRealPath.length() - sRelationShipName.length()); sRelationShipPath += L"_rels/"; sRelationShipPath += sRelationShipName; sRelationShipPath += L".rels"; PImportStream pRelStream = openZIPEntry(sRelationShipPath); if (pRelStream.get() != nullptr) { POpcPackageRelationshipReader pReader = std::make_shared<COpcPackageRelationshipReader>(pRelStream); nfUint32 nCount = pReader->getCount(); nfUint32 nIndex; for (nIndex = 0; nIndex < nCount; nIndex++) { POpcPackageRelationship pRelationShip = pReader->getRelationShip(nIndex); pPart->addRelationship(pRelationShip->getID(), pRelationShip->getType(), pRelationShip->getTargetPartURI()); } } return pPart; }
_Ret_maybenull_ COpcPackageRelationship * COpcPackageReader::findRootRelation(_In_ std::wstring sRelationType, _In_ nfBool bMustBeUnique) { COpcPackageRelationship * pResultRelationship = nullptr; auto iIterator = m_RootRelationships.begin(); while (iIterator != m_RootRelationships.end()) { POpcPackageRelationship pRelationship = *iIterator; std::wstring sType = pRelationship->getType(); if (sType == sRelationType) { if (pResultRelationship == nullptr) { pResultRelationship = pRelationship.get(); } else { if (bMustBeUnique) throw CNMRException(NMR_ERROR_OPCRELATIONSHIPNOTUNIQUE); } } iIterator++; } return pResultRelationship; }