#include <Global/Main_Global.h>


/* Remember To Free The Memory That Is Beging Allocate In The Set Method.
   Perhaps Re-Install OM_DISPOSE
   */


SAVEDS ULONG _Get( struct IClass *cl, Object *obj, struct opGet *msg )
{
        /* Get variable values */

        struct SourceInstance *Data = INST_DATA( cl, obj );
        ULONG *Storage = msg->opg_Storage;

        switch( msg->opg_AttrID ) 
        {               
               case	MUIA_Source_File:	*Storage = Data->File;		return(TRUE);
               case	MUIA_Source_FileName:	*Storage = Data->FileName;	return(TRUE);
               case	MUIA_Source_FilePath:	*Storage = Data->FilePath;	return(TRUE);                     
        }

        return(DoSuperMethodA( cl, obj, msg ));
}        
SAVEDS ULONG _Set( struct IClass *cl, Object *obj, struct opSet *msg )
{
        struct SourceInstance *Data = INST_DATA( cl, obj );       
        struct TagItem  *Current_Tag;
        struct TagItem  *Single_Tag;
        
        Single_Tag = msg->ops_AttrList;
        
        while( Current_Tag = NextTagItem( &Single_Tag ) )
        {
                switch( Current_Tag->ti_Tag )
                {  
                 case MUIA_Source_File:                     
                       Data->File = Allocate_Memory(strlen(Current_Tag->ti_Data)+1);  		       
                       strncpy(Data->File,Current_Tag->ti_Data,strlen(Current_Tag->ti_Data));                      
                       Data->File[strlen(Data->File)+1]=NULL;
                       
                       Data->FileName = Allocate_Memory(strlen(FilePart(Current_Tag->ti_Data))+1);                                                                             
                       strncpy(Data->FileName,FilePart(Current_Tag->ti_Data),strlen(FilePart(Current_Tag->ti_Data)));                     
                       Data->FileName[strlen(Data->FileName)+1]=NULL;
                       
                       Data->FilePath = Allocate_Memory(strlen(Current_Tag->ti_Data)-strlen(FilePart(Current_Tag->ti_Data))+1);                                        
                       strncpy(Data->FilePath,Current_Tag->ti_Data,strlen(Current_Tag->ti_Data)-strlen(FilePart(Current_Tag->ti_Data)));                                                                
                       Data->FilePath[strlen(Data->FilePath)+1]=NULL;
                       
                      break;                                      
                 
                }
        }

        return(DoSuperMethodA( cl, obj, msg ));
}
                        


SAVEDS ULONG _Load(struct IClass *cl,Object *obj,Msg msg)
{
	struct	SourceInstance	*Data	=	INST_DATA(cl,obj);
	BPTR	FileHandle;
       
	FileHandle = Open(Data->File,MODE_OLDFILE);
        if(FileHandle)
        {
         printf("B4 Editor Load\n");
	 DoMethod(App->Editor,MUIM_Editor_Import,FileHandle,LOADMODE_ASCII);
	 Close(FileHandle);
        }
        else
         printf("Unable To Open %s For Loading\n",Data->File);
         
	return(DoSuperMethodA(cl,obj,msg));
}

SAVEDS ULONG _Save(struct IClass *cl,Object *obj,Msg msg)
{
        struct SourceInstance *Data = INST_DATA(cl,obj);
        
        BPTR    FileHandle;
        FileHandle = Open(Data->File,MODE_NEWFILE);
        if(FileHandle)
         {
         DoMethod(App->Editor,MUIM_Editor_Export,FileHandle,LOADMODE_ASCII);
         Close(FileHandle);
         }
         else
           printf("Unable To Open %s For Saving\n",Data->File);
        return(DoSuperMethodA(cl,obj,msg));

}
SAVEDS ULONG _New(struct IClass *cl,Object *obj,struct opSet *msg)
{
 struct SourceInstance *Data;
 
 if( (!(obj = (Object *)DoSuperMethodA(cl,obj,msg))))
    return(0);
    
 Data = INST_DATA(cl,obj);
 Data->File = NULL;
 Data->FileName = NULL;
 Data->FilePath = NULL;
 return(obj);

}
SAVEDS ULONG _Dispose(struct IClass *cl,Object *obj,Msg msg)
{
struct SourceInstance *Data = INST_DATA(cl,obj);



 if(Data->File)
   Free_Memory(Data->File);
 if(Data->FileName)
   Free_Memory(Data->FileName);
   
 if(Data->FilePath)
   Free_Memory(Data->FilePath);
   
return(DoSuperMethodA(cl,obj,msg));

}
SAVEDS ASM ULONG Source_Dispatcher(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
{
        switch (msg->MethodID)
        {
        	case OM_NEW	     : return(_New	(cl,obj,(APTR) msg));
        	case OM_DISPOSE      : return(_Dispose  (cl,obj,(APTR) msg));
                case OM_SET          : return(_Set      (cl,obj,(APTR) msg));
                case OM_GET          : return(_Get      (cl,obj,(APTR) msg));                                              
                case MUIM_Source_Save: return(_Save     (cl,obj,(APTR) msg));
                case MUIM_Source_Load: return(_Load	(cl,obj,(APTR) msg));
        }

        return(DoSuperMethodA(cl,obj,msg));
}

