home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaMiscModsCD3.iso / _PROGRAMME / PLAYER / GUI / EasyPlayer.lha / EYP / Source / easyinterface.e < prev    next >
Encoding:
Text File  |  1999-09-25  |  4.0 KB  |  145 lines

  1. /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  2. -- EasyPlayer, EYP, Ralph Debusmann 1997-9
  3. */
  4.  
  5. OPT MODULE
  6. OPT EXPORT
  7. OPT PREPROCESS
  8.  
  9. MODULE 'exec/tasks','dos/dos','dos/dosextens','dos/dostags',
  10. '*easyconst','*easystructs','*modules/strings','*modules/reqs'
  11.  
  12. OBJECT interface
  13.     intinfo:PTR TO interfaceinfo,
  14.     modname[FULL]:ARRAY,
  15.     header[HEADER]:ARRAY,
  16.     songnum,
  17.     numsongs
  18. ENDOBJECT
  19.  
  20. PROC interface(intinfo:PTR TO interfaceinfo,modname,debug=FALSE) OF interface
  21. DEF intinfo2:PTR TO interfaceinfo,songnumlen,numsongslen
  22.     NEW intinfo2
  23.     CopyMem(intinfo,intinfo2,SIZEOF interfaceinfo)
  24.     self.intinfo:=intinfo2
  25.  
  26.     strcopy(self.modname,modname)
  27.     IF intinfo2.songs
  28.         self.readheader()
  29.         songnumlen:=intinfo2.songnumlen
  30.         SELECT songnumlen
  31.             CASE 0 ; self.songnum:=0
  32.             CASE 1 ; self.songnum:=Char(self.header+intinfo2.songnumoffset)
  33.             CASE 2 ; self.songnum:=Int(self.header+intinfo2.songnumoffset)
  34.             CASE 4 ; self.songnum:=Long(self.header+intinfo2.songnumoffset)
  35.         ENDSELECT
  36.         numsongslen:=intinfo2.numsongslen
  37.         SELECT numsongslen
  38.             CASE 0 ; self.numsongs:=1
  39.             CASE 1 ; self.numsongs:=Char(self.header+intinfo2.numsongsoffset)
  40.             CASE 2 ; self.numsongs:=Int(self.header+intinfo2.numsongsoffset)
  41.             CASE 4 ; self.numsongs:=Long(self.header+intinfo2.numsongsoffset)
  42.         ENDSELECT
  43.         self.songnum:=self.songnum+intinfo2.songnumadd
  44.         self.numsongs:=self.numsongs+intinfo2.numsongsadd
  45.         IF debug
  46.             PrintF('songnum: \d (added \d), numsongs: \d (added \d)\n',self.songnum,intinfo2.songnumadd,self.numsongs,intinfo2.numsongsadd)
  47.         ENDIF
  48.     ENDIF
  49. ENDPROC
  50.  
  51. PROC end() OF interface
  52.     self.stop()
  53.     END self.intinfo
  54. ENDPROC
  55.  
  56. PROC start(debug=FALSE) OF interface HANDLE
  57. DEF command[256]:STRING,songnum[SONGARG]:STRING,input,i=0
  58.     StrCopy(command,'"')
  59.     StrAdd(command,self.intinfo.progname)
  60.     StrAdd(command,'" ')
  61.     IF self.intinfo.progargs[0]
  62.         StrAdd(command,self.intinfo.progargs)
  63.         StrAdd(command,' ')
  64.     ENDIF
  65.     IF self.intinfo.quotes THEN StrAdd(command,'"')
  66.     StrAdd(command,self.modname)
  67.     IF self.intinfo.quotes THEN StrAdd(command,'"')
  68.     IF self.intinfo.songs
  69.         StringF(songnum,' \s\d',self.intinfo.songarg,self.songnum)
  70.         StrAdd(command,songnum)
  71.     ENDIF
  72.     input:=Open(self.intinfo.console,MODE_NEWFILE)
  73.     IF debug THEN PrintF('command: \s\n',command)
  74.     SystemTagList(command,[SYS_ASYNCH,TRUE,SYS_INPUT,input,SYS_OUTPUT,NIL,0])
  75.     WHILE self.findproc(self.intinfo.progname)=NIL
  76.         Delay(1)
  77.         i++
  78.         IF i>100 THEN Raise(ERR_LAUNCH)
  79.     ENDWHILE
  80. EXCEPT
  81.     SELECT exception
  82.         CASE ERR_WIN
  83.             errorreq('Couldn''t open specified console window.','interface.start')
  84.     ENDSELECT
  85.     ReThrow()
  86. ENDPROC
  87.  
  88. PROC stop() OF interface HANDLE
  89. DEF process,i=0
  90.     IF (process:=self.findproc(self.intinfo.progname))<>NIL
  91.         Signal(process,SIGBREAKF_CTRL_C)
  92.         WHILE (process:=self.findproc(self.intinfo.progname))<>NIL
  93.             Signal(process,SIGBREAKF_CTRL_C)
  94.             Delay(1)
  95.             i++
  96.             IF i>100 THEN Raise(ERR_BREAK)
  97.         ENDWHILE
  98.     ENDIF
  99. EXCEPT
  100.     SELECT exception
  101.         CASE ERR_BREAK
  102.             errorreq('Couldn''t break player program.','interface.stop')
  103.     ENDSELECT
  104. ENDPROC
  105.  
  106. PROC running() OF interface
  107.     IF self.intinfo.filter THEN BSET #1,$BFE001
  108. ENDPROC (self.findproc(self.intinfo.progname)<>NIL)
  109.  
  110. PROC findproc(procname) OF interface
  111. DEF proclen,proc:PTR TO process,cli:PTR TO commandlineinterface,commandname:PTR TO CHAR,i=1,found=NIL,max
  112.     proclen:=StrLen(procname)
  113.     max:=MaxCli()
  114.     Forbid()
  115.     REPEAT
  116.         IF proc:=FindCliProc(i)
  117.             IF (cli:=BADDR(proc.cli))
  118.                 commandname:=BADDR(cli.commandname)
  119.                 IF commandname[0]=proclen
  120.                     IF StrCmp(commandname+1,procname,proclen)
  121.                         found:=proc
  122.                     ENDIF
  123.                 ENDIF
  124.             ENDIF
  125.         ENDIF
  126.         i++
  127.     UNTIL i>max OR found
  128.     Permit()
  129. ENDPROC found
  130.  
  131. PROC readheader() OF interface HANDLE
  132. DEF fh=NIL
  133.     IF (fh:=Open(self.modname,MODE_OLDFILE))=FALSE THEN Raise(ERR_OPENR)
  134.     IF Read(fh,self.header,HEADER)=0 THEN Raise(ERR_READ)
  135.     IF fh THEN Close(fh)
  136. EXCEPT
  137.     SELECT exception
  138.         CASE ERR_OPENR
  139.             errorreq('Couldn''t open "%s".','interface.readheader',[self.modname])
  140.         CASE ERR_READ
  141.             errorreq('Couldn''t read "%s"''s module header.','interface.readheader',[self.modname])
  142.     ENDSELECT
  143.     IF fh THEN Close(fh)
  144. ENDPROC
  145.