| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| #pragma once |
| |
| #include <DocFormats/DFXMLForward.h> |
| #include <DocFormats/DFError.h> |
| #include "DFBuffer.h" |
| #include <DocFormats/DFStorage.h> |
| #include "OOXMLTypedefs.h" |
| |
| // Essentials of the Open Packaging Conventions |
| // http://msdn.microsoft.com/en-us/library/ee361919(office.11).aspx |
| |
| /* |
| |
| When opening the file, OPCPackage traverses the part/relationship graph and creates OPCPart |
| and OPCRelationship objects for every part and relationship. This is safe because these comprise |
| only a small amount of information, and we can reduce the cases where errors need to be handled |
| to package open/close and part read/write. Once a package is open, you can therefore access all |
| the parts and relationships without having to check for errors. |
| |
| */ |
| |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| // // |
| // OPCRelationship // |
| // // |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| struct OPCRelationship { |
| size_t retainCount; |
| char *rId; |
| char *type; |
| char *target; |
| int external; |
| int needsRemoveCheck; |
| }; |
| |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| // // |
| // OPCRelationshipSet // |
| // // |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| OPCRelationshipSet *OPCRelationshipSetNew(void); |
| void OPCRelationshipSetFree(OPCRelationshipSet *set); |
| |
| const char **OPCRelationshipSetAllIds(OPCRelationshipSet *set); |
| OPCRelationship *OPCRelationshipSetLookupById(OPCRelationshipSet *set, const char *rId); |
| OPCRelationship *OPCRelationshipSetLookupByType(OPCRelationshipSet *set, const char *type); |
| OPCRelationship *OPCRelationshipSetAddId(OPCRelationshipSet *set, |
| const char *rId, const char *type, |
| const char *target, int external); |
| OPCRelationship *OPCRelationshipSetAddType(OPCRelationshipSet *set, |
| const char *type, const char *target, int external); |
| void OPCRelationshipSetRemove(OPCRelationshipSet *set, OPCRelationship *rel); |
| DFDocument *OPCRelationshipSetToDocument(OPCRelationshipSet *set); |
| |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| // // |
| // OPCPart // |
| // // |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| struct OPCPart { |
| size_t retainCount; |
| char *URI; |
| char *contentType; |
| OPCRelationshipSet *relationships; |
| }; |
| |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| // // |
| // OPCContentTypes // |
| // // |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| void OPCContentTypesSetDefault(OPCContentTypes *ct, const char *extension, const char *type); |
| void OPCContentTypesSetOverride(OPCContentTypes *ct, const char *partName, const char *type); |
| void OPCContentTypesRemoveOverride(OPCContentTypes *ct, const char *partName); |
| |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| // // |
| // OPCPackage // |
| // // |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| struct OPCPackage { |
| DFStorage *storage; |
| int isOpen; |
| OPCContentTypes *contentTypes; |
| OPCRelationshipSet *relationships; |
| DFBuffer *errors; |
| struct DFHashTable *partsByName; |
| }; |
| |
| OPCPackage *OPCPackageOpenNew(DFStorage *storage, DFError **error); |
| OPCPackage *OPCPackageOpenFrom(DFStorage *storage, DFError **error); |
| void OPCPackageFree(OPCPackage *pkg); |
| int OPCPackageSaveToDir(OPCPackage *pkg); |
| int OPCPackageSave(OPCPackage *pkg, DFError **error); |
| |
| OPCPart *OPCPackagePartWithURI(OPCPackage *pkg, const char *URI); |
| OPCPart *OPCPackageAddRelatedPart(OPCPackage *pkg, const char *URI, const char *contentType, |
| const char *relType, OPCPart *source); |
| void OPCPackageRemoveRelatedPart(OPCPackage *pkg, const char *URI, const char *relType, OPCPart *source); |
| DFBuffer *OPCPackageReadPart(OPCPackage *pkg, OPCPart *part, DFError **error); |
| int OPCPackageWritePart(OPCPackage *pkg, const char *data, size_t len, OPCPart *part, DFError **error); |
| int OPCPackageDeletePart(OPCPackage *pkg, OPCPart *part, DFError **error); |
| void OPCPackageReadRelationships(OPCPackage *pkg, OPCRelationshipSet *rels, const char *partURI, DFDocument *relDoc); |