<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  xmlns:xs='http://www.w3.org/2001/XMLSchema'
  xmlns='http://winscp.net/schema/session/1.0'
  targetNamespace='http://winscp.net/schema/session/1.0'>

  <xs:annotation>
    <xs:documentation source='http://winscp.net/eng/docs/xml_logging' />
  </xs:annotation>

  <!-- Element types with @value attribute of specific type -->

  <xs:complexType name='stringValueType'>
    <xs:attribute name='value' type='xs:string' use='required' />
  </xs:complexType>
  
  <xs:complexType name='dateTimeValueType'>
    <xs:attribute name='value' type='xs:dateTime' use='required' />
  </xs:complexType>
  
  <xs:complexType name='sizeValueType'>
    <xs:attribute name='value' type='xs:unsignedLong' use='required' />
  </xs:complexType>
  
  <xs:complexType name='fileTypeValueType'>
    <xs:attribute name='value' use='required'>
      <xs:simpleType>
        <xs:restriction base='xs:string'>
          <xs:length value="1"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>

  <!-- Specific elements with @value attribute of specific type -->

  <xs:element name='filename' type='stringValueType' />
  <xs:element name='destination' type='stringValueType' />
  <xs:element name='permissions' type='stringValueType' />
  <xs:element name='command' type='stringValueType' />
  <xs:element name='output' type='stringValueType' />
  <xs:element name='erroroutput' type='stringValueType' />

  <xs:element name='modification' type='dateTimeValueType' />

  <xs:element name='size' type='sizeValueType' />

  <xs:element name='type' type='fileTypeValueType' />

  <!-- Advanced elements -->

  <xs:element name='message' type='xs:string' />

  <xs:element name='result'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='message' minOccurs='0' maxOccurs='unbounded' />
      </xs:sequence>
      <xs:attribute name='success' type='xs:boolean' use='required' />
    </xs:complexType>
  </xs:element>

  <!-- Added in 5.0.3 beta -->
  <xs:element name='failure'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='message' minOccurs='0' maxOccurs='unbounded' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='file'>
    <xs:complexType>
      <xs:sequence>
        <!-- Does not occur within <stat/> -->
        <xs:element ref='filename' minOccurs='0' />
        <xs:element ref='type' />
        <xs:element ref='size' minOccurs='0' />
        <xs:element ref='modification' />
        <xs:element ref='permissions' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='files'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='file' minOccurs='0' maxOccurs='unbounded'/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- Action elements -->

  <xs:element name='upload'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='filename' />
        <xs:element ref='destination' minOccurs='0' />
        <xs:element ref='result' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='download'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='filename' />
        <xs:element ref='destination' minOccurs='0' />
        <xs:element ref='result' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='touch'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='filename' />
        <xs:element ref='modification' />
        <xs:element ref='result' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='chmod'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='filename' />
        <xs:element ref='permissions' minOccurs='0' />
        <xs:element ref='result' />
      </xs:sequence>
      <xs:attribute name='recursive' type='xs:boolean' use='optional' />
    </xs:complexType>
  </xs:element>

  <xs:element name='mkdir'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='filename' />
        <xs:element ref='result' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='rm'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='filename' />
        <xs:element ref='result' />
      </xs:sequence>
      <xs:attribute name='recursive' type='xs:boolean' use='optional' />
    </xs:complexType>
  </xs:element>

  <xs:element name='mv'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='filename' />
        <xs:element ref='destination' />
        <xs:element ref='result' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='call'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='command' />
        <xs:element ref='destination' />
        <xs:sequence minOccurs='0' maxOccurs='unbounded'>
          <xs:choice>
            <xs:element ref='output' />
            <xs:element ref='erroroutput' />
          </xs:choice>
        </xs:sequence>
        <xs:element ref='result' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name='ls'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='destination' />
        <xs:element ref='files' />
        <xs:element ref='result' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- Added in 5.0.6 beta -->
  <xs:element name='stat'>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref='filename' />
        <xs:element ref='file' minOccurs='0' />
        <xs:element ref='result' />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- Added in 5.0.6 beta -->
  <xs:element name='group'>
    <xs:complexType>
      <xs:sequence minOccurs='0' maxOccurs='unbounded'>
        <xs:choice>
          <xs:element ref='failure'/>
          <xs:element ref='upload'/>
          <xs:element ref='download'/>
          <xs:element ref='touch'/>
          <xs:element ref='chmod'/>
          <xs:element ref='mkdir'/>
          <xs:element ref='rm'/>
          <xs:element ref='mv'/>
          <xs:element ref='call'/>
          <xs:element ref='ls'/>
          <xs:element ref='stat'/>
        </xs:choice>
      </xs:sequence>
      <xs:attribute name='name' type='xs:string' use='required' />
      <xs:attribute name='start' type='xs:dateTime' use='required' />
    </xs:complexType>
  </xs:element>

  <!-- Top-level @session element -->

  <xs:element name='session'>
    <xs:complexType>
      <xs:sequence minOccurs='0' maxOccurs='unbounded'>
        <xs:choice>
          <!-- Added in 5.0.6 beta -->
          <xs:element ref='group'/>
          <!-- Added in 5.0.3 beta -->
          <xs:element ref='failure'/>
          <xs:element ref='upload'/>
          <xs:element ref='download'/>
          <xs:element ref='touch'/>
          <xs:element ref='chmod'/>
          <xs:element ref='mkdir'/>
          <xs:element ref='rm'/>
          <xs:element ref='mv'/>
          <xs:element ref='call'/>
          <xs:element ref='ls'/>
          <!-- Added in 5.0.6 beta -->
          <xs:element ref='stat'/>
        </xs:choice>
      </xs:sequence>
      <xs:attribute name='name' type='xs:string' use='required' />
      <xs:attribute name='start' type='xs:dateTime' use='required' />
    </xs:complexType>
  </xs:element>
</xs:schema>

