xref: /haiku/docs/user/book.dox (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1/*!
2	\mainpage Welcome to the Haiku Book
3
4	Below you will find documentation on the Application Programming
5	Interface (API) of the Haiku operating system. This API describes
6	the internals of the operating system allowing developers to write
7	native C++ applications and device drivers. See the
8	<a href="https://api.haiku-os.org">online version</a> for the most
9	updated version of this document. If you would like to help contribute
10	contact the <a href="https://www.freelists.org/list/haiku-doc">documentation
11	mailing list</a>. For guidelines on how to help document the API see
12	the \link apidoc Documenting the API\endlink page. A list of
13	contributors can be found \ref credits page. Documenting the API is
14	an ongoing process so contributions are greatly appreciated.
15
16	The Haiku API is based on the BeOS R5 API but changes and additions have
17	been included where appropriate. Important compatibility differences are
18	detailed on the \ref compatibility page. New classes and methods
19	and incompatible API changes to the BeOS R5 API are noted in the
20	appropriate sections.
21
22	A complete reference to the BeOS R5 API is available on the web in
23	<a href="https://haiku-os.org/legacy-docs/bebook/">The Be Book</a>.
24	The Be Book is used with permission from
25	<a href="https://www.access-company.com/">Access Co.</a>, the current
26	owners of Be's intellectual property.
27
28	\section book_kits Kits and Servers
29
30	The API is split into several kits and servers each detailing a different
31	aspect of the operating system.
32		- The \ref app is the starting point for developing applications
33			and includes classes for messaging and for interacting with
34			the rest of the system.
35		- The \ref game provides classes for producing game sounds and
36			working with full screen apps.
37		- The \ref interface is used to create responsive and attractive
38			graphical user interfaces building on the messaging facilities
39			provided by the Application Kit.
40			- The \link layout_intro Layout API \endlink is a new addition
41				to the Interface Kit in Haiku which provides resources to
42				layout your application flexibly and easily.
43		- The \ref locale includes classes to localize your application to
44			different languages, timezones, number formatting conventions and
45			much more.
46		- The \ref mail includes classes to work with e-mail files, folders,
47			protocols, and filters, as part of Haiku's unique mail handling system.
48		- The \ref media provides a unified and consistent interface for media
49			streams and applications to intercommunicate.
50		- The \ref midi2 describes an interface to generating, processing,
51			and playing music in MIDI format. For reference documentation on the
52			\ref midi1 is also included.
53		- The \ref network handles everything network related, from interface
54			IP address settings to HTTP connections.
55		- The \ref storage is a collection of classes that deal with storing and
56			retrieving information from disk.
57		- The \ref support contains support classes to use in your application
58			including resources for thread safety, IO, and serialization.
59		- The \ref translation provides a framework for converting data streams
60			between media formats.
61
62	\section book_special_topics Special Topics
63
64	- \ref libroot
65	- \ref drivers
66	- \ref keyboard
67	- \ref json
68	- \ref netservices
69*/
70
71///// Define main kits /////
72
73/*!
74	\defgroup app Application Kit
75	\brief The Application Kit is the starting point for writing native Haiku
76		GUI applications.
77
78	The application kit is exactly what its name suggests &mdash; it is the
79	basis of Haiku applications. You should first read through this document
80	and the references here before moving on to the other parts of the API.
81
82	The Application Kit classes can be divided into two groups: the messaging
83	classes and the system interaction classes. The larger of the two groups is
84	the messaging classes. Since the Haiku API relies on pervasive
85	multithreading messaging is an essential topic for any application. Have a
86	look at the \link app_messaging Introduction to Messaging \endlink for more
87	information.
88
89	The following messaging classes which allow you to easily and securely
90	communicate between threads.
91		- BHandler
92		- BInvoker
93		- BLooper
94		- BMessage
95		- BMessageFilter
96		- BMessageQueue
97		- BMessageRunner
98		- BMessenger
99
100	The second group is the system interaction classes. These classes
101	provide hooks for your application to interact with the rest of the system.
102	The most important class in this group is BApplication. Below is a list of
103	all system interaction classes:
104		- BApplication
105		- BClipboard
106		- BCursor
107		- BLaunchRoster
108		- BNotification
109		- BPropertyInfo
110		- BRoster
111
112	A third special category is the \link app_keystore Password and Key storage
113	API:\endlink
114		- BKey
115		- BKeyStore
116
117
118	\defgroup game Game Kit
119	\brief The Game Kit provides classes for producing game sounds and
120		working with full screen apps.
121
122
123	\defgroup interface Interface Kit
124	\brief API for displaying a graphical user interface.
125
126	The Interface Kit holds all the classes you'll need to develop a GUI.
127	Building on the messaging facilities provided by the Application Kit,
128	the Interface Kit can be used to create a responsive and attractive
129	graphical user interface.
130
131 	The most important class in the Interface Kit is the BView class, which
132	handles drawing and user interaction. Pointer and keyboard events are
133	processed in this class.
134
135	Another important class is the BWindow class, which holds BViews and makes
136	them visible to the user. The BWindow class also handles BView focusing
137	and BMessage dispatching, among other things.
138
139	A new addition Haiku has added over the BeOS API is the Layout API, which
140	is based around the BLayoutItem and BLayout classes. These classes will
141	take care of making sure all your GUI widgets end up where you want them,
142	with enough space to be useful. You can start learning the Layout API
143	by reading the \link layout_intro introduction \endlink.
144
145
146	\defgroup locale Locale Kit
147	\brief Collection of classes for localizing applications.
148
149	\defgroup mail Mail Kit
150	\brief API for working with e-mail messages and protocols.
151
152	\defgroup media Media Kit
153	\brief Collection of classes that deal with audio and video.
154
155	\defgroup midi1 The old MIDI Kit (libmidi.so)
156	\brief The old MIDI kit.
157
158
159	\defgroup midi2 MIDI 2 Kit
160	\brief The Midi Kit is the API that implements support for generating,
161		processing, and playing music in MIDI format.
162
163	<A HREF="https://www.midi.org/">MIDI</A>, which  stands for 'Musical
164	Instrument Digital Interface', is a well-established  standard for
165	representing and communicating musical data. This document serves as
166	an overview. If you would like to see all the components, please look
167	at \link midi2 the list with classes \endlink.
168
169	\section book_midi2twokits A Tale of Two MIDI Kits
170
171	BeOS comes with two different, but compatible Midi Kits. This
172	documentation focuses on the "new" Midi Kit, or midi2 as we like to
173	call it, that was  introduced with BeOS R5. The old kit, which we'll
174	refer to as midi1, is more complete than the new kit, but less powerful.
175
176	Both kits let you create so-called MIDI endpoints, but the endpoints
177	from midi1 cannot be shared between different applications. The midi2
178	kit solves that  problem, but unlike midi1 it does not include a General
179	MIDI softsynth, nor does it have a facility for reading and playing
180	Standard MIDI Files. Don't worry: both kits are compatible and you can
181	mix-and-match them in your applications.
182
183	The main differences between the two kits:
184		- Instead of one BMidi object that both produces and consumes events,
185			we have BMidiProducer and BMidiConsumer.
186		- Applications are capable of sharing MIDI producers and consumers
187			with other applications via the centralized Midi Roster.
188		- Physical MIDI ports are now sharable without apps "stealing" events
189			from each other.
190		- Applications can now send/receive raw MIDI byte streams (useful if
191			an application has its own MIDI parser/engine).
192		- Channels are numbered 0&ndash;15, not 1&ndash;16
193		- Timing is now specified in microseconds rather than milliseconds.
194
195	\section book_midi2concepts Midi Kit Concepts
196
197	A brief overview of the elements that comprise the Midi Kit:
198		- \b Endpoints. This is what the Midi Kit is all about: sending MIDI
199			messages between endpoints. An endpoint is like a MIDI In or MIDI
200			Out socket on your equipment; it either receives information or it
201			sends information. Endpoints that send MIDI events are called
202			\b producers; the endpoints that receive those events are called
203			\b consumers. An endpoint that is created by your own application
204			is called \b local; endpoints from other applications are
205			\b remote. You can access remote endpoints using \b proxies.
206		- \b Filters. A filter is an object that has a consumer and a producer
207			endpoint. It reads incoming events from its consumer, performs some
208			operation, and tells its producer to send out the results. In its
209			current form, the Midi  Kit doesn't provide any special facilities
210			for writing filters.
211		- \b Midi \b Roster. The roster is the list of all published producers
212			and consumers. By publishing an endpoint, you allow other
213			applications to talk to it. You are not required to publish your
214			endpoints, in which case only your own application can use them.
215		- \b Midi \b Server. The Midi Server does the behind-the-scenes work.
216			It manages the roster, it connects endpoints, it makes sure that
217			endpoints can communicate, and so on. The Midi Server is started
218			automatically when BeOS boots, and you never have to deal with it
219			directly. Just remember that it runs the show.
220		- \b libmidi. The BMidi* classes live inside two shared libraries:
221			libmidi.so and libmidi2.so. If you write an application that uses
222			old Midi Kit, you must link it to libmidi.so. Applications that use
223			the new Midi Kit must link to libmidi2.so. If you want to
224			mix-and-match both kits, you should also link to both libraries.
225
226	Here is a pretty picture:
227
228	\image html midi2concepts.png
229
230	\section book_midi2mediakit Midi Kit != Media Kit
231
232	Be chose not to integrate the Midi Kit into the Media Kit as another media
233	type, mainly because MIDI doesn't require any of the format negotiation that
234	other media types need. Although the two kits look similar -- both have a
235	"roster" for finding or registering "consumers" and "producers" -- there are
236	some very important differences.
237
238	The first and most important point to note is that BMidiConsumer and
239	BMidiProducer in the Midi Kit are \b NOT directly analogous to
240	BBufferConsumer and  BBufferProducer in the Media Kit! In the Media Kit,
241	consumers and producers are the data consuming and producing properties
242	of a media node. A filter in the Media Kit, therefore, inherits from both
243	BBufferConsumer and BBufferProducer, and implements their virtual member
244	functions to do its work.
245
246	In the Midi Kit, consumers and producers act as endpoints of MIDI data
247	connections, much as media_source and media_destination do in the Media Kit.
248	Thus, a MIDI filter does not derive from BMidiConsumer and BMidiProducer;
249	instead, it contains BMidiConsumer and BMidiProducer objects for each of its
250	distinct endpoints that connect to other MIDI objects. The Midi Kit does not
251	allow the use of multiple virtual inheritance, so you can't create an object
252	that's both a BMidiConsumer and a BMidiProducer.
253
254	This also contrasts with the old Midi Kit's conception of a BMidi object,
255	which stood for an object that both received and sent MIDI data. In the new
256	Midi Kit, the endpoints of MIDI connections are all that matters. What lies
257	between the endpoints, i.e. how a MIDI filter is actually structured, is
258	entirely at your discretion.
259
260	Also, rather than use token structs like media_node to make connections
261	via the MediaRoster, the new kit makes the connections directly via the
262	BMidiProducer object.
263
264	\section book_midi2remotelocal Remote vs. Local Objects
265
266	The Midi Kit makes a distinction between remote and local MIDI objects.
267	You can  only create local MIDI endpoints, which derive from either
268	BMidiLocalConsumer or BMidiLocalProducer. Remote endpoints are endpoints
269	that live in other applications, and you access them through BMidiRoster.
270
271	BMidiRoster only gives you access to BMidiEndpoints, BMidiConsumers, and
272	BMidiProducers. When you want to talk to remote MIDI objects, you do so
273	through the proxy objects that BMidiRoster provides. Unlike
274	BMidiLocalConsumer and BMidiLocalProducer, these classes do not provide a
275	lot of functions. That is intentional. In order to hide the details of
276	communication with MIDI endpoints in other applications, the Midi Kit must
277	hide the details of how a particular endpoint is implemented.
278
279	So what can you do with remote objects? Only what BMidiConsumer,
280	BMidiProducer, and BMidiEndpoint will let you do. You can connect
281	objects, get the properties of these objects -- and that's about it.
282
283	\section book_midi2lifespan Creating and Destroying Objects
284
285	The constructors and destructors of most midi2 classes are private,
286	which means that you cannot directly create them using the C++
287	<CODE>new</CODE> operator, on the  stack, or as globals. Nor can you
288	<CODE>delete</CODE> them. Instead, these objects are obtained through
289	BMidiRoster. The only two exceptions to this rule are BMidiLocalConsumer
290	and BMidiLocalProducer. These two objects may be directly created and
291	subclassed by developers.
292
293	\section book_midi2refcount Reference Counting
294
295	Each MIDI endpoint has a reference count associated with it, so that
296	the Midi Roster can do proper bookkeeping. When you construct a
297	BMidiLocalProducer or  BMidiLocalConsumer endpoint, it starts with a
298	reference count of 1. In addition, BMidiRoster increments the reference
299	count of any object it hands to you as a result of
300	\link BMidiRoster::NextEndpoint() NextEndpoint() \endlink or
301	\link BMidiRoster::FindEndpoint() FindEndpoint() \endlink.
302	Once the count hits  0, the endpoint will be deleted.
303
304	This means that, to delete an endpoint, you don't call the
305	<CODE>delete</CODE>  operator directly; instead, you call
306	\link BMidiEndpoint::Release() Release() \endlink.
307	To balance this call, there's also an
308	\link BMidiEndpoint::Acquire() Acquire() \endlink, in case you have two
309	disparate parts of your application working with the endpoint, and you
310	don't want to have to keep track of who needs to Release() the endpoint.
311
312	When you're done with any endpoint object, you must Release() it.
313	This is true  for both local and remote objects. Repeat after me:
314	Release() when you're done.
315
316	\section book_midi2events MIDI Events
317
318	To make some actual music, you need to
319	\link BMidiProducer::Connect() Connect() \endlink your consumers to
320	your producers. Then you tell the producer to "spray" MIDI events to all
321	the connected consumers. The consumers are notified of these incoming
322	events through a set of hook functions.
323
324	The Midi Kit already provides a set of commonly used spray functions,
325	such as  \link BMidiLocalProducer::SprayNoteOn() SprayNoteOn() \endlink,
326	\link BMidiLocalProducer::SprayControlChange() SprayControlChange()
327	\endlink, and so on. These correspond one-to-one with the message types
328	from the MIDI spec. You don't need to be a MIDI expert to use the kit, but
329	of course some knowledge of the protocol helps. If you are really hardcore,
330	you can also use the
331	\link BMidiLocalProducer::SprayData() SprayData() \endlink to send raw MIDI
332	events to the consumers.
333
334	At the consumer side, a dedicated thread invokes a hook function for every
335	incoming MIDI event. For every spray function, there is a corresponding hook
336	function, e.g. \link BMidiLocalConsumer::NoteOn() NoteOn() \endlink and
337	\link  BMidiLocalConsumer::ControlChange() ControlChange() \endlink.
338	The hardcore MIDI fanatics among you will be pleased to know that you can
339	also tap into the \link BMidiLocalConsumer::Data() Data() \endlink hook and
340	get your hands dirty with the raw MIDI data.
341
342	\section book_midi2time Time
343
344	The spray and hook functions accept a bigtime_t parameter named "time". This
345	indicates when the MIDI event should be performed. The time is given in
346	microseconds since the computer booted. To get the current tick measurement,
347	you call the system_time() function from the Kernel Kit.
348
349	If you override a hook function in one of your consumer objects, it should
350	look  at the time argument, wait until the designated time, and then perform
351	its action. The preferred method is to use the Kernel Kit's
352	<CODE>snooze_until()</CODE> function, which sends the consumer thread to
353	sleep  until the requested time has come. (Or, if the time has already
354	passed, returns immediately.)
355
356	Like this:
357
358	\code
359void MyConsumer::NoteOn(
360    uchar channel, uchar note, uchar velocity, bigtime_t time)
361{
362    snooze_until(time, B_SYSTEM_TIMEBASE);
363    ...do your thing...
364}
365	\endcode
366
367	If you want your producers to run in real time, i.e. they produce MIDI data
368	that needs to be performed immediately, you should pass time 0 to the spray
369	functions (which also happens to be the default value). Since time 0 has
370	already passed, <CODE>snooze_until()</CODE> returns immediately, and the
371	consumer will process the events as soon as they are received.
372
373	To schedule MIDI events for a performance time that lies somewhere in the
374	future, the producer must take into account the consumer's latency.
375	Producers  should attempt to get notes to the consumer by or before
376	<I>(scheduled_performance_time - latency)</I>. The time argument is still
377	the scheduled performance time, so if your consumer has latency, it should
378	snooze like this before it starts to perform the events:
379
380	\code
381snooze_until(time - Latency(), B_SYSTEM_TIMEBASE);
382	\endcode
383
384	Note that a typical producer sends out its events as soon as it can;
385	unlike a consumer, it does not have to snooze.
386
387	\section book_midi2ports Other Timing Issues
388
389	Each consumer object uses a Kernel Kit port to receive MIDI events from
390	connected producers. The queue for this port is only 1 message deep.
391	This means that if the consumer thread is asleep in a
392	<CODE>snooze_until()</CODE>, it will not read its port. Consequently,
393	any producer that tries to write a new event to this port will block until
394	the consumer thread is ready to receive a new message. This is intentional,
395	because it prevents producers from generating and queueing up thousands of
396	events.
397
398	This mechanism, while simple, puts on the producer the responsibility
399	for sorting the events in time. Suppose your producer sends three Note
400	On events, the first on t + 0, the second on t + 4, and the third on t + 2.
401	This last event won't be received until after t + 4, so it will be two ticks
402	too late. If this sort of thing can happen with your producer, you should
403	somehow sort the events before you spray them. Of course, if you have two or
404	more producers connected to the same consumer, it is nearly impossible to
405	sort this all out (pardon the pun). So it is not wise to send the same kinds
406	of events from more than one producer to one consumer at the same time.
407
408	The article Introduction to MIDI, Part 2 in <A
409	HREF="https://open-beos.sourceforge.net/nsl.php?mode=display&id=36">OpenBeOS
410	Newsletter 36</A> describes this problem in more detail, and provides a
411	solution. Go read it now!
412
413	\section book_midi2filters Writing a Filter
414
415	A typical filter contains a consumer and a producer endpoint. It receives
416	events from the consumer, processes them, and sends them out again using the
417	producer. The consumer endpoint is a subclass of BMidiLocalConsumer, whereas
418	the producer is simply a BMidiLocalProducer, not a subclass. This is a
419	common  configuration, because consumers work by overriding the event hooks
420	to do work  when MIDI data arrives. Producers work by sending an event when
421	you call their  member functions. You should hardly ever need to derive from
422	BMidiLocalProducer (unless you need to know when the producer gets connected
423	or disconnected, perhaps), but you'll always have to override one or more of
424	BMidiLocalConsumer's member functions to do something useful with incoming
425	data.
426
427	Filters should ignore the time argument from the spray and hook functions,
428	and  simply pass it on unchanged. Objects that only filter data should
429	process the  event as quickly as possible and be done with it. Do not
430	<CODE>snooze_until()</CODE> in the consumer endpoint of a filter!
431
432	\section book_midi2apidiffs API Differences
433
434	As far as the end user is concerned, the Haiku Midi Kit is mostly the same
435	as the BeOS R5 kits, although there are a few small differences in the API
436	(mostly bug fixes):
437		- BMidiEndpoint::IsPersistent() always returns false.
438		- The B_MIDI_CHANGE_LATENCY notification is now properly sent. The Be
439			kit  incorrectly set be:op to B_MIDI_CHANGED_NAME, even though the
440			rest of the  message was properly structured.
441		- If creating a local endpoint fails, you can still Release() the object
442		  without crashing into the debugger.
443
444	\section book_midi2seealso See also
445
446	More about the Midi Kit:
447		- \ref Midi2Defs.h
448		- Be Newsletter Volume 3, Issue 47 - Motor Mix sample code
449		- Be Newsletter Volume 4, Issue 3 - Overview of the new kit
450		- <A HREF="https://haiku-os.org/documents/dev/introduction_to_midi_part_1">Newsletter
451		  33</A>, Introduction to MIDI, Part 1
452		- <A HREF="https://haiku-os.org/documents/dev/introduction_to_midi_part_2">Newsletter
453		  36</A>, Introduction to MIDI, Part 2
454		- Sample code and other goodies at the
455		  <A HREF="https://haiku-os.org/about/teams/midi_kit">Haiku Midi Kit team page</A>
456
457	Information about MIDI in general:
458		- <A HREF="https://www.midi.org">MIDI Manufacturers Association</A>
459		- <A HREF="https://www.borg.com/~jglatt/tutr/miditutr.htm">MIDI Tutorials</A>
460		- <A HREF="https://www.borg.com/~jglatt/tech/midispec.htm">MIDI Specification</A>
461		- <A HREF="https://www.borg.com/~jglatt/tech/midifile.htm">Standard MIDI File Format</A>
462		- <A HREF="https://www.io.com/~jimm/midi_ref.html">Jim Menard's MIDI Reference</A>
463
464
465	\defgroup network Network Kit
466	\brief Classes that deal with all network connections and communications.
467
468	The Haiku Network Kit consists of:
469	- A modular, add-ons based network stack
470	- Two shared libraries, libnetwork.so and libnetapi.so
471	- A stack driver, acting as interface between the network stack and
472	  libnetwork.so
473	- Basic network apps
474	- A modular GUI preflet
475
476	The libnet.so shared library is the way that BeOS R5 provided POSIX/BSD
477	API sockets to apps. Being binary compatible with BeOS R5 has made this
478	library implementation tedious. To counter this, the libnetapi.so shared
479	library was developed. It contains thin C++ classes wrapping the C
480	sockets POSIX/BSD API into these BNet* classes we're used under BeOS.
481
482	The stack driver is the interface between libnet.so and the real stack
483	behind it, hosted by the network stack kernel modules. Its purposes
484	include:
485	-# Providing sockets to file descriptors translation support
486	-# Providing support for select() on sockets
487	-# Loading the network stack on first access, and then keeping it for
488	   further accesses
489
490	The following diagram illustrates the network stack design on Haiku:
491
492	\image html obos_net_stack_design_1.gif
493
494	The Network Kit includes a handful of useful networking related apps
495	including ping, ifconfig, route, traceroute, and arp.
496
497	See the User Guide for more information about the
498	<a href="https://haiku-os.org/docs/userguide/en/preferences/network.html">Network preferences app</a>
499	included as part of the Network Kit.
500
501
502	\defgroup storage Storage Kit
503	\brief Collection of classes that deal with storing and retrieving
504		information from disk.
505
506
507	\defgroup support Support Kit
508	\brief Collection of utility classes that are used throughout the API.
509
510	The Support Kit provides a handy set of classes that you can use in your
511	applications. These classes provide:
512		- \b Thread \b Safety. Haiku can execute multiple threads of an
513			application in parallel, letting certain parts of an application
514			continue when one part is stalled, as well as letting an application
515			process multiple pieces of data at the same time on multicore or
516			multiprocessor systems. However, there are times when multiple
517			threads desire to work on the same piece of data at the same time,
518			potentially causing a conflict where variables or pointers are
519			changed by one thread causing another to execute incorrectly. To
520			prevent this, Haiku implements a \"locking\" mechanism, allowing one
521			thread to \"lock out\" other threads from executing code that might
522			modify the same data.
523		  - \b Archiving \b and \b IO. These classes allow a programmer to
524			convert objects into a form that can more easily be transferred to
525			other applications or stored to disk, as well as performing basic
526			input and output operations.
527		  - \b Memory \b Allocation. This class allows a programmer to hand off
528			some of the duties of memory accounting and management.
529		  - \b Common \b Datatypes. To avoid unnecessary duplication of code
530			and to make life easier for programmers, Haiku includes classes that
531			handle management of ordered lists and strings.
532
533	There are also a number of utility functions to time actions, play system
534	alert sounds, compare strings, and atomically manipulate integers. Have a
535	look at the overview, or go straight to the complete
536	\link support list of components \endlink of this kit.
537
538	\section book_overview Overview
539		- Thread Safety:
540			- BLocker provides a semaphore-like locking mechanism allowing for
541				recursive locks.
542			- BAutolock provides a simple method of automatically removing a
543				lock when a function ends.
544			- \ref TLS.h "Thread Local Storage" allows a global variable\'s
545				content to be sensitive to thread context.
546		- Archiving and IO:
547			- BArchivable provides an interface for \"archiving\" objects so
548				that they may be sent to other applications where an identical
549				copy will be recreated.
550			- BArchiver simplifies archiving of BArchivable hierarchies.
551			- BUnarchiver simplifies unarchiving hierarchies that have been
552				archived using BArchiver.
553			- BFlattenable provides an interface for \"flattening\" objects so
554				that they may be easily stored to disk.
555		- BDataIO provides an interface for generalized read/write streams.
556			- BPositionIO extends BDataIO to allow seeking within the data.
557			- BBufferIO creates a buffer and attaches it to a BPositionIO
558				stream, allowing for reduced load on the underlying stream.
559			- BMemoryIO allows operation on an already-existing buffer.
560			- BMallocIO creates and allows operation on a buffer.
561		- Memory Allocation:
562			- BBlockCache allows an application to allocate a \"pool\" of
563				memory blocks that the application can fetch and dispose of as
564				it pleases, letting the application make only a few large memory
565				allocations, instead of many small expensive allocations.
566		- Common Datatypes:
567			- BList allows simple ordered lists and provides common access,
568				modification, and comparison functions.
569			- BString allows strings and provides common access, modification,
570				and comparison functions.
571		- BStopWatch allows an application to measure the time an action takes.
572			- \ref support_globals "Global functions"
573			- \ref TypeConstants.h "Common types and constants"
574			- Error codes for all kits
575
576
577	\defgroup translation Translation Kit
578	\brief Provides a framework for converting data streams between media
579		formats.
580
581
582	\defgroup libtranslation (libtranslation.so)
583
584	\defgroup libbe (libbe.so)
585
586
587	\defgroup libroot (libroot.so)
588	\brief Implements the C and POSIX standard libraries.
589*/
590
591///// Subgroups /////
592
593/*!
594	\defgroup support_globals Global functions
595	\ingroup support
596
597	\defgroup layout Layout API
598	\brief Provides classes for automatically laying out UIs.
599	\ingroup interface
600*/
601
602
603///// Special Topics /////
604
605/*!
606	\defgroup drivers Device Drivers
607
608	\defgroup json Json Handling
609	\brief Provides for parsing and writing of data in Json encoding.
610
611	\defgroup netservices Experimental Network Services Support
612	\brief Experimental API to do higher level network requests
613
614	This API currently is marked as experimental. It is part of the
615	<code>BPrivate::Network</code> namespace, the header files are found at
616	<code>headers\\private\\netservices</code>, and you have to link your
617	application to <code>libnetservices.a</code>.
618*/
619
620
621///// Namespace Documentation /////
622
623
624//! \brief Internal or experimental API
625namespace BPrivate {
626	/*!
627		\brief Experimental Network Services API
628
629		See \ref netservices for more information.
630	*/
631	namespace Network {
632
633	}
634}