//File: CosFileTransfer.idl 
#ifndef _COS_FILE_TRANSFER_IDL_ 
#define _COS_FILE_TRANSFER_IDL_ 

#include <CosProperty.idl> 
#pragma prefix "omg.org" 

module CosFileTransfer { 
  
  typedef string Istring; 
  typedef Istring ProtocolAddress; 
  typedef long ContentType; 

  const ContentType FTAM_1  = 1; 
  const ContentType FTAM_2  = 2; 
  const ContentType FTAM_3  = 3; 
  const ContentType FTAM_4  = 4; 
  const ContentType FTAM_5  = 5; 
  const ContentType NBS_9   = 6; 
  const ContentType INTAP_1 = 7; 
  
  exception CommandNotImplementedException { Istring reason; }; 
  exception SessionException { Istring reason; }; 
  exception TransferException { Istring reason; }; 
  exception FileNotFoundException { Istring reason; };
  exception RequestFailureException { Istring reason; }; 
  exception IllegalOperationException { Istring reason; }; 

  interface VirtualFileSystem; 

  struct AccessLevel { 
    boolean read; 
    boolean insert; 
    boolean replace; 
    boolean extend; 
    boolean erase; 
    boolean read_attr; 
    boolean change_attr; 
    boolean delete; 
  }; 

  typedef sequence<ProtocolAddress> ProtocolAddressList; 
  
  struct ProtocolSupport { 
    Istring protocol_name; 
    ProtocolAddressList addresses; 
  }; 

  typedef sequence<ProtocolSupport> SupportedProtocolAddresses; 

  interface Directory; 
  interface FileTransferSession; 

  typedef Istring FileName; 
  typedef sequence<FileName> FileNameList; 

  interface File:CosPropertyService::PropertySetDef { 

    readonly attribute FileName name;
    readonly attribute FileNameList complete_file_name; 
    readonly attribute Directory parent; 
    readonly attribute FileTransferSession associated_session; 

  }; 

  enum FileType {nfile, ndirectory}; 
  
  struct FileWrapper { 
    File the_file; 
    FileType file_type; 
  }; 

  typedef sequence<FileWrapper> FileList; 

  interface FileIterator; 
  interface Directory : File { 

    void list(in unsigned long how_many, out FileList fl, out FileIterator fi); 

  }; 

  interface FileIterator { 
    
    boolean next_one(out FileWrapper f); 
    boolean next_n(in unsigned long how_many, out FileList fl); 

    void destroy(); 
  }; 

  interface FileTransferSession { 

    readonly attribute SupportedProtocolAddresses protocols_supported; 

    void set_directory(in Directory new_directory) 
      raises(SessionException, FileNotFoundException, RequestFailureException, 
	     IllegalOperationException); 

    File create_file(in FileNameList name) 
      raises(SessionException, FileNotFoundException, RequestFailureException, 
	     IllegalOperationException);

    Directory create_directory(in FileNameList name) 
      raises(SessionException, FileNotFoundException, RequestFailureException, 
	     IllegalOperationException); 

    FileWrapper get_file(in FileNameList complete_file_name) 
      raises(SessionException, FileNotFoundException, RequestFailureException, 
	     IllegalOperationException); 

    void delete(in File file) 
      raises(SessionException, FileNotFoundException, RequestFailureException,
	     IllegalOperationException); 

    void transfer(in File src, in File dest) 
      raises(SessionException, TransferException, FileNotFoundException, 
	     RequestFailureException, IllegalOperationException); 

    void append(in File src, in File dest) 
      raises(CommandNotImplementedException, SessionException, TransferException, 
	     FileNotFoundException, RequestFailureException, 
	     IllegalOperationException); 

    void insert(in File src, in File dest, in long offset) 
      raises(CommandNotImplementedException, SessionException, TransferException, 
	     FileNotFoundException, RequestFailureException, 
	     IllegalOperationException); 

    void logout();
    
    // WARNING!!!
    // Theses are Orber specific operations and may only be used internally!!
    // Maybe removed, altered and changed in any way without warning!!
    Directory oe_orber_create_directory_current() 
      raises(SessionException, FileNotFoundException, IllegalOperationException); 
    FileList oe_orber_get_content(in FileNameList complete_file_name,
				  in Directory parent); 
    long oe_orber_count_children(in FileNameList complete_file_name); 

  }; 

  interface VirtualFileSystem { 

    enum NativeFileSystemType { FTAM, FTP, NATIVE }; 

    readonly attribute NativeFileSystemType file_system_type; 

    typedef sequence<ContentType> ContentList; 
    
    readonly attribute ContentList supported_content_types; 

    FileTransferSession login(in Istring username, in Istring password, 
			      in Istring account, out Directory root) 
      raises(SessionException, FileNotFoundException, IllegalOperationException); 
  }; 
}; 

#endif //_COS_FILE_TRANSFER_IDL_