xref: /haiku/src/system/boot/platform/atari_m68k/Handle.cpp (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 /*
2  * Copyright 2008-2010, François Revol, revol@free.fr. All rights reserved.
3  * Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include <SupportDefs.h>
9 #include <platform/openfirmware/openfirmware.h>
10 #include <util/kernel_cpp.h>
11 
12 #include "Handle.h"
13 #include "toscalls.h"
14 
15 /*
16  * (X)BIOS supports char and block devices with a separate namespace
17  * for char devs handle is {DEV_PRINTER, ... DEV_CONSOLE, ...}
18  * for block devs handle is either:
19  * 		 - the partition number {0=A:, 2=C:...} in logical mode.
20  * 		 - the drive number {0=A:, 1=B:, 2=ACSI-0, 10=SCSI-0, ...}
21  *			in phys mode (RW_NOTRANSLATE).
22  * BlockHandle is in devices.cpp
23  *
24  * XXX: handle network devices ? not sure how TOS net extensions do this
25  * not sure it'll ever be supported anyway.
26  * XXX: BIOSDrive/BIOSHandle : public BlockHandle ?
27  */
28 
29 Handle::Handle(int handle)
30 	:
31 	fHandle((int16)handle)
32 {
33 }
34 
35 
36 Handle::Handle(void)
37 	:
38 	fHandle(DEV_CONSOLE)
39 {
40 }
41 
42 
43 Handle::~Handle()
44 {
45 }
46 
47 
48 void
49 Handle::SetHandle(int handle)
50 {
51 	fHandle = (int16)handle;
52 }
53 
54 
55 ssize_t
56 Handle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
57 {
58 	return B_ERROR;
59 }
60 
61 
62 ssize_t
63 Handle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
64 {
65 	return B_ERROR;
66 }
67 
68 
69 off_t
70 Handle::Size() const
71 {
72 	// ToDo: fix this!
73 	return 1024LL * 1024 * 1024 * 1024;
74 		// 1024 GB
75 }
76 
77 
78 // #pragma mark -
79 
80 
81 CharHandle::CharHandle(int handle)
82 	: Handle(handle)
83 {
84 }
85 
86 
87 CharHandle::CharHandle(void)
88 	: Handle()
89 {
90 }
91 
92 
93 CharHandle::~CharHandle()
94 {
95 }
96 
97 
98 ssize_t
99 CharHandle::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
100 {
101 	char *string = (char *)buffer;
102 	int i;
103 
104 	// can't seek
105 	for (i = 0; i < bufferSize; i++) {
106 		if (Bconstat(fHandle) == 0)
107 			return i;
108 		string[i] = (char)Bconin(fHandle);
109 	}
110 
111 	return bufferSize;
112 }
113 
114 
115 ssize_t
116 CharHandle::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
117 {
118 	const char *string = (const char *)buffer;
119 	int i;
120 
121 	// can't seek
122 
123 	//XXX: check Bcostat ?
124 	for (i = 0; i < bufferSize; i++) {
125 		Bconout(fHandle, string[i]);
126 	}
127 
128 	return bufferSize;
129 }
130 
131 
132