--*****************************************************************************
-- Copyright (C) 2003 James E. Hopper. 
--
-- This is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation.
--
-- This software is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
--
-- You should have received a copy of the GNU General Public License
-- along with this software. If not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-
-- 1307, USA.
--
-- See the GPL in the COPYING.GPL file for more details.
--
-- AUTHOR: James E. Hopper (hopperj@macconnect.com)
--
--*****************************************************************************
with System; use type System.Address;
with ListenerManager;
--pragma Elaborate_All(ListenerManager);
with ProcessInterface;
--pragma Elaborate_All(ProcessInterface);
package body Ossim.Connectable.Source.Output.Imagewriter.File is

    function C_Object(the_Object : Object'class) return Void_Ptr;
    package WriteListener is new ListenerManager(Object, Create, C_Object);
        
    function Create(C_Object : Void_Ptr) return Object is
        the_Object : Object;
    begin
        the_Object.OssimObject:= C_Object;
        return the_Object;
    end Create;

    procedure SetFilename(Writer	: Object;
                          Filename 	: OssimString.Filename.Object) is
 
		procedure SetFilename(Writer	: Void_Ptr;
                                      Filename 	: Void_Ptr);
        pragma Import(C, SetFilename, "ossimSetFilename");

    begin
        SetFilename(Ossim.C_Object(Writer), ossimString.Filename.C_Object(Filename));
    end SetFilename;

    procedure SetFilename(  Writer 		: Object;
                            Filename 	: String) is

        procedure SetFilename(Writer	: Void_Ptr;
                              Filename 	: Void_Ptr);
        pragma Import(C, SetFilename, "ossimSetFilename");
		
        File 	  : String(Filename'first..Filename'last + 1) := Filename & ASCII.Nul;
        File_Name : OssimString.Object'class := OssimString.Create(File);
        
    begin
        SetFilename(Ossim.C_Object(Writer), OssimString.C_Object(File_Name));
    end SetFilename;

    function Is_Null(Writer : Object) return Boolean is
    begin
        return Ossim.C_Object(Writer) = System.Null_Address;
    end Is_Null;

    procedure Execute(Writer : Object) is

		procedure Execute(Writer : Void_Ptr);
		pragma import(C, Execute, "ossimExecuteImageFileWriter");
		
    begin
        Execute(Ossim.C_Object(Writer));
    end Execute;

    function AddListener(
            Writer		: Object;
            theListener : Listener.Process.StdOutProgress.Object) return Boolean is

    begin
        return WriteListener.AddListener(Writer, theListener);
    end AddListener;

    function AddListener(
            Writer 		: Object;
            theListener 	: Listener.Process.ProgressPercent.Object) return Boolean is

    begin
        return WriteListener.AddListener(Writer, theListener);
    end AddListener;

    function RemoveListener(
            Writer 		: Object;
            theListener 	: Listener.Process.StdOutProgress.Object) return Boolean is
    begin
        return WriteListener.RemoveListener(Writer, theListener);
    end RemoveListener;

    function RemoveListener(
            Writer 		: Object;
            theListener 	: Listener.Process.ProgressPercent.Object) return Boolean is
    begin
        return WriteListener.RemoveListener(Writer, theListener);
    end RemoveListener;

    function GetNumberImageType(TheList : OssimString.StringList) return ossim_uint32 is
    begin
        return OssimString.GetNumberItems(TheList);
    end GetNumberImageType;

    function GetImageType(TheList : OssimString.StringList;
            Index : ossim_uint32) return String is
    begin
        return OssimString.GetossimString(TheList, Index);
    end GetImageType;

    procedure SetOutputName(
            Writer 	: Object;
            OutputName	: String) is

        procedure SetOutputName(
            Writer 	: Void_Ptr;
            OutputName	: System.Address);
        pragma Import(C, SetOutputName, "setOutputName");

        OutputName_Null : String(OutputName'First..OutputName'Last + 1) :=
            OutputName & ASCII.Nul;

    begin
        SetOutputName(Ossim.C_Object(Writer), OutputName_Null'Address);
    end SetOutputName;

	procedure Writer_Abort(Writer : Object) is
	
		procedure Writer_Abort(Writer : Void_Ptr);
        pragma Import(C, Writer_Abort, "ossimFileWrighterAbort");
		
	begin
		Writer_Abort(Ossim.C_Object(Writer));
	end Writer_Abort;

    procedure Free(Handler : Object) is

        procedure Free(Handler : Void_Ptr);
        pragma Import(C, Free, "ossimFreeObject");

    begin
        Free(Handler.OssimObject);
    end Free;

    function C_Object(the_Object : Object'class) return Void_Ptr is
    begin
        return the_Object.OssimObject;
    end C_Object;

end Ossim.Connectable.Source.Output.Imagewriter.File;