# Open Document Format for Office Applications (OpenDocument) Version 1.2
# Committee Specification (CS) 01, 17 March 2011
# Manifest Relax-NG Schema
# 
# Copyright (c) OASIS Open 2002-2011. All Rights Reserved.
# 
# All capitalized terms in the following text have the meanings assigned to them
# in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
# full Policy may be found at the OASIS website.
# 
# This document and translations of it may be copied and furnished to others, and
# derivative works that comment on or otherwise explain it or assist in its
# implementation may be prepared, copied, published, and distributed, in whole or
# in part, without restriction of any kind, provided that the above copyright
# notice and this section are included on all such copies and derivative works.
# However, this document itself may not be modified in any way, including by
# removing the copyright notice or references to OASIS, except as needed for the
# purpose of developing any document or deliverable produced by an OASIS
# Technical Committee (in which case the rules applicable to copyrights, as set
# forth in the OASIS IPR Policy, must be followed) or as required to translate it
# into languages other than English.
# 
# The limited permissions granted above are perpetual and will not be revoked by
# OASIS or its successors or assigns.
# 
# This document and the information contained herein is provided on an "AS IS"
# basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
# INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
# FITNESS FOR A PARTICULAR PURPOSE. 

namespace manifest =
  "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"

start = manifest
manifest = element manifest:manifest { manifest-attlist, file-entry+ }
manifest-attlist = attribute manifest:version { "1.2" }
file-entry =
  element manifest:file-entry { file-entry-attlist, encryption-data? }
file-entry-attlist =
  attribute manifest:full-path { \string }
  & attribute manifest:size { nonNegativeInteger }?
  & attribute manifest:media-type { \string }
  & attribute manifest:preferred-view-mode {
      "edit" | "presentation-slide-show" | "read-only" | namespacedToken
    }?
  & attribute manifest:version { \string }?
encryption-data =
  element manifest:encryption-data {
    encryption-data-attlist,
    algorithm,
    start-key-generation?,
    key-derivation
  }
encryption-data-attlist =
  attribute manifest:checksum-type { "SHA1/1K" | anyURI }
  & attribute manifest:checksum { base64Binary }
algorithm =
  element manifest:algorithm { algorithm-attlist, anyElements }
algorithm-attlist =
  attribute manifest:algorithm-name { "Blowfish CFB" | anyURI }
  & attribute manifest:initialisation-vector { base64Binary }
anyAttListOrElements =
  attribute * { text }*,
  anyElements
anyElements =
  element * {
    mixed { anyAttListOrElements }
  }*
key-derivation =
  element manifest:key-derivation { key-derivation-attlist, empty }
key-derivation-attlist =
  attribute manifest:key-derivation-name { "PBKDF2" | anyURI }
  & attribute manifest:salt { base64Binary }
  & attribute manifest:iteration-count { nonNegativeInteger }
  & attribute manifest:key-size { nonNegativeInteger }?
start-key-generation =
  element manifest:start-key-generation {
    start-key-generation-attlist, empty
  }
start-key-generation-attlist =
  attribute manifest:start-key-generation-name { "SHA1" | anyURI }
  & attribute manifest:key-size { nonNegativeInteger }?
base64Binary = xsd:base64Binary
namespacedToken = xsd:QName { pattern = "[^:]+:[^:]+" }
nonNegativeInteger = xsd:nonNegativeInteger
\string = xsd:string
anyURI = xsd:anyURI
