home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC7.DMS / in.adf / classsource.lha / ClassSource / Exec / Devices / devices.c
Encoding:
C/C++ Source or Header  |  1995-02-12  |  5.1 KB  |  282 lines

  1. #include <classes/Exec/devices.h>
  2.  
  3. #include <exec/memory.h>
  4. #include <String.h>
  5.  
  6. #include <pragma/exec_lib.h>
  7.  
  8. /*
  9.  
  10. Der Kopierkonstruktor und der Zuweisungsoperator benutzen das Attribut opened
  11. um festzustellen, ob das Device schon geöffnet ist (!opened.only()).
  12.  
  13. Ist das Device schon geöffnet, werden weitere Öffnungsversuche unterbunden,
  14. und das Schließen wird nur von der Instanz erlaubt, die das Device auch
  15. geöffnet hat.
  16.  
  17. Ist das Device beim Kopieren noch nicht geöffnet, kann durch die neue Kopie
  18. und durch die alte das Device geöffnet und geschlossen werden, die Kontrolle
  19. findet dann unabhängig voneinander statt.
  20.  
  21. */
  22.  
  23. IORequestC::IORequestC(ULONG size)
  24.     : PortC(), copied(FALSE), opened()
  25. {
  26.     requestsize = size;
  27.     iorequest = (struct IORequest *) CreateIORequest(port(),requestsize);
  28.     if (!iorequest)
  29.         throw MemoryX(requestsize,MEMF_PUBLIC);
  30.     send = FALSE;
  31.     closed = TRUE;
  32. }
  33.  
  34. IORequestC::IORequestC(const IORequestC &s)
  35.     : PortC(s), copied(TRUE)
  36. {
  37.     requestsize = s.requestsize;
  38.     iorequest = (struct IORequest *) AllocMem(requestsize,MEMF_PUBLIC);
  39.     if (!iorequest)
  40.         throw MemoryX(requestsize,MEMF_PUBLIC);
  41.     memcpy(iorequest,s.iorequest,requestsize);
  42.     // Für das Attribut opened hat only() die Bedeutung von Device geschlossen
  43.     if (s.opened.only())
  44.         // Falls dem so ist, lege ich eine neue Instanz davon an,
  45.         opened = ShareManualC()
  46.     else {
  47.         // ansonsten wird nur eine weitere Referenz darauf genommen
  48.         opened = s.opened;
  49.         opened.reference();
  50.     };
  51.     send = FALSE;
  52.     closed = TRUE;
  53. }
  54.  
  55. IORequestC::~IORequestC()
  56. {
  57.     close();
  58.     if (iorequest)
  59.     {
  60.         if (!copied)
  61.             DeleteIORequest(iorequest);
  62.         else
  63.             FreeMem(iorequest,requestsize);
  64.     };
  65. }
  66.  
  67. IORequestC &IORequestC::operator = (const IORequestC &s)
  68. {
  69.     if (this != &s)
  70.     {
  71.         close();
  72.         if (iorequest)
  73.         {
  74.             if (!copied)
  75.                 DeleteIORequest(iorequest);
  76.             else
  77.                 FreeMem(iorequest,requestsize);
  78.         };
  79.         copied = TRUE;
  80.         PortC::operator=(s);
  81.         requestsize = s.requestsize;
  82.         iorequest = (struct IORequest *) AllocMem(requestsize,MEMF_PUBLIC);
  83.         if (!iorequest)
  84.             throw MemoryX(requestsize,MEMF_PUBLIC);
  85.         memcpy(iorequest,s.iorequest,requestsize);
  86.         // Für das Attribut opened hat only() die Bedeutung von Device geschlossen
  87.         if (s.opened.only())
  88.             // Falls dem so ist, lege ich eine neue Instanz davon an,
  89.             opened = ShareManualC()
  90.         else {
  91.             // ansonsten wird nur eine weitere Referenz darauf genommen
  92.             opened = s.opened;
  93.             opened.reference();
  94.         };
  95.         send = FALSE;
  96.         closed = TRUE;
  97.     };
  98.     return *this;
  99. }
  100.  
  101. BYTE IORequestC::error() const
  102. {
  103.     return iorequest->io_Error
  104. }
  105.  
  106. BYTE IORequestC::open(STRPTR name, ULONG unit, ULONG flags)
  107. {
  108.     if (opened.only())
  109.     {
  110.         BYTE r = OpenDevice(name,unit,iorequest,flags);
  111.         if (r == 0)
  112.         {
  113.             opened.reference();
  114.             closed = FALSE;
  115.         };
  116.         return r;
  117.     };
  118.     return IOERR_OPENFAIL;
  119. }
  120.  
  121. VOID IORequestC::close()
  122. {
  123.     if (!closed)
  124.     {
  125.         abortIO();
  126.         waitIO();
  127.         opened.dereference();
  128.         closed = TRUE;
  129.         if (opened.only())
  130.             CloseDevice(iorequest);
  131.     };
  132. }
  133.  
  134. BYTE IORequestC::doIO()
  135. {
  136.     if (isOpen() && !send)
  137.         return DoIO(iorequest);
  138.     return IOERR_OPENFAIL;
  139. }
  140.  
  141. BYTE IORequestC::doIO(UWORD command)
  142. {
  143.     if (isOpen() && !send)
  144.     {
  145.         iorequest->io_Command = command;
  146.         return DoIO(iorequest);
  147.     };
  148.     return IOERR_OPENFAIL;
  149. }
  150.  
  151. VOID IORequestC::sendIO()
  152. {
  153.     if (isOpen() && !send)
  154.     {
  155.         send = TRUE;
  156.         SendIO(iorequest);
  157.     };
  158. }
  159.  
  160. VOID IORequestC::sendIO(UWORD command)
  161. {
  162.     if (isOpen() && !send)
  163.     {
  164.         iorequest->io_Command = command;
  165.         send = TRUE;
  166.         SendIO(iorequest);
  167.     };
  168. }
  169.  
  170. BOOL IORequestC::checkIO()
  171. {
  172.     if (send)
  173.     {
  174.         BOOL b = CheckIO(iorequest) != NULL;
  175.         if (b)
  176.             send = FALSE;
  177.         return b;
  178.     };
  179.     return TRUE;
  180. }
  181.  
  182. BYTE IORequestC::waitIO()
  183. {
  184.     if (send)
  185.     {
  186.         send = FALSE;
  187.         return WaitIO(iorequest);
  188.     };
  189.     return IOERR_OPENFAIL;
  190. }
  191.  
  192. VOID IORequestC::abortIO()
  193. {
  194.     if (send)
  195.         AbortIO(iorequest);
  196. }
  197.  
  198. // *************************************************************
  199.  
  200. IOStdRequestC::IOStdRequestC(ULONG size)
  201.     : IORequestC(size)
  202. {
  203. }
  204.  
  205. IOStdRequestC::IOStdRequestC(const IOStdRequestC &s)
  206. {
  207. }
  208.  
  209. IOStdRequestC::~IOStdRequestC()
  210. {
  211. }
  212.  
  213. IOStdRequestC &IOStdRequestC::operator= (const IOStdRequestC &s)
  214. {
  215.     if (this != &s)
  216.     {
  217.         IORequestC::operator=(s);
  218.     };
  219.     return *this;
  220. }
  221.  
  222. ULONG IOStdRequestC::actual() const
  223. {
  224.     return request()->io_Actual;
  225. }
  226.  
  227. BYTE IOStdRequestC::doIO(UWORD command, ULONG length, APTR data)
  228. {
  229.     IOStdReq *r = request();
  230.     if (!isSend())
  231.     {
  232.         r->io_Command = command;
  233.         r->io_Length = length;
  234.         r->io_Data = data;
  235.         return IORequestC::doIO();
  236.     };
  237.     return IOERR_OPENFAIL;
  238. }
  239.  
  240. BYTE IOStdRequestC::doIO(UWORD command, ULONG length,
  241.     APTR data, ULONG offset)
  242. {
  243.     IOStdReq *r = request();
  244.     if (!isSend())
  245.     {
  246.         r->io_Command = command;
  247.         r->io_Length = length;
  248.         r->io_Data = data;
  249.         r->io_Offset = offset;
  250.         return IORequestC::doIO();
  251.     };
  252.     return IOERR_OPENFAIL;
  253. }
  254.  
  255. VOID IOStdRequestC::sendIO(UWORD command, ULONG length, APTR data)
  256. {
  257.     IOStdReq *r = request();
  258.     if (!isSend())
  259.     {
  260.         r->io_Command = command;
  261.         r->io_Length = length;
  262.         r->io_Data = data;
  263.         IORequestC::sendIO();
  264.     };
  265. }
  266.  
  267. VOID IOStdRequestC::sendIO(UWORD command, ULONG length,
  268.     APTR data, ULONG offset)
  269. {
  270.     IOStdReq *r = request();
  271.     if (!isSend())
  272.     {
  273.         r->io_Command = command;
  274.         r->io_Length = length;
  275.         r->io_Data = data;
  276.         r->io_Offset = offset;
  277.         IORequestC::sendIO();
  278.     };
  279. }
  280.  
  281. // ***************************************************************
  282.