<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="OmnidexNA"
           targetNamespace="OmnidexNA"
           elementFormDefault="qualified"
           version="40400">
  <xs:annotation>
    <xs:documentation xml:lang="en">
      Omnidex Network Access schema definition
      Copyright 2008 Dynamic Information Systems Corporation.  All rights reserved.
    </xs:documentation>
  </xs:annotation>


  <xs:element name="networkAccess" type="networkAccessType" />

  <!-- ********************* -->
  <!-- *** networkAccess *** -->
  <!-- ********************* -->
  <xs:complexType name="networkAccessType">
    <xs:choice>
      <xs:element name="input" type="inputType" minOccurs="1" maxOccurs="1" />
      <xs:element name="output" type="outputType" minOccurs="1" maxOccurs="1" />
    </xs:choice>
  </xs:complexType>

  <!-- ************* -->
  <!-- *** input *** -->
  <!-- ************* -->
  <xs:complexType name="inputType">
    <xs:choice>
      <xs:element name="connect" type="connectType" minOccurs="1" maxOccurs="1" />
      <xs:element name="systemInformation" type="systemInformationType" minOccurs="1" maxOccurs="1" />
      <xs:element name="operations" type="operationsType" minOccurs="1" maxOccurs="1" />
      <xs:element name="copyFile" type="copyFileType" minOccurs="1" maxOccurs="1" />
      <xs:element name="fileData" type="fileDataType" minOccurs="1" maxOccurs="1" />
      <xs:element name="openOdxsql" type="openOdxsqlType" minOccurs="1" maxOccurs="1" />
      <xs:element name="sendInput" type="sendInputType" minOccurs="1" maxOccurs="1" />
      <xs:element name="closeHandle" type="closeHandleType" minOccurs="1" maxOccurs="1" />
      <xs:element name="disconnect" type="disconnectType" minOccurs="1" maxOccurs="1" />
    </xs:choice>
  </xs:complexType>

  <!-- *************** -->
  <!-- *** connect *** -->
  <!-- *************** -->
  <xs:complexType name="connectType">
    <xs:all>
      <xs:element name="options" type="optionsType" minOccurs="0" maxOccurs="1" />
    </xs:all>
  </xs:complexType>

  <!-- ****************** -->
  <!-- *** disconnect *** -->
  <!-- ****************** -->
  <xs:complexType name="disconnectType">
    <xs:all>
      <xs:element name="options" type="optionsType" minOccurs="0" maxOccurs="1" />
    </xs:all>
  </xs:complexType>

  <!-- ************************* -->
  <!-- *** systemInformation *** -->
  <!-- ************************* -->
  <!-- get system information -->
  <xs:complexType name="systemInformationType">
    <xs:all>
      <xs:element name="options" type="optionsType" minOccurs="0" maxOccurs="1" />
    </xs:all>
  </xs:complexType>

  <!-- ****************** -->
  <!-- *** operations *** -->
  <!-- ****************** -->
  <xs:complexType name="operationsType">
    <xs:sequence>
      <xs:element name="operation" type="operationType" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <!-- ***************** -->
  <!-- *** operation *** -->
  <!-- ***************** -->
  <xs:complexType name="operationType">
    <xs:choice>
      <xs:element name="installIndexes" type="installIndexesType" minOccurs="1" maxOccurs="1" />
      <xs:element name="execsqlCommand" type="execsqlCommandType" minOccurs="1" maxOccurs="1" />
    </xs:choice>
  </xs:complexType>

  <!-- ********************** -->
  <!-- *** installIndexes *** -->
  <!-- ********************** -->
  <!-- Install Omnidex indexes based on XML file -->
  <xs:complexType name="installIndexesType">
    <xs:all>
      <xs:element name="environment" type="physicalType" minOccurs="1" maxOccurs="1" />
      <xs:element name="database" type="nameType" minOccurs="1" maxOccurs="1" />
    </xs:all>
  </xs:complexType>

  <!-- ********************** -->
  <!-- *** execsqlCommand *** -->
  <!-- ********************** -->
  <xs:complexType name="execsqlCommandType">
    <xs:all>
      <xs:element name="environment" type="physicalType" minOccurs="1" maxOccurs="1" />
      <xs:element name="command" type="xs:string" minOccurs="1" maxOccurs="1" />
    </xs:all>
  </xs:complexType>

  <!-- **************** -->
  <!-- *** copyFile *** -->
  <!-- **************** -->
  <xs:complexType name="copyFileType">
    <xs:all>
      <xs:element name="clientFile" type="physicalType" minOccurs="1" maxOccurs="1" />
      <xs:element name="serverFile" type="physicalType" minOccurs="1" maxOccurs="1" />
      <xs:element name="upload" type="xs:boolean" minOccurs="1" maxOccurs="1" />
      <xs:element name="ascii" type="xs:boolean" minOccurs="0" maxOccurs="1" />
      <xs:element name="options" type="optionsType" minOccurs="0" maxOccurs="1" />
      <xs:element name="fileData" type="fileDataType" minOccurs="0" maxOccurs="1" />
    </xs:all>
  </xs:complexType>

  <!-- **************** -->
  <!-- *** fileData *** -->
  <!-- **************** -->
  <xs:complexType name="fileDataType">
    <xs:all>
      <xs:element name="length" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1" />
      <xs:element name="offset" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="handle" type="xs:positiveInteger" use="required" />
  </xs:complexType>

  <!-- ****************** -->
  <!-- *** openOdxsql *** -->
  <!-- ****************** -->
  <!-- open odxsql -->
  <xs:complexType name="openOdxsqlType">
    <xs:sequence>
      <xs:element name="setting" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <!-- ***************** -->
  <!-- *** sendInput *** -->
  <!-- ***************** -->
  <!-- send input -->
  <xs:complexType name="sendInputType">
    <xs:all>
      <xs:element name="input" type="xs:string" minOccurs="1" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="handle" type="xs:positiveInteger" use="required" />
  </xs:complexType>

  <!-- ******************* -->
  <!-- *** closeHandle *** -->
  <!-- ******************* -->
  <!-- close a handle -->
  <xs:complexType name="closeHandleType">
    <xs:all>
      <xs:element name="options" type="optionsType" minOccurs="0" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="handle" type="xs:positiveInteger" use="required" />
  </xs:complexType>



  <!-- ************** -->
  <!-- *** output *** -->
  <!-- ************** -->
  <xs:complexType name="outputType">
    <xs:choice>
      <xs:element name="connection" type="connectionType" minOccurs="1" maxOccurs="1" />
      <xs:element name="data" type="dataType" minOccurs="1" maxOccurs="1" />
      <xs:element name="fileData" type="fileDataType" minOccurs="1" maxOccurs="1" />
      <xs:element name="status" type="statusType" minOccurs="1" maxOccurs="1" />
      <xs:element name="versions" type="versionsType" minOccurs="1" maxOccurs="1" />
      <xs:element name="error" type="errorType" minOccurs="1" maxOccurs="1" />
    </xs:choice>
  </xs:complexType>

  <!-- ****************** -->
  <!-- *** connection *** -->
  <!-- ****************** -->
  <xs:complexType name="connectionType">
    <xs:attribute name="instance" type="xs:positiveInteger" use="required" />
  </xs:complexType>

  <!-- ************ -->
  <!-- *** data *** -->
  <!-- ************ -->
  <xs:complexType name="dataType">
    <xs:all>
      <xs:element name="data" type="xs:string" minOccurs="1" maxOccurs="1" />
      <xs:element name="error" type="errorType" minOccurs="0" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="handle" type="xs:positiveInteger" use="required" />
  </xs:complexType>

  <!-- ************** -->
  <!-- *** status *** -->
  <!-- ************** -->
  <xs:complexType name="statusType">
    <xs:all>
      <xs:element name="operation" type="xs:token" minOccurs="1" maxOccurs="1" />
      <xs:element name="step" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1" />
      <xs:element name="message" type="xs:string" minOccurs="0" maxOccurs="1" />
      <xs:element name="percentage" type="xs:double" minOccurs="0" maxOccurs="1" />
      <xs:element name="finished" type="xs:boolean" minOccurs="0" maxOccurs="1" />
      <xs:element name="error" type="errorType" minOccurs="0" maxOccurs="1" />
    </xs:all>
  </xs:complexType>

  <!-- **************** -->
  <!-- *** versions *** -->
  <!-- **************** -->
  <xs:complexType name="versionsType">
    <xs:sequence>
      <xs:element name="version" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:all>
            <xs:element name="tag" type="xs:token" minOccurs="1" maxOccurs="1" />
            <xs:element name="product" type="xs:string" minOccurs="1" maxOccurs="1" />
            <xs:element name="version" type="xs:string" minOccurs="1" maxOccurs="1" />
            <xs:element name="versionNo" type="xs:positiveInteger" minOccurs="0" maxOccurs="1" />
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <!-- ************* -->
  <!-- *** error *** -->
  <!-- ************* -->
  <xs:complexType name="errorType">
    <xs:sequence>
      <xs:element name="error" type = "xs:integer" minOccurs="0" maxOccurs="1" />
      <xs:element name="warn" type = "xs:integer" minOccurs="0" maxOccurs="1" />
      <xs:element name="info" type = "xs:integer" minOccurs="0" maxOccurs="1" />
      <xs:element name="buffer" type="xs:string" minOccurs="0" maxOccurs="1" />
      <xs:element name="nativeError" type="xs:string" minOccurs="0" maxOccurs="1" />
      <xs:element name="location" type="xs:string" minOccurs="0" maxOccurs="1" />
      <xs:element name="context" type="xs:string" minOccurs="0" maxOccurs="1" />
      <xs:element name="message" type="xs:string" minOccurs="0" maxOccurs="1" />
      <xs:element name="data" minOccurs="0" maxOccurs="32">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:integer">
              <xs:attribute name="number" type="xs:nonNegativeInteger" use="required" />
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="msg" minOccurs="0" maxOccurs="8">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="number" type="xs:nonNegativeInteger" use="required" />
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>


  <!-- ******************** -->
  <!-- *** SIMPLE TYPES *** -->
  <!-- ******************** -->

  <!-- *** nameType *** -->
  <xs:simpleType name="nameType">
    <xs:restriction base="xs:token">
      <xs:pattern value="[A-Za-z$][A-Za-z\d!@#$%^_]{0,31}" />
    </xs:restriction>
  </xs:simpleType>
  <!-- *** physicalType *** -->
  <xs:simpleType name="physicalType">
    <xs:restriction base="xs:string">
      <xs:maxLength value="255" />
    </xs:restriction>
  </xs:simpleType>
  <!-- *** optionsType *** -->
  <xs:simpleType name="optionsType">
    <xs:restriction base="xs:string">
      <xs:maxLength value="255" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
