1#!/usr/bin/env python
2#coding:utf-8
3# Purpose: ODF META-INF/manifest.xml management
4# Created: 27.12.2010
5# Copyright (C) 2010, Manfred Moitzi
6# License: MIT license
7from __future__ import unicode_literals, print_function, division
8__author__ = "mozman <mozman@gmx.at>"
9
10from .xmlns import XMLMixin, etree, CN
11from .const import MANIFEST_NSMAP
12
13IGNORE_LIST = frozenset(['META-INF/manifest.xml'])
14
15class Manifest(XMLMixin):
16    def __init__(self, content=None):
17        if content is None:
18            self.xmlnode = etree.Element(CN('manifest:manifest'), nsmap=MANIFEST_NSMAP)
19        else:
20            self.xmlnode = etree.XML(content)
21
22    def add(self, full_path, media_type="", version=None):
23        def create_new_file_entry():
24            file_entry = etree.SubElement(self.xmlnode, CN('manifest:file-entry'))
25            file_entry.set(CN('manifest:full-path'), full_path)
26            return file_entry
27
28        def get_file_entry_or_create_new():
29            file_entry = self.find(full_path)
30            return create_new_file_entry() if file_entry is None else file_entry
31
32        def set_media_type_and_version(file_entry):
33            file_entry.set(CN('manifest:media-type'), media_type)
34            if version is not None:
35                file_entry.set(CN('manifest:version'), version)
36
37        if full_path in IGNORE_LIST:
38            return
39        file_entry = get_file_entry_or_create_new()
40        set_media_type_and_version(file_entry)
41
42    def remove(self, full_path):
43        file_entry = self.find(full_path)
44        if file_entry is not None:
45            self.xmlnode.remove(file_entry)
46
47    def find(self, full_path):
48        for node in self.xmlnode:
49            if node.get(CN('manifest:full-path')) == full_path:
50                return node
51        return None
52