<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2009 by Axis Communications AB. All rights reserved.

Recipients of this document may copy, distribute, publish, or display this document so long as this copyright notice, license and disclaimer are retained with all copies of the document. No license is granted to modify this document.

THIS DOCUMENT IS PROVIDED "AS IS," AND AXIS COMMUNICATIONS AB MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THIS DOCUMENT ARE SUITABLE FOR ANY PURPOSE; OR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
IN NO EVENT WILL AXIS COMMUNICATIONS AB BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR RELATING TO ANY USE OR DISTRIBUTION OF THIS DOCUMENT, WHETHER OR NOT (1) AXIS COMMUNICATIONS AB HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR (2) SUCH DAMAGES WERE REASONABLY FORESEEABLE, AND ARISING OUT OF OR RELATING TO ANY USE OR DISTRIBUTION OF THIS DOCUMENT.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:st="http://www.axis.com/webservice/storage/schema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xop="http://www.w3.org/2004/08/xop/include" targetNamespace="http://www.axis.com/webservice/storage/schema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <!--===============================-->
  <xs:element name="SchemaVersion" type="xs:string" fixed="1.0"/>
  <!--===============================-->
  <!--         Generic Types         -->
  <!--===============================-->
  <xs:simpleType name="ReferenceToken">
    <xs:restriction base="xs:string">
      <xs:maxLength value="64"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:simpleType name="Name">
    <xs:restriction base="xs:string">
      <xs:maxLength value="64"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:simpleType name="Description">
    <xs:restriction base="xs:string">
      <xs:maxLength value="1024"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="Version">
    <xs:sequence>
      <xs:element name="Major" type="xs:int"/>
      <xs:element name="Minor" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="Uri">
    <xs:annotation>
      <xs:documentation>The format of the string MUST comply with the xs:anyURI definition. xs:anyURI is not used due to compatibility issues.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse" fixed="true" id="Uri.whiteSpace"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:simpleType name="Duration">
    <xs:annotation>
      <xs:documentation>The format of the string MUST comply with the xs:duration definition. xs:duration is not used due to compatibility issues.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse" fixed="true" id="duration.whiteSpace"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <!--         Storage Types         -->
  <!--===============================-->
  <xs:complexType name="Capabilities">
    <xs:sequence>
      <xs:element name="VersionsSupported" type="st:Version" maxOccurs="unbounded"/>
      <xs:element name="FileServer" type="st:FileServerCapabilities" minOccurs="0"/>
      <xs:element name="Playback" type="st:PlaybackCapabilities" minOccurs="0"/>
      <xs:element name="Scheduler" type="st:SchedulerCapabilities" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="FileServerCapabilities">
    <xs:sequence>
      <xs:element name="XAddr" type="xs:anyURI"/>
      <xs:element name="Deletion" type="xs:boolean"/>
      <xs:element name="HttpDownload" type="xs:boolean"/>
      <xs:element name="HttpUpload" type="xs:boolean"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="PlaybackCapabilities">
    <xs:sequence>
      <xs:element name="XAddr" type="xs:anyURI"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="SchedulerCapabilities">
    <xs:sequence>
      <xs:element name="XAddr" type="xs:anyURI"/>
      <xs:element name="Scheduling" type="xs:boolean"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="RecordingInformationList">
    <xs:sequence>
      <xs:element name="Total" type="xs:int"/>
      <xs:element name="Skipped" type="xs:int"/>
      <xs:element name="Taken" type="xs:int"/>
      <xs:element name="RecordingInformation" type="st:RecordingInformation" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="RecordingInformation">
    <xs:sequence>
      <xs:element name="RecordingToken" type="st:RecordingReference"/>
      <xs:element name="RecordingStatus" type="st:RecordingStatus"/>
      <xs:element name="Size" type="st:StorageSize"/>
      <xs:element name="NumberRecordingBlocks" type="xs:int"/>
      <xs:element name="NumberLocks" type="xs:int"/>
      <xs:element name="Attributes" type="st:RecordingAttributes"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="RecordingStatus">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Undefined"/>
      <xs:enumeration value="Initiated"/>
      <xs:enumeration value="Recording"/>
      <xs:enumeration value="Complete"/>
      <xs:enumeration value="Streaming"/>
      <xs:enumeration value="Removing"/>
      <xs:enumeration value="Removed"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="RecordingAttributes">
    <xs:sequence>
      <xs:element name="SourceToken" type="st:RecordingSourceReference"/>
      <xs:element name="StartTime" type="xs:dateTime"/>
      <xs:element name="StopTime" type="xs:dateTime"/>
      <xs:element name="Content" type="st:Description"/>
      <xs:element name="VideoAttributes" type="st:VideoAttributes" minOccurs="0"/>
      <xs:element name="AudioAttributes" type="st:AudioAttributes" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="RecordingSourceList">
    <xs:sequence>
      <xs:element name="Total" type="xs:int"/>
      <xs:element name="Skipped" type="xs:int"/>
      <xs:element name="Taken" type="xs:int"/>
      <xs:element name="RecordingSources" type="st:RecordingSource" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="RecordingSource">
    <xs:sequence>
      <xs:element name="Name" type="st:Name"/>
      <xs:element name="SourceAddress" type="xs:anyURI"/>
      <xs:element name="External" type="xs:boolean"/>
      <xs:element name="Description" type="st:Description"/>
      <xs:element name="MaximumRecordingAge" type="xs:duration" minOccurs="0"/>
      <xs:element name="Status" type="st:RecordingSourceStatus" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="token" type="st:RecordingSourceReference"/>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="RecordingSourceStatus">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Undefined"/>
      <xs:enumeration value="Disconnected"/>
      <xs:enumeration value="Connected"/>
      <xs:enumeration value="Streaming"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:simpleType name="RecordingSourceReference">
    <xs:restriction base="st:ReferenceToken"/>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="VideoAttributes">
    <xs:sequence>
      <xs:element name="Width" type="xs:int"/>
      <xs:element name="Height" type="xs:int"/>
      <xs:element name="Quality" type="xs:float"/>
      <xs:element name="Framerate" type="st:Framerate"/>
      <xs:element name="Bitrate" type="xs:int"/>
      <xs:element name="Encoding" type="st:VideoEncoding"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="Framerate">
    <xs:restriction base="xs:float">
      <xs:minInclusive value="0"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:simpleType name="VideoEncoding">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Undefined"/>
      <xs:enumeration value="JPEG"/>
      <xs:enumeration value="MPEG4"/>
      <xs:enumeration value="H264"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="AudioAttributes">
    <xs:sequence>
      <xs:element name="Samplerate" type="xs:int"/>
      <xs:element name="Bitrate" type="xs:int"/>
      <xs:element name="Encoding" type="st:AudioEncoding"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="AudioEncoding">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Undefined"/>
      <xs:enumeration value="G711"/>
      <xs:enumeration value="G726"/>
      <xs:enumeration value="AAC"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="Lock">
    <xs:sequence>
      <!--      <xs:element name="RecordingToken" type="st:RecordingReference"/> -->
      <xs:element name="StartTime" type="xs:dateTime"/>
      <xs:element name="StopTime" type="xs:dateTime"/>
    </xs:sequence>
    <xs:attribute name="token" type="st:LockReference"/>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="LockReference">
    <xs:restriction base="st:ReferenceToken"/>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="RecordingBlockInformationList">
    <xs:sequence>
      <xs:element name="Total" type="xs:int"/>
      <xs:element name="Skipped" type="xs:int"/>
      <xs:element name="Taken" type="xs:int"/>
      <xs:element name="RecordingBlockInformation" type="st:RecordingBlockInformation" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="RecordingBlockInformation">
    <xs:sequence>
      <xs:element name="BlockToken" type="st:RecordingBlockReference"/>
      <xs:element name="RecordingToken" type="st:RecordingReference"/>
      <xs:element name="StartTime" type="xs:dateTime"/>
      <xs:element name="StopTime" type="xs:dateTime"/>
      <xs:element name="Size" type="st:StorageSize"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="Filter">
    <xs:sequence>
      <xs:element name="IncludeFunctions" type="st:FilterFunction" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="ExcludeFunctions" type="st:FilterFunction" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="FilterFunction">
    <xs:sequence>
      <xs:element name="Operand" type="st:FilterOperand"/>
      <xs:element name="Operator" type="st:FilterOperator"/>
      <xs:element name="Value" type="st:FilterValue"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="FilterOperator">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Equals"/>
      <xs:enumeration value="NotEqual"/>
      <xs:enumeration value="LessThan"/>
      <xs:enumeration value="GreaterThan"/>
      <xs:enumeration value="Contains"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:simpleType name="FilterOperand">
    <xs:restriction base="xs:string">
      <xs:enumeration value="RecordingToken"/>
      <xs:enumeration value="RecordingBlockToken"/>
      <xs:enumeration value="SourceToken"/>
      <xs:enumeration value="SourceName"/>
      <xs:enumeration value="SourceAddress"/>
      <xs:enumeration value="Content"/>
      <xs:enumeration value="UserData"/>
      <xs:enumeration value="StartTime"/>
      <xs:enumeration value="StopTime"/>
      <xs:enumeration value="VideoWidth"/>
      <xs:enumeration value="VideoHeight"/>
      <xs:enumeration value="VideoQuality"/>
      <xs:enumeration value="VideoFramerate"/>
      <xs:enumeration value="VideoBitrate"/>
      <xs:enumeration value="VideoEncoding"/>
      <xs:enumeration value="AudioSampleRate"/>
      <xs:enumeration value="AudioBitrate"/>
      <xs:enumeration value="AudioEncoding"/>
      <xs:enumeration value="NumberRecordingBlocks"/>
      <xs:enumeration value="NumberLocks"/>
      <xs:enumeration value="RecordingStatus"/>
      <xs:enumeration value="RecordingSize"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:simpleType name="FilterValue">
    <xs:restriction base="xs:string">
      <xs:maxLength value="1024"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:element name="Size" type="st:StorageSize"/>
  <xs:simpleType name="StorageSize">
    <xs:restriction base="xs:long"/>
  </xs:simpleType>
  <!--===============================-->
  <!--      File Server Types       -->
  <!--===============================-->
  <xs:complexType name="Recording">
    <xs:sequence>
      <xs:element name="Information" type="st:RecordingInformation"/>
      <xs:element name="Blocks" type="st:RecordingBlock" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="token" type="st:RecordingReference"/>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="RecordingReference">
    <xs:restriction base="st:ReferenceToken"/>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="RecordingBlock">
    <xs:sequence>
      <xs:element name="Information" type="st:RecordingBlockInformation"/>
      <xs:element name="Data" type="xs:base64Binary"/>
    </xs:sequence>
    <xs:attribute name="token" type="st:RecordingBlockReference"/>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="RecordingBlockReference">
    <xs:restriction base="st:ReferenceToken"/>
  </xs:simpleType>
  <!--===============================-->
  <!--        Playback Types         -->
  <!--===============================-->
  <xs:complexType name="Transport">
    <xs:sequence>
      <xs:element name="Protocol" type="st:TransportProtocol"/>
      <xs:element name="Tunnel" type="st:Transport" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="TransportProtocol">
    <xs:restriction base="xs:string">
      <xs:enumeration value="UDP"/>
      <xs:enumeration value="TCP"/>
      <xs:enumeration value="RTSP"/>
      <xs:enumeration value="RTSPS"/>
      <xs:enumeration value="HTTP"/>
      <xs:enumeration value="HTTPS"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="MediaUri">
    <xs:sequence>
      <xs:element name="Uri" type="xs:anyURI"/>
      <xs:element name="InvalidAfterConnect" type="xs:boolean"/>
      <xs:element name="InvalidAfterReboot" type="xs:boolean"/>
      <xs:element name="Timeout" type="xs:duration"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <!--         Server Types          -->
  <!--===============================-->
  <xs:complexType name="RecordingSchedule">
    <xs:sequence>
      <xs:element name="SourceConfigurationToken" type="st:ReferenceToken"/>
      <xs:element name="RecurringEntries" type="st:RecurringScheduleEntry" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="InstanceEntries" type="st:InstanceScheduleEntry" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="RecurringScheduleEntry">
    <xs:sequence>
      <xs:element name="TimeOfDay" type="xs:time"/>
      <xs:element name="Duration" type="xs:duration"/>
      <xs:element name="AppliedDaysOfWeek" type="st:DayOfWeek" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="AppliedDaysOfMonth" type="st:DayOfMonth" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="ValidFrom" type="xs:dateTime"/>
      <xs:element name="ValidUntil" type="xs:dateTime"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="DayOfWeek">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Monday"/>
      <xs:enumeration value="Tuesday"/>
      <xs:enumeration value="Wednesday"/>
      <xs:enumeration value="Thursdays"/>
      <xs:enumeration value="Friday"/>
      <xs:enumeration value="Saturday"/>
      <xs:enumeration value="Sunday"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:simpleType name="DayOfMonth">
    <xs:restriction base="xs:int">
      <xs:minInclusive value="1"/>
      <xs:maxInclusive value="31"/>
    </xs:restriction>
  </xs:simpleType>
  <!--===============================-->
  <xs:complexType name="InstanceScheduleEntry">
    <xs:sequence>
      <xs:element name="StartTime" type="xs:dateTime"/>
      <xs:element name="StopTime" type="xs:dateTime"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="RecordingSourceConfigurationList">
    <xs:sequence>
      <xs:element name="Total" type="xs:int"/>
      <xs:element name="Skipped" type="xs:int"/>
      <xs:element name="Taken" type="xs:int"/>
      <xs:element name="SourceConfigurations" type="st:RecordingSourceConfiguration" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--===============================-->
  <xs:complexType name="RecordingSourceConfiguration">
    <xs:sequence>
      <xs:element name="Name" type="st:Name"/>
      <xs:element name="RecordingSourceToken" type="st:RecordingSourceReference"/>
      <xs:element name="RetrievalUri" type="xs:anyURI"/>
      <xs:element name="ProfileToken" type="st:ReferenceToken"/>
      <xs:element name="Transport" type="st:Transport"/>
      <xs:element name="Content" type="st:Description"/>
    </xs:sequence>
    <xs:attribute name="token" type="st:RecordingSourceConfigurationReference"/>
  </xs:complexType>
  <!--===============================-->
  <xs:simpleType name="RecordingSourceConfigurationReference">
    <xs:restriction base="st:ReferenceToken"/>
  </xs:simpleType>
  <!--===============================-->
</xs:schema>
