<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.ecf.provider.filetransfer" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
      <appInfo>
         <meta.schema plugin="org.eclipse.ecf.provider.filetransfer" id="retrieveFileTransferProtocolFactory" name="retrieveFileTransferProtocolFactory"/>
      </appInfo>
      <documentation>
         This extension point allows IRetrieveFileTransferFactorys to be defined for given file transfer protocols.
      </documentation>
   </annotation>

   <element name="extension">
      <annotation>
         <appInfo>
            <meta.element />
         </appInfo>
      </annotation>
      <complexType>
         <sequence>
            <element ref="retrieveFileTransferProtocolFactory" minOccurs="0" maxOccurs="unbounded"/>
         </sequence>
         <attribute name="point" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="id" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="name" type="string">
            <annotation>
               <documentation>
                  
               </documentation>
               <appInfo>
                  <meta.attribute translatable="true"/>
               </appInfo>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <element name="retrieveFileTransferProtocolFactory">
      <annotation>
         <documentation>
            Retrieve file transfer protocol factory extention point
         </documentation>
      </annotation>
      <complexType>
         <attribute name="protocol" type="string" use="required">
            <annotation>
               <documentation>
                  Protocol to define factory for.  For example, http, https, ftp, bittorrent, my.favorite.protocol.
               </documentation>
            </annotation>
         </attribute>
         <attribute name="class" type="string" use="required">
            <annotation>
               <documentation>
                  The factory class to use for given protocol.  Must implement &lt;b&gt;org.eclipse.ecf.filetransfer.service.IRetrieveFileTransferFactory&lt;/b&gt;
               </documentation>
               <appInfo>
                  <meta.attribute kind="java" basedOn="org.eclipse.ecf.filetransfer.service.IRetrieveFileTransferFactory"/>
               </appInfo>
            </annotation>
         </attribute>
         <attribute name="priority" type="string">
            <annotation>
               <documentation>
                  Priority relative to other retrieveFileTransferProtocolFactory extensions.  Valid priorities are 0 (highest priority) to 100 (lowest priority).  If this optional attribute is not specified, it will automatically be assigned a default priority of 100.
               </documentation>
            </annotation>
         </attribute>
         <attribute name="uri" type="boolean">
            <annotation>
               <documentation>
                  Flag to indicate that the protocol factory will use URIs (rather than URLs...which is the default).  True indicates that URIs will be used, and *no* URLStreamHandler will be registered for the associated protocol.  If false, URLs will be used and an URLStreamHandler will be registered for the given protocol factory.  NOTE:  If this flag is true, providers that attempt to access IFileID.getURL() may be unable to do so, since the URI may not be successfully parsed as a URL.
               </documentation>
            </annotation>
         </attribute>
      </complexType>
   </element>

   <annotation>
      <appInfo>
         <meta.section type="since"/>
      </appInfo>
      <documentation>
         1.0.0
      </documentation>
   </annotation>

   <annotation>
      <appInfo>
         <meta.section type="examples"/>
      </appInfo>
      <documentation>
         &lt;pre&gt;
   &lt;extension
         point=&quot;org.eclipse.ecf.provider.filetransfer.retrieveFileTransferProtocolFactory&quot;&gt;
      &lt;retrieveFileTransferProtocolFactory
            class=&quot;org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientRetrieveFileTransferFactory&quot;
            protocol=&quot;http&quot;
            priority=&quot;10&quot;&gt;
      &lt;/retrieveFileTransferProtocolFactory&gt;
      &lt;retrieveFileTransferProtocolFactory
            class=&quot;org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientRetrieveFileTransferFactory&quot;
            protocol=&quot;https&quot;&gt;
      &lt;/retrieveFileTransferProtocolFactory&gt;
   &lt;/extension&gt;

&lt;/pre&gt;
      </documentation>
   </annotation>

   <annotation>
      <appInfo>
         <meta.section type="apiInfo"/>
      </appInfo>
      <documentation>
         Here is the &lt;b&gt;org.eclipse.ecf.filetransfer.service.IRetrieveFileTransferFactory&lt;/b&gt;

&lt;pre&gt;
/**
 * Retrieve file transfer factory. This service interface is used by clients to
 * create a new IRetrieveFileTransfer instance.
 */
public interface IRetrieveFileTransferFactory {

 /**
  * Get new instance of IRetrieveFileTransfer.
  * 
  * @return IRetrieveFileTransfer for a given file transfer
  */
 public IRetrieveFileTransfer newInstance();

}
&lt;/pre&gt;
      </documentation>
   </annotation>

   <annotation>
      <appInfo>
         <meta.section type="implementation"/>
      </appInfo>
      <documentation>
         None
      </documentation>
   </annotation>

   <annotation>
      <appInfo>
         <meta.section type="copyright"/>
      </appInfo>
      <documentation>
         Copyright (c) 2004 Composent, Inc., IBM and others.
All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html.  Contributors:  Composent, Inc. - initial API and implementation, IBM, Inc. - Initial API and implementation
      </documentation>
   </annotation>

</schema>
