home *** CD-ROM | disk | FTP | other *** search
- /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- -- EasyPlayer, EYP, Ralph Debusmann 1997-9
- */
-
- OPT MODULE
- OPT EXPORT
- OPT PREPROCESS
-
- MODULE 'exec/tasks','dos/dos','dos/dosextens','dos/dostags',
- '*easyconst','*easystructs','*modules/strings','*modules/reqs'
-
- OBJECT interface
- intinfo:PTR TO interfaceinfo,
- modname[FULL]:ARRAY,
- header[HEADER]:ARRAY,
- songnum,
- numsongs
- ENDOBJECT
-
- PROC interface(intinfo:PTR TO interfaceinfo,modname,debug=FALSE) OF interface
- DEF intinfo2:PTR TO interfaceinfo,songnumlen,numsongslen
- NEW intinfo2
- CopyMem(intinfo,intinfo2,SIZEOF interfaceinfo)
- self.intinfo:=intinfo2
-
- strcopy(self.modname,modname)
- IF intinfo2.songs
- self.readheader()
- songnumlen:=intinfo2.songnumlen
- SELECT songnumlen
- CASE 0 ; self.songnum:=0
- CASE 1 ; self.songnum:=Char(self.header+intinfo2.songnumoffset)
- CASE 2 ; self.songnum:=Int(self.header+intinfo2.songnumoffset)
- CASE 4 ; self.songnum:=Long(self.header+intinfo2.songnumoffset)
- ENDSELECT
- numsongslen:=intinfo2.numsongslen
- SELECT numsongslen
- CASE 0 ; self.numsongs:=1
- CASE 1 ; self.numsongs:=Char(self.header+intinfo2.numsongsoffset)
- CASE 2 ; self.numsongs:=Int(self.header+intinfo2.numsongsoffset)
- CASE 4 ; self.numsongs:=Long(self.header+intinfo2.numsongsoffset)
- ENDSELECT
- self.songnum:=self.songnum+intinfo2.songnumadd
- self.numsongs:=self.numsongs+intinfo2.numsongsadd
- IF debug
- PrintF('songnum: \d (added \d), numsongs: \d (added \d)\n',self.songnum,intinfo2.songnumadd,self.numsongs,intinfo2.numsongsadd)
- ENDIF
- ENDIF
- ENDPROC
-
- PROC end() OF interface
- self.stop()
- END self.intinfo
- ENDPROC
-
- PROC start(debug=FALSE) OF interface HANDLE
- DEF command[256]:STRING,songnum[SONGARG]:STRING,input,i=0
- StrCopy(command,'"')
- StrAdd(command,self.intinfo.progname)
- StrAdd(command,'" ')
- IF self.intinfo.progargs[0]
- StrAdd(command,self.intinfo.progargs)
- StrAdd(command,' ')
- ENDIF
- IF self.intinfo.quotes THEN StrAdd(command,'"')
- StrAdd(command,self.modname)
- IF self.intinfo.quotes THEN StrAdd(command,'"')
- IF self.intinfo.songs
- StringF(songnum,' \s\d',self.intinfo.songarg,self.songnum)
- StrAdd(command,songnum)
- ENDIF
- input:=Open(self.intinfo.console,MODE_NEWFILE)
- IF debug THEN PrintF('command: \s\n',command)
- SystemTagList(command,[SYS_ASYNCH,TRUE,SYS_INPUT,input,SYS_OUTPUT,NIL,0])
- WHILE self.findproc(self.intinfo.progname)=NIL
- Delay(1)
- i++
- IF i>100 THEN Raise(ERR_LAUNCH)
- ENDWHILE
- EXCEPT
- SELECT exception
- CASE ERR_WIN
- errorreq('Couldn''t open specified console window.','interface.start')
- ENDSELECT
- ReThrow()
- ENDPROC
-
- PROC stop() OF interface HANDLE
- DEF process,i=0
- IF (process:=self.findproc(self.intinfo.progname))<>NIL
- Signal(process,SIGBREAKF_CTRL_C)
- WHILE (process:=self.findproc(self.intinfo.progname))<>NIL
- Signal(process,SIGBREAKF_CTRL_C)
- Delay(1)
- i++
- IF i>100 THEN Raise(ERR_BREAK)
- ENDWHILE
- ENDIF
- EXCEPT
- SELECT exception
- CASE ERR_BREAK
- errorreq('Couldn''t break player program.','interface.stop')
- ENDSELECT
- ENDPROC
-
- PROC running() OF interface
- IF self.intinfo.filter THEN BSET #1,$BFE001
- ENDPROC (self.findproc(self.intinfo.progname)<>NIL)
-
- PROC findproc(procname) OF interface
- DEF proclen,proc:PTR TO process,cli:PTR TO commandlineinterface,commandname:PTR TO CHAR,i=1,found=NIL,max
- proclen:=StrLen(procname)
- max:=MaxCli()
- Forbid()
- REPEAT
- IF proc:=FindCliProc(i)
- IF (cli:=BADDR(proc.cli))
- commandname:=BADDR(cli.commandname)
- IF commandname[0]=proclen
- IF StrCmp(commandname+1,procname,proclen)
- found:=proc
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- i++
- UNTIL i>max OR found
- Permit()
- ENDPROC found
-
- PROC readheader() OF interface HANDLE
- DEF fh=NIL
- IF (fh:=Open(self.modname,MODE_OLDFILE))=FALSE THEN Raise(ERR_OPENR)
- IF Read(fh,self.header,HEADER)=0 THEN Raise(ERR_READ)
- IF fh THEN Close(fh)
- EXCEPT
- SELECT exception
- CASE ERR_OPENR
- errorreq('Couldn''t open "%s".','interface.readheader',[self.modname])
- CASE ERR_READ
- errorreq('Couldn''t read "%s"''s module header.','interface.readheader',[self.modname])
- ENDSELECT
- IF fh THEN Close(fh)
- ENDPROC
-