<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE xs:schema PUBLIC
        "-//W3C//DTD XMLSCHEMA 200102//EN"
        "http://www.w3.org/2001/XMLSchema.dtd">  -->
<!--*MT*
    
    MediaTomb - http://www.mediatomb.cc/
    
    config.xsd - this file is part of MediaTomb.
    
    Copyright (C) 2005 Gena Batyan <bgeradz@mediatomb.cc>,
                       Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc>
    
    Copyright (C) 2006-2008 Gena Batyan <bgeradz@mediatomb.cc>,
                            Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc>,
                            Leonhard Wimmer <leo@mediatomb.cc>
    
    MediaTomb is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License version 2
    as published by the Free Software Foundation.
    
    MediaTomb is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    version 2 along with MediaTomb; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
    
    $Id: config.xsd 1719 2008-03-01 19:35:30Z lww $
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://mediatomb.cc/config/1" xmlns="http://mediatomb.cc/config/1">

    <xs:simpleType name="boolean">
        <xs:restriction base="xs:string">
            <xs:enumeration value="yes"/>
            <xs:enumeration value="no"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="config">
        <xs:complexType>
            <xs:all>
                <xs:element ref="server"/>
                <xs:element ref="import" minOccurs="0"/>
                <xs:element ref="transcoding" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="version" type="xs:positiveInteger" fixed="1"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="server">
        <xs:complexType>
            <xs:all>
                <xs:element ref="ui" minOccurs="0"/>
                <xs:element ref="port" minOccurs="0"/>
                <xs:element ref="name" minOccurs="0"/>
                
                <!-- required, but autogenerated by MediaTomb at startup -->
                <xs:element ref="udn" minOccurs="0"/>

                <xs:element ref="home"/>
                <xs:element ref="webroot"/>
                <xs:element ref="storage"/>
                <xs:element ref="servedir" minOccurs="0"/>
                <xs:element ref="ip" minOccurs="0"/>
                <xs:element ref="interface" minOccurs="0"/>
                <xs:element ref="modelName" minOccurs="0"/>
                <xs:element ref="modelNumber" minOccurs="0"/>
                <xs:element ref="bookmark" minOccurs="0"/>
                <xs:element ref="model" minOccurs="0"/>
                <xs:element ref="manufacturerURL" minOccurs="0"/>
                <xs:element ref="presentationURL" minOccurs="0"/>
                <xs:element ref="upnp-string-limit" minOccurs="0"/>
                <xs:element ref="alive" minOccurs="0"/>
                <xs:element ref="custom-http-headers" minOccurs="0"/>
                <xs:element ref="modelDescription" minOccurs="0"/>
                <xs:element ref="serialNumber" minOccurs="0"/>
                <xs:element ref="protocolInfo" minOccurs="0"/>
                <xs:element ref="pc-directory" minOccurs="0"/>
                <xs:element ref="tmpdir" minOccurs="0"/>
                <xs:element ref="retries-on-timeout" minOccurs="0"/>
            </xs:all>
        </xs:complexType>
    </xs:element>

    <xs:element name="port" type="xs:nonNegativeInteger"/>

    <xs:element name="ip" type="xs:string"/>

    <xs:element name="interface" type="xs:string"/>

    <xs:element name="name" type="xs:string" default="MediaTomb"/>

    <xs:element name="modelName" type="xs:string" default="MediaTomb"/>

    <xs:element name="modelNumber" type="xs:string"/>

    <xs:element name="modelDescription" type="xs:string"/>

    <xs:element name="manufacturerURL" type="xs:string" default="http://mediatomb.cc/"/>

    <xs:element name="presentationURL" default="/">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="append-to" default="none">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="none"/>
                                <xs:enumeration value="ip"/>
                                <xs:enumeration value="port"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="udn" type="xs:string"/>

    <xs:element name="home" type="xs:string" default="~/.mediatomb"/>

    <xs:element name="webroot" type="xs:string"/>

    <xs:element name="servedir" type="xs:string" default=""/>

    <xs:element name="alive" type="xs:positiveInteger" default="180"/>

    <xs:element name="custom-http-headers">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="add" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="serialNumber" type="xs:string"/>

    <xs:element name="protocolInfo">
        <xs:complexType>
            <xs:attribute name="extend" type="boolean" default="no"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="add">
        <xs:complexType>
            <xs:attribute name="header" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="upnp-string-limit" type="xs:integer"/>

    <xs:element name="bookmark" type="xs:string"/>

    <xs:element name="model" type="xs:string"/>

    <xs:element name="pc-directory">
        <xs:complexType>
            <xs:attribute name="upnp-hide" type="boolean" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="tmpdir" type="xs:string"/>

    <xs:element name="retries-on-timeout" type="xs:integer"/>

    <xs:element name="ui">
        <xs:complexType>
            <xs:all>
                <xs:element ref="accounts" minOccurs="0"/>
                <xs:element ref="items-per-page" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="poll-interval" type="xs:positiveInteger" default="2"/>
            <xs:attribute name="enabled" type="boolean" default="yes"/>
            <xs:attribute name="poll-when-idle" type="boolean" default="no"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="accounts">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="account" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="enabled" type="boolean" default="yes"/>
            <xs:attribute name="session-timeout" type="xs:positiveInteger" default="30"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="account">
        <xs:complexType>
            <xs:attribute name="user" type="xs:string" use="required"/>
            <xs:attribute name="password" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="items-per-page">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="option" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="default" type="xs:positiveInteger" default="25"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="option" type="xs:positiveInteger"/>
    
    <!--  Storage -->

    <xs:element name="storage">
        <xs:complexType>
            <xs:all>
                <xs:element ref="sqlite3" minOccurs="0"/>
                <xs:element ref="mysql" minOccurs="0"/>
            </xs:all>
        </xs:complexType>
    </xs:element>


    <xs:element name="sqlite3">
        <xs:complexType>
            <xs:all>
                <xs:element ref="database-file" minOccurs="0"/>
                <xs:element ref="synchronous" minOccurs="0"/>
                <xs:element ref="on-error" minOccurs="0"/>
                <xs:element ref="backup" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="enabled" type="boolean" default="yes"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="database-file" type="xs:string" default="mediatomb.db"/>

    <xs:element name="synchronous" default="off">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="off"/>
                <xs:enumeration value="normal"/>
                <xs:enumeration value="full"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

    <xs:element name="on-error" default="restore">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="restore"/>
                <xs:enumeration value="fail"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="backup">
        <xs:complexType>
            <xs:attribute name="enabled" type="boolean" default="no"/>
            <xs:attribute name="interval" type="xs:positiveInteger" default="600"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="mysql">
        <xs:complexType>
            <xs:all>
                <xs:element ref="host" minOccurs="0"/>
                <xs:element ref="port" minOccurs="0"/>
                <xs:element ref="username" minOccurs="0"/>
                <xs:element ref="password" minOccurs="0"/>
                <xs:element ref="database" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="enabled" type="boolean" default="yes"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="host" type="xs:string" default="localhost"/>
    <xs:element name="username" type="xs:string" default="mediatomb"/>
    <xs:element name="password" type="xs:string"/>
    <xs:element name="database" type="xs:string" default="localhost"/>
    
    <!-- Import -->

    <xs:element name="import">
        <xs:complexType>
            <xs:all>
                <xs:element ref="scripting" minOccurs="0"/>
                <xs:element ref="mappings" minOccurs="0"/>
                <xs:element ref="filesystem-charset" minOccurs="0"/>
                <xs:element ref="metadata-charset" minOccurs="0"/>
                <xs:element ref="playlist-charset" minOccurs="0"/>
                <xs:element ref="autoscan" minOccurs="0"/>
                <xs:element ref="library-options" minOccurs="0"/>
                <xs:element ref="magic-file" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="hidden-files" type="boolean" default="no"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="scripting">
        <xs:complexType>
            <xs:all>
                <xs:element ref="common-script" minOccurs="0"/>
                <xs:element ref="playlist-script" minOccurs="0"/>
                <xs:element ref="virtual-layout" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="script-charset" type="xs:string" default="UTF-8"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="common-script" type="xs:string"/>

    <xs:element name="playlist-script">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="create-link" type="boolean" default="yes"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="virtual-layout">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="import-script" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute name="type" default="builtin">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="builtin"/>
                        <xs:enumeration value="js"/>
                        <xs:enumeration value="disabled"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="import-script" type="xs:string"/>

    <xs:element name="filesystem-charset" type="xs:string"/>

    <xs:element name="metadata-charset" type="xs:string"/>

    <xs:element name="playlist-charset" type="xs:string"/>

    <xs:element name="magic-file" type="xs:string"/>

    <xs:element name="autoscan">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="directory" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="directory">
        <xs:complexType>
            <xs:attribute name="location" type="xs:string" use="required"/>
            
            <!-- required only for "timed" mode -->
            <xs:attribute name="interval" type="xs:string"/>

            <xs:attribute name="hidden-files" type="boolean"/>
            <xs:attribute name="recursive" type="boolean" use="required"/>
            <xs:attribute name="mode" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="timed"/>
                        <xs:enumeration value="inotify"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="level" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="full"/>
                        <xs:enumeration value="basic"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="mappings">
        <xs:complexType>
            <xs:all>
                <xs:element ref="extension-mimetype" minOccurs="0"/>
                <xs:element ref="mimetype-contenttype" minOccurs="0"/>
                <xs:element ref="mimetype-upnpclass" minOccurs="0"/>
            </xs:all>
        </xs:complexType>
    </xs:element>

    <xs:element name="extension-mimetype">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="map" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="ignore-unknown" type="boolean" default="no"/>
            <xs:attribute name="case-sensitive" type="boolean" default="no"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="mimetype-contenttype">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="treat" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="ignore-unknown" type="boolean" default="no"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="treat">
        <xs:complexType>
            <xs:attribute name="mimetype" type="xs:string" use="required"/>
            <xs:attribute name="as" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="mimetype-upnpclass">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="map" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="map">
        <xs:complexType>
            <xs:attribute name="from" type="xs:string" use="required"/>
            <xs:attribute name="to" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="library-options">
        <xs:complexType>
            <xs:all>
                <xs:element ref="libexif" minOccurs="0"/>
                <xs:element ref="libextractor" minOccurs="0"/>
                <xs:element ref="id3" minOccurs="0"/>
            </xs:all>
        </xs:complexType>
    </xs:element>

    <xs:element name="libexif">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="auxdata" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="libextractor">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="auxdata" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="id3">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="auxdata" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="auxdata">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="add-data" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="add-data">
        <xs:complexType>
            <xs:attribute name="tag" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <!-- Transcoding -->

    <xs:element name="transcoding">
        <xs:complexType>
            <xs:all>
                <xs:element ref="mimetype-profile-mappings" minOccurs="0"/>
                <xs:element ref="profiles" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="enabled" type="boolean" default="yes"/>
            <xs:attribute name="fetch-buffer-size" type="xs:positiveInteger" default="262144"/>
            <xs:attribute name="fetch-buffer-fill-size" type="xs:nonNegativeInteger" default="0"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="mimetype-profile-mappings">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="transcode" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="transcode">
        <xs:complexType>
            <xs:attribute name="mimetype" type="xs:string" use="required"/>
            <xs:attribute name="using" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="profiles">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="profile" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="profile">
        <xs:complexType>
            <xs:all>
                <xs:element ref="mimetype"/>
                <xs:element ref="accept-url" minOccurs="0"/>
                <xs:element ref="first-resource" minOccurs="0"/>
                <xs:element ref="hide-original-resource" minOccurs="0"/>
                <xs:element ref="accept-ogg-theora" minOccurs="0"/>
                <xs:element ref="agent"/>
                <xs:element ref="buffer"/>
                <xs:element ref="resolution" minOccurs="0"/>
                <xs:element ref="thumbnail" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="enabled" type="boolean" use="required"/>
            <xs:attribute name="type" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="external"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="mimetype" type="xs:string"/>

    <xs:element name="accept-url" type="boolean" default="yes"/>

    <xs:element name="first-resource" type="boolean" default="no"/>

    <xs:element name="hide-original-resource" type="boolean" default="no"/>

    <xs:element name="accept-ogg-theora" type="boolean" default="no"/>

    <xs:element name="agent">
        <xs:complexType>
            <xs:attribute name="command" type="xs:string" use="required"/>
            <xs:attribute name="arguments" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="buffer">
        <xs:complexType>
            <xs:attribute name="size" type="xs:positiveInteger" use="required"/>
            <xs:attribute name="chunk-size" type="xs:positiveInteger" use="required"/>
            <xs:attribute name="fill-size" type="xs:nonNegativeInteger" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="resolution" type="xs:string"/>
    
    <xs:element name="thumbnail" type="boolean"/>

</xs:schema>
