blob: 45eb9039b4fe5c9a532c70ac9e09f18a2b7d768a [file] [log] [blame]
// 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.
#ifndef DocFormats_ODFManifest_h
#define DocFormats_ODFManifest_h
#include "DFDOM.h"
#include "DFHashTable.h"
#include "DFTypes.h"
/**
\file
# ODFManifest
All ODF documents are required to contain a file called `META-INF/manifest.xml`. This file acts as
as an index of all of the individual files within the zipped package, containing information such
as their mime type. Every file in the zipped package must have an entry in the manifest, with
the exception of the `META-INF/manifest.xml` file itself, and the `mimetype` file in the root of
the package; both these files are explicitly forbidden to appear in the manifest.
It is unclear exactly why the manifest is necessary when the only information it contains is the
mimetype of the files (which could be easily deduced from their file extensions, if it is needed
at all). Nonetheless, it is required by the spec, and OpenOffice refuses to open documents that
do not contain a manifest. Cynics might suggest that it serves the purpose of making the file
format more complicated.
The manifest file has a root element called `manifest`, with child elements named `file-entry`.
There is one `file-entry` element for each file in the package, including the root directory, which
defines the mimetype of the docment as a whole. An example manifest file is given below:
<mf:manifest xmlns:mf="urn:oasis:names:tc:opendocument:xmlns:mf:1.0" mf:version="1.2">
<mf:file-entry mf:media-type="text/xml" mf:full-path="content.xml"/>
<mf:file-entry mf:media-type="text/xml" mf:full-path="styles.xml"/>
<mf:file-entry mf:media-type="text/xml" mf:full-path="settings.xml"/>
<mf:file-entry mf:media-type="text/xml" mf:full-path="meta.xml"/>
</mf:manifest>
The ODFManifest class provides a C representation of the manifest, and primarily exists to ensure
that all of the required entries are present when saving a file, thus ensuring the file is valid
and can be successfully opened by OpenOffice. DocFormats itself does not use the manifest when
reading the package, because it's entirely redundant - all the information it contains can be
deduced from the directory hierarchy in the zip file.
There are two ways to create a new manifest object, depending on whether you are creating a new
ODF document, or opening an existing one. ODFManifestNew() will create a manifest with an empty
document (save for the `manifest` root element). ODFManifestNewWithDoc() will create an object
based on an existing document you have read from a file.
The entriesByPath hash table maps from path names (strings) to `file-entry` elements. It is
populated when you call ODFManifestNewWithDoc(). This hash table enables quick lookup of entries
based on their path.
*/
typedef struct ODFManifest ODFManifest;
struct ODFManifest {
size_t retainCount;
DFDocument *doc;
DFHashTable *entriesByPath;
};
ODFManifest *ODFManifestNew(void);
ODFManifest *ODFManifestNewWithDoc(DFDocument *doc);
ODFManifest *ODFManifestRetain(ODFManifest *manifest);
void ODFManifestRelease(ODFManifest *manifest);
void ODFManifestAddEntry(ODFManifest *manifest, const char *path, const char *mediaType,
const char *version);
#endif