* Get rid of owner, BIOS devices don't need open/close.
* split Handle class to CharHandle and BlockHandle. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23366 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
78843897fc
commit
6f9e265157
@ -11,10 +11,20 @@
|
|||||||
#include "Handle.h"
|
#include "Handle.h"
|
||||||
#include "toscalls."
|
#include "toscalls."
|
||||||
|
|
||||||
Handle::Handle(int handle, bool takeOwnership)
|
/*
|
||||||
|
* (X)BIOS supports char and block devices with a separate namespace
|
||||||
|
* for char devs handle is {DEV_PRINTER, ... DEV_CONSOLE, ...}
|
||||||
|
* for block devs handle is the drive number.
|
||||||
|
* BlockHandle is in devices.cpp
|
||||||
|
*
|
||||||
|
* XXX: handle network devices ? not sure how TOS net extensions do this
|
||||||
|
* not sure it'll ever be supported anyway.
|
||||||
|
* XXX: BIOSDrive/BIOSHandle : public BlockHandle ?
|
||||||
|
*/
|
||||||
|
|
||||||
|
Handle::Handle(int handle)
|
||||||
:
|
:
|
||||||
fHandle((int16)handle),
|
fHandle((int16)handle),
|
||||||
fOwnHandle(takeOwnership)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,24 +38,61 @@ Handle::Handle(void)
|
|||||||
|
|
||||||
Handle::~Handle()
|
Handle::~Handle()
|
||||||
{
|
{
|
||||||
//if (fOwnHandle)
|
|
||||||
// of_close(fHandle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Handle::SetHandle(int handle, bool takeOwnership)
|
Handle::SetHandle(int handle)
|
||||||
{
|
{
|
||||||
//if (fHandle && fOwnHandle)
|
|
||||||
// of_close(fHandle);
|
|
||||||
|
|
||||||
fHandle = (int16)handle;
|
fHandle = (int16)handle;
|
||||||
fOwnHandle = takeOwnership;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
Handle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
Handle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
Handle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
off_t
|
||||||
|
Handle::Size() const
|
||||||
|
{
|
||||||
|
// ToDo: fix this!
|
||||||
|
return 1024LL * 1024 * 1024 * 1024;
|
||||||
|
// 1024 GB
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
CharHandle::CharHandle(int handle)
|
||||||
|
: Handle(handle)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CharHandle::CharHandle(void)
|
||||||
|
: Handle()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CharHandle::~CharHandle()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
CharHandle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
||||||
{
|
{
|
||||||
const char *string = (const char *)buffer;
|
const char *string = (const char *)buffer;
|
||||||
|
|
||||||
@ -61,7 +108,79 @@ Handle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
|||||||
|
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
Handle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
|
CharHandle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
const char *string = (const char *)buffer;
|
||||||
|
|
||||||
|
// can't seek
|
||||||
|
|
||||||
|
//XXX: check Bcostat ?
|
||||||
|
for (i = 0; i < bufferSize; i++) {
|
||||||
|
Bconout(fHandle, string[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
off_t
|
||||||
|
CharHandle::Size() const
|
||||||
|
{
|
||||||
|
// ToDo: fix this!
|
||||||
|
return 1024LL * 1024 * 1024 * 1024;
|
||||||
|
// 1024 GB
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
BlockHandle::BlockHandle(int handle)
|
||||||
|
: Handle(handle)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BlockHandle::BlockHandle(void)
|
||||||
|
: Handle()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BlockHandle::~BlockHandle()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BlockHandle::InitCheck() const
|
||||||
|
{
|
||||||
|
uint32 map = Drvmap();
|
||||||
|
if (!(map & (1 << fHandle)))
|
||||||
|
return ENODEV;
|
||||||
|
//XXX: check size
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
BlockHandle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
const char *string = (const char *)buffer;
|
||||||
|
|
||||||
|
// can't seek
|
||||||
|
for (i = 0; i < bufferSize; i++) {
|
||||||
|
if (Bconstat(fHandle) == 0)
|
||||||
|
return i;
|
||||||
|
string[i] = (char)Bconin(fHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
BlockHandle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
|
||||||
{
|
{
|
||||||
const char *string = (const char *)buffer;
|
const char *string = (const char *)buffer;
|
||||||
|
|
||||||
@ -75,10 +194,11 @@ Handle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
|
|||||||
|
|
||||||
|
|
||||||
off_t
|
off_t
|
||||||
Handle::Size() const
|
BlockHandle::Size() const
|
||||||
{
|
{
|
||||||
// ToDo: fix this!
|
// ToDo: fix this!
|
||||||
return 1024LL * 1024 * 1024 * 1024;
|
return 1024LL * 1024 * 1024 * 1024;
|
||||||
// 1024 GB
|
// 1024 GB
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,11 +13,11 @@
|
|||||||
|
|
||||||
class Handle : public ConsoleNode {
|
class Handle : public ConsoleNode {
|
||||||
public:
|
public:
|
||||||
Handle(int handle, bool takeOwnership = true);
|
Handle(int handle);
|
||||||
Handle();
|
Handle();
|
||||||
virtual ~Handle();
|
virtual ~Handle();
|
||||||
|
|
||||||
void SetHandle(int handle, bool takeOwnership = true);
|
void SetHandle(int handle);
|
||||||
|
|
||||||
virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize);
|
virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize);
|
||||||
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize);
|
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize);
|
||||||
@ -26,9 +26,24 @@ class Handle : public ConsoleNode {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
int16 fHandle;
|
int16 fHandle;
|
||||||
bool fOwnHandle;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* character devices */
|
||||||
|
class CharHandle : public Handle {
|
||||||
|
public:
|
||||||
|
CharHandle(int handle);
|
||||||
|
CharHandle();
|
||||||
|
virtual ~CharHandle();
|
||||||
|
|
||||||
|
virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize);
|
||||||
|
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
};
|
||||||
|
|
||||||
|
/* block devices */
|
||||||
|
/* cf. devices.cpp */
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#endif /* HANDLE_H */
|
#endif /* HANDLE_H */
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
// TOS emulates a VT52
|
// TOS emulates a VT52
|
||||||
|
|
||||||
class ConsoleHandle : public Handle {
|
class ConsoleHandle : public CharHandle {
|
||||||
public:
|
public:
|
||||||
ConsoleHandle();
|
ConsoleHandle();
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ FILE *stdin, *stdout, *stderr;
|
|||||||
|
|
||||||
|
|
||||||
ConsoleHandle::ConsoleHandle()
|
ConsoleHandle::ConsoleHandle()
|
||||||
: Handle()
|
: CharHandle()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user