<?xml version="1.0" encoding="UTF-8"?>
<!-- Schema for InstallService, part of AlwaysUp: http://www.CoreTechnologies.com/products/AlwaysUp -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- +++++++++++++ Document structure +++++++++++++ -->
	<xs:element name="alwaysup-installservice-configuration">
		<xs:complexType>
			<xs:sequence>
				<!-- The name of the service, limited to 200 characters -->
				<xs:element name="name">
					<xs:simpleType>
						<xs:restriction base="xs:string">
							<xs:minLength value="1"/>
							<xs:maxLength value="200"/>
						</xs:restriction>
					</xs:simpleType>
				</xs:element>
				<!-- An optional description of the service of the service -->
				<xs:element name="description" minOccurs="0">
					<xs:simpleType>
						<xs:restriction base="xs:string">
							<xs:minLength value="1"/>
							<xs:maxLength value="256"/>
						</xs:restriction>
					</xs:simpleType>
				</xs:element>
				<!-- General settings -->
				<xs:element name="general">
					<xs:complexType>
						<xs:all>
							<!-- The path to the application to run. -->
							<xs:element name="application-path" type="nonEmptyStringType"/>
							<!-- The arguments to the application to run (optional). -->
							<xs:element name="application-arguments" type="xs:string" minOccurs="0"/>
							<!-- The directory in which to start the application (optional). -->
							<xs:element name="start-directory" type="xs:string" minOccurs="0"/>
							<!-- The priority at which to run the application (optional). -->
							<xs:element name="set-priority" minOccurs="0">
								<xs:complexType>
									<xs:all>
										<!-- Specify to reduce the priority to normal when a user logs on. -->
										<xs:element name="reduce-to-normal-on-login" minOccurs="0">
											<xs:complexType/>
										</xs:element>
									</xs:all>
									<xs:attribute name="priority" type="priorityType" use="required"/>
									<!-- The priority at which to run the application - string values below. -->
								</xs:complexType>
							</xs:element>
							<!-- How to start the application. Default is automatically if no choice is made. -->
							<xs:element name="start" minOccurs="0">
								<xs:complexType>
									<xs:attribute name="type" type="startType" use="required"/>
								</xs:complexType>
							</xs:element>
							<!-- Limit the application to specific CPUs. -->
							<xs:element name="cpu-affinity" minOccurs="0">
								<xs:complexType>
									<xs:attribute name="mask" type="xs:positiveInteger" use="required"/>
								</xs:complexType>
							</xs:element>
							<!-- Adjust the application's main window. -->
							<xs:element name="adjust-main-window" minOccurs="0">
								<xs:complexType>
									<xs:all>
										<!-- Always on top of other windows. -->
										<xs:element name="always-on-top" minOccurs="0">
											<xs:complexType/>
										</xs:element>
									</xs:all>
									<xs:attribute name="show" type="showType" use="optional"/>
								</xs:complexType>
							</xs:element>
							<!-- Use a special command to stop the application. -->
							<xs:element name="stop-command" minOccurs="0" type="nonEmptyStringType"/>
							<!-- Capture output. -->
							<xs:element name="capture-output" minOccurs="0">
								<xs:complexType>
									<xs:all>
										<!-- Output file. -->
										<xs:element name="file" minOccurs="0" type="nonEmptyStringType"/>
										<!-- Trim the file when it gets too large. -->
										<xs:element name="trim" minOccurs="0">
											<xs:complexType>
												<xs:attribute name="max-size" type="xs:positiveInteger" use="required"/>
											</xs:complexType>
										</xs:element>
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:all>
					</xs:complexType>
				</xs:element>
				<!-- Log-on settings. No value implies to log on as the LocalSystem. -->
				<xs:choice>
					<!-- Log on as a user -->
					<xs:element name="log-on">
						<xs:complexType>
							<xs:all>
								<!-- The username, incuding any domain. -->
								<xs:element name="username" type="nonEmptyStringType"/>
								<!-- The password. -->
								<xs:element name="password" type="xs:string"/>
							</xs:all>
							<xs:attribute name="hide-windows" type="xs:boolean" use="optional"/>
						</xs:complexType>
					</xs:element>
					<!-- Log on as LocalSystem (the default) -->
					<xs:element name="log-on-as-system">
						<xs:complexType>
							<xs:attribute name="hide-windows" type="xs:boolean" use="optional"/>
						</xs:complexType>
					</xs:element>
				</xs:choice>
				<!-- Monitoring the application -->
				<xs:element name="monitor">
					<xs:complexType>
						<xs:all>
							<xs:element name="restart">
								<xs:complexType>
									<xs:all>
										<xs:element name="when-app-crashes" minOccurs="0">
											<xs:complexType/>
										</xs:element>
										<xs:element name="when-app-hangs" minOccurs="0">
											<xs:complexType>
												<xs:attribute name="enabled" type="xs:boolean"/>
												<xs:attribute name="for-longer-than" type="xs:positiveInteger" default="1"/>
											</xs:complexType>
										</xs:element>
										<xs:element name="when-memory-exceeds" minOccurs="0">
											<xs:complexType>
												<xs:attribute name="enabled" type="xs:boolean"/>
												<xs:attribute name="size" type="xs:positiveInteger" default="512"/>
											</xs:complexType>
										</xs:element>
										<xs:element name="when-cpu-hogged" minOccurs="0">
											<xs:complexType>
												<xs:attribute name="enabled" type="xs:boolean"/>
												<xs:attribute name="for-longer-than" type="xs:positiveInteger" default="5"/>
											</xs:complexType>
										</xs:element>
										<xs:element name="regularly" minOccurs="0">
											<xs:complexType>
												<xs:all>
													<!-- Optionally reboot when restarting. -->
													<xs:element name="reboot" minOccurs="0">
														<xs:complexType/>
													</xs:element>
												</xs:all>
												<xs:attribute name="enabled" type="xs:boolean"/>
												<xs:attribute name="day" type="dayType" use="required"/>
												<xs:attribute name="time" type="xs:string"/>
											</xs:complexType>
										</xs:element>
										<!-- Specify if the application should not be immediately restarted when it stops. -->
										<xs:element name="delay" minOccurs="0">
											<xs:complexType>
												<xs:choice>
													<xs:element name="on-the-hour"/>
													<xs:element name="on-the-half-hour"/>
													<xs:element name="wait">
														<xs:complexType>
															<xs:attribute name="time" type="xs:positiveInteger" use="required"/>
														</xs:complexType>
													</xs:element>
												</xs:choice>
											</xs:complexType>
										</xs:element>
									</xs:all>
								</xs:complexType>
							</xs:element>
							<xs:element name="dismiss-messageboxes" minOccurs="0">
								<xs:complexType/>
							</xs:element>
							<xs:element name="prevent-close-on-logoff" minOccurs="0">
								<xs:complexType/>
							</xs:element>
							<!-- Sanity check settings. -->
							<xs:element name="sanity-check" minOccurs="0">
								<xs:complexType>
                  							<xs:sequence>
                    								<xs:element name="command-line" type="nonEmptyStringType"/>
                  							</xs:sequence>
									<xs:attribute name="enabled" type="xs:boolean"/>
									<xs:attribute name="frequency" type="xs:positiveInteger" use="required"/>
									<xs:attribute name="timeout" type="xs:positiveInteger"/>
								</xs:complexType>
							</xs:element>
							<!-- Automate settings. -->
							<xs:element name="automate" minOccurs="0">
								<xs:complexType>
                  							<xs:sequence>
                    								<xs:element name="command" type="nonEmptyStringType"/>
                    								<xs:element name="num-times" minOccurs="0">
                      									<xs:complexType>
                        									<xs:attribute name="enabled" type="xs:boolean"/>
                        									<xs:attribute name="value" type="xs:positiveInteger" use="required"/>
                      									</xs:complexType>
                    								</xs:element>
                  							</xs:sequence>
									<xs:attribute name="enabled" type="xs:boolean"/>
									<xs:attribute name="interval" type="xs:positiveInteger" use="required"/>
								</xs:complexType>
							</xs:element>
						</xs:all>
					</xs:complexType>
				</xs:element>
				<!-- Notification settings -->
				<xs:element name="notification">
					<xs:complexType>
						<xs:all>
							<xs:element name="email" minOccurs="0">
								<xs:complexType>
									<xs:all>
										<!-- The To address for emails. Multiple addresses must be separated by a comma. -->
										<xs:element name="to-address" type="xs:string" minOccurs="0"/>
										<xs:element name="from-name" type="xs:string" minOccurs="0"/>
										<xs:element name="from-address" type="xs:string" minOccurs="0"/>
										<xs:element name="send" minOccurs="0">
											<xs:complexType>
												<xs:all>
													<xs:element name="when-application-stops" minOccurs="0">
														<xs:complexType/>
													</xs:element>
													<xs:element name="when-messagebox-dismissed" minOccurs="0">
														<xs:complexType/>
													</xs:element>
													<xs:element name="daily" minOccurs="0">
														<xs:complexType/>
													</xs:element>
													<xs:element name="weekly" minOccurs="0">
														<xs:complexType/>
													</xs:element>
												</xs:all>
											</xs:complexType>
										</xs:element>
										<xs:element name="smtp-server">
											<xs:complexType>
												<xs:all>
													<xs:element name="name" type="xs:string" minOccurs="0"/>
													<xs:element name="port" type="xs:string" minOccurs="0"/>
													<xs:element name="use-ssl" minOccurs="0">
														<xs:complexType/>
													</xs:element>
													<xs:element name="authentication" minOccurs="0">
														<xs:complexType>
															<xs:all>
																<!-- The username. -->
																<xs:element name="username" type="nonEmptyStringType"/>
																<!-- The password. -->
																<xs:element name="password" type="xs:string"/>
															</xs:all>
															<xs:attribute name="enabled" type="xs:boolean"/>
															<xs:attribute name="type" type="authType" use="required"/>
														</xs:complexType>
													</xs:element>
												</xs:all>
											</xs:complexType>
										</xs:element>
										<xs:element name="use-text-format" minOccurs="0">
											<xs:complexType/>
										</xs:element>
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:all>
					</xs:complexType>
				</xs:element>
				<!-- Startup settings -->
				<xs:element name="startup">
					<xs:complexType>
						<xs:all>
							<xs:element name="restore-network-drives" minOccurs="0">
								<xs:complexType/>
							</xs:element>
							<xs:element name="ensure-network-is-up" minOccurs="0">
								<xs:complexType/>
							</xs:element>
							<xs:element name="pause" minOccurs="0">
								<xs:complexType>
									<xs:attribute name="time" type="xs:positiveInteger" default="30"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="run" minOccurs="0">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="command-line" type="nonEmptyStringType"/>
									</xs:sequence>
									<xs:attribute name="enabled" type="xs:boolean"/>
									<xs:attribute name="run-on-restart" type="xs:boolean"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="dependencies" minOccurs="0">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="service-name" type="nonEmptyStringType" maxOccurs="unbounded"/>
									</xs:sequence>
									<xs:attribute name="enabled" type="xs:boolean"/>
								</xs:complexType>
							</xs:element>
						</xs:all>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- +++++++++++++ Referenced types +++++++++++++ -->
	<!-- startType: valid ways that the application can be started. -->
	<xs:simpleType name="startType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="automatically"/>
			<xs:enumeration value="manually"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="showType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="min"/>
			<xs:enumeration value="max"/>
			<xs:enumeration value="normal"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- priorityType: valid priority values. -->
	<xs:simpleType name="priorityType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="idle"/>
			<xs:enumeration value="below-normal"/>
			<xs:enumeration value="normal"/>
			<xs:enumeration value="above-normal"/>
			<xs:enumeration value="high"/>
			<xs:enumeration value="real-time"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- dayType: valid restart-app day values. -->
	<xs:simpleType name="dayType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="daily"/>
			<xs:enumeration value="monday"/>
			<xs:enumeration value="tuesday"/>
			<xs:enumeration value="wednesday"/>
			<xs:enumeration value="thursday"/>
			<xs:enumeration value="friday"/>
			<xs:enumeration value="saturday"/>
			<xs:enumeration value="sunday"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- authType: valid email authentication values. -->
	<xs:simpleType name="authType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="CRAM-MD5"/>
			<xs:enumeration value="AUTH-LOGIN"/>
			<xs:enumeration value="AUTH-PLAIN"/>
			<xs:enumeration value="AUTH-NTLM"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- nonEmptyStringType:  represents a non-empty string. -->
	<xs:simpleType name="nonEmptyStringType">
		<xs:restriction base="xs:string">
			<xs:minLength value="1"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>
