1 /* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 2008-2009, Axel Dörfler, axeld@pinc-software.de. 4 * Distributed under the terms of the MIT License. 5 */ 6 7 8 #include "AbstractModuleDevice.h" 9 10 #include "IORequest.h" 11 12 13 AbstractModuleDevice::AbstractModuleDevice() 14 : 15 fNode(NULL), 16 fInitialized(0), 17 fDeviceModule(NULL), 18 fDeviceData(NULL) 19 { 20 } 21 22 23 AbstractModuleDevice::~AbstractModuleDevice() 24 { 25 } 26 27 28 bool 29 AbstractModuleDevice::HasSelect() const 30 { 31 return Module()->select != NULL; 32 } 33 34 35 bool 36 AbstractModuleDevice::HasDeselect() const 37 { 38 return Module()->deselect != NULL; 39 } 40 41 42 bool 43 AbstractModuleDevice::HasRead() const 44 { 45 return Module()->read != NULL; 46 } 47 48 49 bool 50 AbstractModuleDevice::HasWrite() const 51 { 52 return Module()->write != NULL; 53 } 54 55 56 bool 57 AbstractModuleDevice::HasIO() const 58 { 59 return Module()->io != NULL; 60 } 61 62 63 status_t 64 AbstractModuleDevice::Open(const char* path, int openMode, void** _cookie) 65 { 66 return Module()->open(Data(), path, openMode, _cookie); 67 } 68 69 70 status_t 71 AbstractModuleDevice::_DoIO(void* cookie, off_t pos, 72 void* buffer, size_t* _length, bool isWrite) 73 { 74 IORequest request; 75 status_t status = request.Init(pos, (addr_t)buffer, *_length, isWrite, 0); 76 if (status != B_OK) 77 return status; 78 79 status = IO(cookie, &request); 80 if (status != B_OK) 81 return status; 82 83 status = request.Wait(0, 0); 84 *_length = request.TransferredBytes(); 85 return status; 86 } 87 88 89 status_t 90 AbstractModuleDevice::Read(void* cookie, off_t pos, void* buffer, size_t* _length) 91 { 92 if (Module()->read == NULL) { 93 if (Module()->io == NULL) 94 return BaseDevice::Read(cookie, pos, buffer, _length); 95 96 return _DoIO(cookie, pos, buffer, _length, false); 97 } 98 return Module()->read(cookie, pos, buffer, _length); 99 } 100 101 102 status_t 103 AbstractModuleDevice::Write(void* cookie, off_t pos, const void* buffer, size_t* _length) 104 { 105 if (Module()->write == NULL) { 106 if (Module()->io == NULL) 107 return BaseDevice::Write(cookie, pos, buffer, _length); 108 109 return _DoIO(cookie, pos, const_cast<void*>(buffer), _length, true); 110 } 111 return Module()->write(cookie, pos, buffer, _length); 112 } 113 114 115 status_t 116 AbstractModuleDevice::IO(void* cookie, io_request* request) 117 { 118 if (Module()->io == NULL) 119 return BaseDevice::IO(cookie, request); 120 return Module()->io(cookie, request); 121 } 122 123 124 status_t 125 AbstractModuleDevice::Control(void* cookie, int32 op, void* buffer, size_t length) 126 { 127 if (Module()->control == NULL) 128 return BaseDevice::Control(cookie, op, buffer, length); 129 return Module()->control(cookie, op, buffer, length); 130 } 131 132 133 status_t 134 AbstractModuleDevice::Select(void* cookie, uint8 event, selectsync* sync) 135 { 136 if (Module()->select == NULL) 137 return BaseDevice::Select(cookie, event, sync); 138 return Module()->select(cookie, event, sync); 139 } 140 141 142 status_t 143 AbstractModuleDevice::Deselect(void* cookie, uint8 event, selectsync* sync) 144 { 145 if (Module()->deselect == NULL) 146 return BaseDevice::Deselect(cookie, event, sync); 147 return Module()->deselect(cookie, event, sync); 148 } 149 150 151 status_t 152 AbstractModuleDevice::Close(void* cookie) 153 { 154 return Module()->close(cookie); 155 } 156 157 158 status_t 159 AbstractModuleDevice::Free(void* cookie) 160 { 161 return Module()->free(cookie); 162 } 163