It is accomplished ...

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
ejakowatz
2002-07-09 12:24:59 +00:00
commit 52a3801208
2025 changed files with 472889 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
SubDir OBOS_TOP ;
SubInclude OBOS_TOP sources ;
+735
View File
@@ -0,0 +1,735 @@
# Include BuildConfig
{
local buildConfig = [ GLOB $(OBOS_TOP) : BuildConfig ] ;
if ! $(buildConfig)
{
EXIT "No BuildConfig!"
"Run ./configure in the source tree's root directory first!" ;
}
include $(buildConfig) ;
}
# Determine if we're building on PPC or x86
# Determine mimetype of executable
# Cross compiling can come later
if $(METROWERKS) {
OBOS_TARGET ?= "ppc.R5" ;
OBOS_TARGET_TYPE ?= "application/x-be-executable" ;
OBOS_ARCH ?= "ppc" ;
OBOS_TARGET_DEFINE ?= "ARCH_ppc" ;
} else {
OBOS_TARGET ?= "x86.R5" ;
OBOS_TARGET_TYPE ?= "application/x-vnd.Be-elfexecutable" ;
OBOS_ARCH ?= "x86" ;
OBOS_TARGET_DEFINE ?= "ARCH_x86" ;
OBOS_TARGET_DIR ?= "x86" ;
}
KERNEL_CCFLAGS ?= "-Wall -Wno-multichar -Wmissing-prototypes -finline -nostdinc" ;
KERNEL_CCFLAGS += "-fno-builtin -D$(OBOS_TARGET_DEFINE) " ;
AR = ar r ;
OPTIM = -O2 ;
# If no OBOS_OBJECT_TARGET is not defined yet, use our default directory and
# include our "OBOS_TARGET" as subdirectory in there (to prevent different
# builds mixing objects from different targets).
if ! $(OBOS_OBJECT_TARGET) {
OBOS_OBJECT_TARGET ?= [ FDirName $(OBOS_TOP) objects $(OBOS_TARGET) ] ;
}
# If no OBOS_DISTRO_TARGET is not defined yet, use our default directory and
# include our "OBOS_TARGET" as subdirectory in there (to prevent different
# builds mixing executables from different targets).
if ! $(OBOS_DISTRO_TARGET) {
OBOS_DISTRO_TARGET ?= [ FDirName $(OBOS_TOP) distro $(OBOS_TARGET) ] ;
}
# Set our version number if not already set and mark it as a developer build
if ! $(OBOS_BUILD_VERSION) {
OBOS_BUILD_VERSION ?= "1 0 0 a 1" ;
OBOS_BUILD_DESCRIPTION ?= "Developer Build" ;
}
# If OBOS_BUILD_VERSION is set, but OBOS_BUILD_DESCRIPTION isn't, mark it as
# an unknown build.
if ! $(OBOS_BUILD_DESCRIPTION) {
OBOS_BUILD_DESCRIPTION ?= "Unknown Build" ;
}
# Relative subdirs for distro dir (these are for *INTERNAL* use by the following rules only!)
OBOS_PREFS_DIR ?= [ FDirName $(OBOS_DISTRO_TARGET) beos preferences ] ;
OBOS_SERVER_DIR ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system servers ] ;
OBOS_ADDON_DIR ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system add-ons ] ;
OBOS_SHLIB_DIR ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system lib ] ;
OBOS_STLIB_DIR ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system lib ] ;
OBOS_KERNEL_DIR ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system ] ;
OBOS_TEST_DIR ?= [ FDirName $(OBOS_TOP) tests ] ;
OBOS_KERNEL_CONFIG = config.$(OBOS_ARCH).ini ;
OBOS_KERNEL = kernel.$(OBOS_ARCH) ;
OBOS_FLOPPY = floppy.$(OBOS_ARCH) ;
rule SetupIncludes
{
OBOS_INCLUDES ?= . add-ons app be_apps device drivers game interface kernel mail media midi midi2 net opengl storage support translation ;
UsePublicHeaders $(OBOS_INCLUDES) ;
}
#-------------------------------------------------------------------------------
# Things Jam needs in order to work :)
#-------------------------------------------------------------------------------
rule UserObject
{
switch $(2)
{
case *.S : assemble $(1) : $(2) ;
case * : ECHO "unknown suffix on" $(2) ;
}
}
# Override the default to give "prettier" command lines.
actions Cc
{
$(CC) -c $(2) $(CCFLAGS) $(CCDEFS) $(CCHDRS) -o $(1) ;
}
actions C++
{
$(C++) -c $(2) $(C++FLAGS) $(CCDEFS) $(CCHDRS) -o $(1) ;
}
#-------------------------------------------------------------------------------
# General High-level OBOS target rules
#-------------------------------------------------------------------------------
rule Preference
{
# Preference <name> : <sources> ;
# SetupIncludes ;
SetupObjectsDir ;
Main $(<) : $(>) ;
MakeLocate $(<) : $(OBOS_PREFS_DIR) ;
}
rule Server
{
# Server <name> : <sources> ;
SetupIncludes ;
SetupObjectsDir ;
Main $(<) : $(>) ;
MakeLocate $(<) : $(OBOS_SERVER_DIR) ;
}
# test pseudo targets
NOTFILE obostests ;
NOTFILE r5tests ;
rule CommonUnitTest
{
# CommonUnitTest <target> : <sources> : <dest> : <obos libraries>
# : <r5 libraries> : <public headers>;
# Builds a unit test for both OBOS and R5 modules.
# <target> The name of the target.
# <sources> The list of sources.
# <dest> The directory for the target (as passed to FDirName).
# <obos libraries> A list of link libraries for the OBOS tests (as passed
# to LinkSharedOSLibs).
# <r5 libraries> A list of link libraries for the R5 tests (as passed
# to LinkSharedOSLibs).
# <public headers> A list of public header dirs (as passed to
# UsePublicHeaders).
UnitTest $(1) : $(2) : $(3) : $(4) : $(6) ;
R5UnitTest $(1) : $(2) : $(3) : $(5) ;
}
rule UnitTest
{
# UnitTest <target> : <sources> : <dest> : <libraries> : <public headers>
# Builds a unit test for an OBOS module.
# <target> The name of the target.
# <sources> The list of sources.
# <dest> The directory for the target (as passed to FDirName).
# <libraries> A list of link libraries (as passed to LinkSharedOSLibs).
# <public headers> A list of public header dirs (as passed to
# UsePublicHeaders).
local target = $(1) ;
local sources = $(2) ;
local dest = $(3) ;
local libraries = $(4) ;
local headerDirs = $(5) ;
# SetupIncludes ;
UseCppUnitHeaders ;
SetupObjectsDir ;
MakeLocateObjects $(sources) ;
Main $(target) : $(sources) ;
MakeLocate $(target) : [ FDirName $(OBOS_TEST_DIR) $(dest) ] ;
DEPENDS $(target) : libcppunit.so ;
DEPENDS obostests : $(target) ;
LinkSharedOSLibs $(target) : libcppunit.so $(libraries) ;
UsePublicHeaders $(headerDirs) : $(sources) ;
ObjectDefines $(sources) : TEST_OBOS ;
# Turn debugging on. That is usually desired for test code.
ObjectCcFlags $(sources) : "-g" ;
ObjectC++Flags $(sources) : "-g" ;
}
rule R5UnitTest
{
# R5UnitTest <target> : <sources> : <dest> : <libraries>
# Builds a unit test for an R5 module. "_r5" is appended to the object
# and the target name.
# <target> The name of the target.
# <sources> The list of sources.
# <dest> The directory for the target (as passed to FDirName).
# <libraries> A list of link libraries (as passed to LinkSharedOSLibs).
local target = $(1)_r5 ;
local sources = $(2) ;
local dest = $(3) ;
local libraries = $(4) ;
local objects = [ R5ObjectNames $(sources) ] ;
UseCppUnitHeaders ;
SetupObjectsDir ;
MakeLocateObjects $(objects) ;
# Our Main replacement.
MainFromObjects $(target) : $(objects) ;
local source ;
for source in [ FGristFiles $(sources) ]
{
local object = [ R5ObjectNames $(source) ] ;
Object $(object) : $(source) ;
Depends obj : $(object) ;
}
MakeLocate $(target) : [ FDirName $(OBOS_TEST_DIR) $(dest) ] ;
DEPENDS $(target) : libcppunit.so ;
DEPENDS r5tests : $(target) ;
LinkSharedOSLibs $(target) : libcppunit.so $(libraries) ;
ObjectDefines $(objects) : TEST_R5 ;
# Turn debugging on. That is usually desired for test code.
ObjectCcFlags $(objects) : "-g" ;
ObjectC++Flags $(objects) : "-g" ;
}
rule R5ObjectNames
{
# R5ObjectNames <sources> ;
# Returns a list of gristed object names given a list of source file names.
# Moreover each object names gets "_r5" inserted before the object suffix.
local objects = $(1:S=)_r5 ;
return [ FGristFiles $(objects:S=$(SUFOBJ)) ] ;
}
rule Addon
{
# Addon <name> : <relpath> : <sources> ;
SetupIncludes ;
SetupObjectsDir ;
Main $(1) : $(3) ;
# Create output dir path for addon
local targetdir;
targetdir = [ FDirName $(OBOS_ADDON_DIR) $(2) ] ;
MakeLocate $(1) : $(targetdir) ;
LINKFLAGS on $(1) = $(LINKFLAGS) -nostart -Xlinker -soname=\"$(1)\" ;
}
rule MakeLocateObjects
{
# MakeLocateObjects <gristed_sources_or_objects> ;
local _objs = $(1:S=$(SUFOBJ)) ;
for o in $(_objs)
{
local dir = $(o:D) ;
if $(dir) {
MakeLocate $(o) : [ FDirName $(LOCATE_TARGET) $(dir) ] ;
} else {
MakeLocate $(o) : $(LOCATE_TARGET) ;
}
}
}
rule StaticLibrary
{
# StaticLibrary <name> : <sources> ;
SetupIncludes ;
SetupObjectsDir ;
MakeLocateObjects $(2) ;
Library lib$(<).a : $(>) ;
MakeLocate lib$(<).a : $(OBOS_STLIB_DIR) ;
}
rule SharedLibrary
{
# SharedLibrary <name> : <sources> ;
local _lib = lib$(1).so ;
# SetupIncludes ;
SetupObjectsDir ;
MakeLocateObjects $(2) ;
Main $(_lib) : $(2) ;
MakeLocate $(_lib) : $(OBOS_SHLIB_DIR) ;
LINKFLAGS on $(_lib) = $(LINKFLAGS) -nostart -Xlinker -soname=\"$(_lib)\" ;
}
rule LinkSharedOSLibs
{
# LinkSharedOSLibs <name> : <libs> ;
# Valid elements for <libs> are e.g. "be" or "libopenbeos.so" or
# "/boot/.../libfoo.so". If the basename starts with "lib", it is added
# to the NEEDLIBS variable (i.e. the file will be bound!), otherwise it is
# prefixed "-l" and added to LINKLIBS.
for i in $(>)
{
switch $(i:B)
{
case lib* : NEEDLIBS on $(1) += $(i) ; DEPENDS $(1) : $(i) ;
case * : LINKLIBS on $(1) += -l$(i) ;
}
}
}
rule LinkStaticOSLibs
{
# LinkStaticOSLibs <name> : <libs> ;
for i in $(>)
{
LINKLIBS on $(<) = $(LINKLIBS) -l $(i) ;
}
}
rule AddResources
{
# AddResources <name> : <resourcefiles> ;
local dir;
dir = [ FDirName $(OBOS_TOP) $(SUBDIR_TOKENS) ] ;
for i in $(>)
{
RESFILES on $(<) = [ FDirName $(dir) $(i) ] ;
DEPENDS $(<) : [ FDirName $(dir) $(i) ] ;
}
}
rule UsePublicHeaders
{
# UsePublicHeaders <group list> [ <sources_or_objects> ] ;
#
# Adds the public C header dirs given by <group list> to the header search
# dirs of the subdirectory or of <sources_or_objects>, if given.
# NOTE: Currently the latter doesn't work, since Cc seems to be
# buggy: It sets the HDRS variable to $(SUBDIRHDRS) instead of adding it.
local list = $(1) ;
local targets = $(2) ;
local headers ;
for i in $(list) {
headers += [ FDirName $(OBOS_TOP) headers obos public $(i) ] ;
}
UseHeaders $(headers) : $(targets) ;
}
rule UsePrivateHeaders
{
# UsePrivateHeaders <group list> [ <sources_or_objects> ] ;
#
# Adds the private C header dirs given by <group list> to the header search
# dirs of the subdirectory or of <sources_or_objects>, if given.
# NOTE: Currently the latter doesn't work, since Cc seems to be
# buggy: It sets the HDRS variable to $(SUBDIRHDRS) instead of adding it.
local list = $(1) ;
local targets = $(2) ;
local headers ;
for i in $(list) {
headers += [ FDirName $(OBOS_TOP) headers obos private $(i) ] ;
}
UseHeaders $(headers) : $(targets) ;
}
rule UseHeaders
{
# UseHeaders <headers> [ <sources_or_objects> ] ;
#
# Adds the C header dirs <headers> to the header search
# dirs of the subdirectory or of <sources_or_objects>, if given.
# NOTE: Currently the latter doesn't work, since Cc seems to be
# buggy: It sets the HDRS variable to $(SUBDIRHDRS) instead of adding it.
local headers = $(1) ;
local targets = $(2) ;
if $(targets) {
ObjectHdrs $(targets) : $(headers) ;
} else {
# Note: Unlike ObjectHdrs SubDirHdrs expects only one dir given as
# path component list.
for header in $(headers) {
SubDirHdrs $(header) ;
}
}
}
rule UseCppUnitHeaders
{
local opt = -I [ FDirName $(OBOS_TOP) headers tools cppunit ] ;
SubDirCcFlags $(opt) ;
SubDirC++Flags $(opt) ;
}
rule UseArchHeaders
{
# usage: UseArchHeaders <arch>
# <arch> specifies the architecture (e.g. x86).
local opt = -D$(OBOS_TARGET_DEFINE) ;
SubDirCcFlags $(opt) ;
SubDirC++Flags $(opt) ;
SubDirHdrs [ FDirName $(OBOS_TOP) headers obos private kernel arch $(1) ] ;
}
#-------------------------------------------------------------------------------
# Low-level OBOS utility rules
#-------------------------------------------------------------------------------
rule SetupObjectsDir
{
local rel_objectsdir;
# Copy subdir tokens except the first, as that will be "sources", and we
# do not want to include that :)
rel_objectsdir = [ FDirName $(SUBDIR_TOKENS[2-]) ] ;
LOCATE_TARGET = [ FDirName $(OBOS_OBJECT_TARGET) $(rel_objectsdir) ] ;
}
#-------------------------------------------------------------------------------
# Link rule/action are overwritten as they don't handle linking files who's name
# contain spaces very well. Also adds resources and version to executable.
#-------------------------------------------------------------------------------
rule Link
{
# Note: RESFILES must be set before invocation.
MODE on $(<) = $(EXEMODE) ;
on $(1) XRes $(1) : $(RESFILES) ;
SetVersion $(1) ;
Chmod $(<) ;
SetType $(1) ;
MimeSet $(1) ;
}
actions Link bind NEEDLIBS
{
$(LINK) $(LINKFLAGS) -o "$(1)" $(UNDEFS) $(2) $(NEEDLIBS) $(LINKLIBS) ;
}
# BeOS specific rules
rule XRes
{
# XRes <target> : <resource files>
if $(2)
{
DEPENDS $(1) : $(2) ;
XRes1 $(1) : $(2) ;
}
}
rule XRes1 { }
rule SetVersion
{
# SetVersion <target>
}
rule SetType
{
# SetType <target>
}
rule MimeSet
{
# SetType <target>
}
if $(OS) = BEOS
{
actions XRes1
{
xres -o "$(1)" $(2) ;
}
actions SetVersion
{
setversion "$(1)" -system $(OBOS_BUILD_VERSION) -short "$(OBOS_BUILD_DESCRIPTION)" ;
}
actions SetType
{
settype -t $(OBOS_TARGET_TYPE) "$(1)" ;
}
actions MimeSet
{
mimeset -f "$(1)" ;
}
} # if BEOS
rule assemble
{
DEPENDS $(1) : $(2) ;
Clean clean : $(1) ;
}
actions assemble
{
$(CC) -c $(2) -O2 $(KERNEL_CCFLAGS) -o $(1) ;
}
## Kernel stuff!
rule SetupKernel
{
# Usage SetupKernel <sources_or_objects> : <extra_cc_flags>;
local _objs = $(1:S=$(SUFOBJ)) ;
UsePublicHeaders kernel ;
UsePrivateHeaders kernel ;
UseArchHeaders $(OBOS_ARCH) ;
SetupObjectsDir ;
CCFLAGS on $(_objs) = $(KERNEL_CCFLAGS) $(2) ;
C++FLAGS on $(_objs) = $(KERNEL_CCFLAGS) $(2) ;
}
rule KernelObjects
{
SetupKernel $(1) : $(2) ;
Objects $(1) ;
}
rule KernelLd
{
# KernelLd <name> : <objs> : <linkerscript> : <args> : <gcc_off> ;
SetupKernel $(2) ;
LINK on $(1) = ld ;
LINKFLAGS on $(1) = $(4) ;
if $(3) { LINKFLAGS on $(1) += --script=$(3) ; }
# Remove any preset LINKLIBS
LINKLIBS on $(1) = ;
# Show that we depend on the libraries we need
Clean clean : $(1) ;
Depends all : $(1) ;
Depends $(1) : $(2) ;
if $(6) {
Depends $(OBOS_KERNEL_CONFIG) : $(1) ;
for i in $(6) {
SECTIONS on $(OBOS_KERNEL_CONFIG) += ":" $(i) elf32 [ FDirName $(LOCATE_TARGET) $(1) ] ;
}
}
MakeLocate $(1) : $(LOCATE_TARGET) ;
# Add libgcc.a - NB this should be detected not hard coded!
if ! $(5) {
LINKLIBS on $(1) += "-L $(GCC_PATH) -lgcc" ;
}
}
actions KernelLd
{
$(LINK) $(LINKFLAGS) -o $(1) $(2) $(LINKLIBS) ;
}
rule KernelStaticLibrary
{
# Usage KernelStaticLibrary <name> : <sources> : <extra cc flags> ;
# This is designed to take a set of sources and libraries and create
# a file called lib<name>.a
SetupKernel $(2) : $(3) ;
MakeLocateObjects $(2) ;
Library $(1) : $(2) ;
}
rule KernelStaticLibraryObjects
{
# Usage KernelStaticLibrary <name> : <sources> ;
# This is designed to take a set of sources and libraries and create
# a file called <name>
SetupKernel $(2) ;
# Show that we depend on the libraries we need
Clean clean : $(1) ;
Depends all : $(1) ;
Depends $(1) : $(2) ;
MakeLocate $(1) : $(LOCATE_TARGET) ;
}
actions KernelStaticLibraryObjects
{
ar -r $(1) $(2) ;
}
rule SystemMain
{
# Usage SystemMain <target> : <sources> : <rqd_by> ;
SetupObjectsDir ;
CCFLAGS on $(1) = $(OPTIM) ;
C++FLAGS on $(1) = $(OPTIM) ;
LINKLIBS = ;
# This allows us to preset certain commands we use
# for building.
if $(3) {
for obj in $(3) {
BUILD_CMD on $(obj) = [ FDirName $(LOCATE_TARGET) $(1) ] ;
}
}
Main $(1) : $(2) ;
}
rule KernelConfigSection
{
# KernelConfigSection <section> : <type> : <file> ;
SECTIONS on $(OBOS_KERNEL_CONFIG) += ":" $(1) $(2) $(3) ;
}
rule WriteKernelConfig
{
# usage: WriteKernelConfig <target> ;
Depends files : $(1) ;
LOCATE on $(1) = $(LOCATE_TARGET) ;
MakeLocate $(1) : $(LOCATE_TARGET) ;
Clean clean : $(1) ;
}
actions WriteKernelConfig
{
target=$(1)
echo "# OpenBeOS Kernel Config File" > $target
echo "# Automatically generated - do not edit!" >> $target
issection="0"
section=
for i in "$(SECTIONS)" ; do
if [ $issection == 1 ]; then
section=$i
issection=2
echo "["$section"]" >> $target
elif [ $issection == 2 ]; then
type=$i
issection=3
echo "type="$type >> $target
else
if [ $i == ":" ]; then
issection=1
echo "" >> $target
else
file=$i
case $file in
/*) ;;
*) file=`pwd`/$file;;
esac
echo "file="$file >> $target
fi
fi
done
}
rule BuildKernel
{
# Usage BuildKernel <target> : <config_file> ;
Depends all : $(1) ;
Depends $(1) : $(2) ;
Clean clean : $(1) ;
MakeLocate $(1) : $(LOCATE_TARGET) ;
}
actions BuildKernel
{
$(BUILD_CMD) --strip-debug --strip-binary strip $(2) -o $(1) ;
echo ""
echo "Kernel linked!"
echo ""
}
# At present I don't bother moving the final location for
# the floppy image as it makes copying it onto a floppy easier if it's
# where you did the build. This is easy enough changed.
rule KernelFloppyImage
{
# Usage KernelFloppyImage <target> : <kernel> : <bootblock> ;
Depends all : $(1) ;
Depends $(1) : $(2) ;
Clean clean : $(1) ;
BOOT_BLOCK on $(1) = $(3) ;
}
# This may be a bit verbose, but I think it's useful to show what's
# going on, at least in this early stage of development.
actions KernelFloppyImage
{
$(BUILD_CMD) $(BOOT_BLOCK) $(2) $(1) ;
echo ""
echo "*************************************************"
echo "* Kernel build completed! *"
echo "* Boot image for a 1.44M floppy created *"
echo "*************************************************"
echo ""
echo "Floppy image is $(OBOS_FLOPPY)"
echo "The following command will write it to a floppy on BeOS"
echo " dd if=$(OBOS_FLOPPY) of=/dev/disk/floppy/raw bs=18k"
echo ""
}
+102
View File
@@ -0,0 +1,102 @@
Building
--------
The build system uses Jam/MR (http://www.perforce.com/jam/jam.html).
A BeOS executable of Jam 2.3.1 is available at:
http://open-beos.sf.net/misc/jam.zip
Unzip the executable and copy it to /boot/home/config/bin.
To build the whole source tree, launch a Terminal, cd into the openbeos root
directory and just type:
$ ./configure
$ jam
The configure script generates a file named BuildConfig. As long as configure
is not modified (!), there is no need to call it again. That is for
re-building you only need to invoke Jam. If you don't update the source tree
very frequently, you may want to execute configure after each update just to
be on the safe side.
NOTE: If you have checked out the latest CVS version, it is not unlikely that
some parts of the tree won't build.
Running
-------
If the build went fine, a file named floppy.x86 had been created in the
root directory of the source tree. What you want to do now, is to boot from
this floppy image. Therefore you either write the image onto a real floppy
disk and restart you computer, or you write it onto a "virtual floppy disk"
emulated by a x86 PC emulator and just start this emulator.
1. Real Floppy
Put in the disk and type in the source tree's root dir:
$ dd if=floppy.x86 of=/dev/disk/floppy/raw bs=18k
2. Emulated Floppy (Bochs)
Type:
$ dd if=floppy.x86 of=<floppy image> bs=18k
where <floppy image> has to be replaced with the filename of the floppy
image Bochs has been told to use (e.g. /tmp/obos.img).
Bochs
-----
Version 1.4 of Bochs for BeOS (BeBochs) can be downloaded from BeBits:
http://www.bebits.com/app/2902
The package installs to: /boot/apps/BeBochs1.4
You have to set up a configuration for Bochs. A relatively short and
painless procedure follows:
Lauch a Terminal:
$ cd /tmp
$ /boot/apps/BeBochs1.4/bximage
Answer with "fd", RETURN (for 1.44) and "obos.img", and a floppy image
/tmp/obos.img will be created.
Open folder /boot/apps/BeBochs1.4 and backup .bochsrc. Open .bochsrc with
your favorite text editor, remove the complete contents and paste the
following instead (you may as well take the original file and insert/replace/
keep the respective lines):
romimage: file=bios/BIOS-bochs-latest, address=0xf0000
megs: 32
vgaromimage: bios/VGABIOS-elpin-2.40
floppya: 1_44=/tmp/obos.img, status=inserted
boot: a
log: /var/log/bochs-obos.log
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
vga_update_interval: 300000
keyboard_serial_delay: 250
keyboard_paste_delay: 100000
floppy_command_delay: 500
ips: 2000000
Now put the OBOS boot image onto you "virtual" floppy and start Bochs:
$ cd <OBOS sources directory>
$ dd if=floppy.x86 of=/tmp/obos.img bs=18k
$ cd /boot/apps/BeBochs1.4
$ ./bochs
Answer three times with RETURN and with some patience you will see OBOS
booting.
Vendored Executable
+37
View File
@@ -0,0 +1,37 @@
#!/bin/sh
#
# configure
#
# No parameters for now.
platform=`uname`
# BeOS
if [ "${platform}" == "BeOS" ] ; then
# GGC_PATH
if [ "x${GCC_PATH}" == "x" ] ; then
gcclib=`gcc -print-libgcc-file-name`
GCC_PATH=`dirname ${gcclib}`
fi
# Linux
else if [ "${platform}" == "Linux" ] ; then
# GGC_PATH
if [ "x${GCC_PATH}" == "x" ] ; then
gcclib=`gcc -print-libgcc-file-name`
GCC_PATH=`dirname ${gcclib}`
fi
# Unknown platform
else
echo Unsupported platform: ${platform}
exit 1
fi; fi
# Generate BuildConfig
cat << EOF > BuildConfig
# BuildConfig
# Note: This file has been automatically generated by configure.
GCC_PATH = ${GCC_PATH} ;
EOF
@@ -0,0 +1,147 @@
<HTML>
<!-- $Id: BMessageQueueUseCases.html,v 1.1 2002/07/09 12:24:30 ejakowatz Exp $ -->
<HEAD>
<TITLE>BMessageQueue Use Cases and Implementation Details</TITLE>
</HEAD>
<BODY BGCOLOR="white" LINK="#000067" VLINK="#000067" ALINK="#0000FF">
<FONT FACE="Verdana,Arial,Helvetica,sans-serif" SIZE="-1">
<H1>BMessageQueue Use Cases and Implementation Details:</H1>
<P>This document describes the BMessageQueue interface and some basics of how it is implemented.
The document has the following sections:</P>
<OL>
<LI><A HREF="#interface">BMessageQueue Interface</A></LI>
<LI><A HREF="#usecases">BMessageQueue Use Cases</A></LI>
<LI><A HREF="#implement">BMessageQueue Implementation</A></LI>
</OL>
<A NAME="interface"></A><H2>BMessageQueue Interface:</H2>
<P>The BMessageQueue class is a simple class for managing a queue of BMessages. The best
source of information for the BMessageQueue interface can be found
<A HREF="file:///boot/beos/documentation/Be%20Book/The%20Application%20Kit/MessageQueue.html">here in the Be Book</A>.
</P>
<A NAME="usecases"></A><H2>BMessageQueue Use Cases:</H2>
<P>The following use cases cover the BMessageQueue functionality:</P>
<OL>
<LI><P><B>Construction:</B> A BMessageQueue does not take any arguments when it is constructed.
After construction, the queue is empty.</P></LI>
<LI><P><B>Destruction:</B> When a BMessageQueue is deconstructed, all BMessages on the queue are
deleted. This implies that all BMessages added to a BMessageQueue must be allocated on the heap
with the new operation. The BMessageQueue is locked before performing the delete to ensure
that the queue doesn't change while it is being deleted. The lock is never released from the
destructor to ensure that any AddMessage() or other members blocking for the lock never
succeed in getting the lock. They will fail once the BMessageQueue is completely deleted.</P></LI>
<LI><P><B>Add Message 1:</B> When AddMessage() is used to put a BMessage on the queue, the
BMessageQueue takes ownership of the BMessage. The BMessage should be created on the heap but
there is no checking to ensure that has happened. The BMessageQueue records the order in
which the BMessages are added to the queue.</P></LI>
<LI><P><B>Add Message 2:</B> No check is performed to see if the BMessage is already part of that
BMessageQueue or any other when AddMessage() is used to put a BMessage on a queue. An attempt to
add a BMessage to a BMessageQueue which already has that same BMessage in it (where equality is
based on the address of the BMessage) will corrupt the queue. An attempt to add a BMessage to a
BMessageQueue when that BMessage is already in another BMessageQueue will corrupt the original
BMessageQueue. It is up to the caller of AddMessage() to use RemoveMessage() to prevent
queue corruption.</P></LI>
<LI><P><B>Add Message 3:</B> BMessage's can be added using AddMessage() from multiple threads
at the same time with no risk of queue corruption. Similarly, RemoveMessage() or NextMessage()
can be executing from another thread while an AddMessage() is started without corrupting the queue.
An AddMessage() attempt will block if another thread has used the Lock() member to lock the
BMessageQueue.</P></LI>
<LI><P><B>Remove Message 1:</B> The RemoveMessage() member takes a BMessage pointer. The
BMessageQueue is searched for this BMessage pointer. If that pointer is in the queue, then it
is removed from the queue. The BMessage is not deleted (note the BeBook implies it is but in
fact it is not). If the BMessage pointer is not on this BMessageQueue, this call has no affect.
After this call completes successfully, it is as though AddMessage() was never called for
this BMessage pointer.</P></LI>
<LI><P><B>Remove Message 2:</B> BMessage's can be removed using RemoveMessage() from multiple
threads at the same time with no risk of queue corruption. Similarly, AddMessage() or
NextMessage() can be executing from another thread while a RemoveMessage() is started without
corrupting the queue. A RemoveMessage() attempt will block if another thread has used the Lock()
member to lock the BMessageQueue.</P></LI>
<LI><P><B>Count Messages:</B> The CountMessages() member function returns the number of BMessage's
in the BMessageQueue. If there are no messages on the queue (an example of this situation is just
after construction), the member returns 0. Note, it is possible for the count to become corrupted
if the situation in Add Message 2 occurs.</P></LI>
<LI><P><B>Is Empty:</B> The IsEmpty() member function returns true if there are no BMessages on the
BMessageQueue. If there are one or more BMessages on the BMessageQueue, it returns false.</P></LI>
<LI><P><B>Find Message 1:</B> The FindMessage() member function is overloaded. If the member
function takes a single int32 argument, it is used to return the BMessage on the queue at a
particular index as indicated by the argument. The first message is at index 0, the second
at index 1 etc. If no message is at that index, NULL is returned.</P></LI>
<LI><P><B>Find Message 2:</B> The other FindMessage() member function takes a single uint32
argument and an optional int32 argument. The first mandatory argument specifies the "what" code
for the BMessage being searched for. The second optional argument specifies what occurance of
that "what" code in a BMessage on the queue should be returned. If the second argument is not
provided, it is assumed to be 0. If the second argument is 0, the first BMessage that has the
what code provided is returned. If the second argument is 1, the second BMessage that has the
what code provided is returned, etc. If no match is found, NULL is returned.</P></LI>
<LI><P><B>Lock 1:</B> The Lock() member function blocks until this thread can acquire exclusive
access to the BMessageQueue. Only one thread can hold the lock at any one time. A thread can
acquire the Lock() multiple times but release it the same number of times. While a thread holds
the lock, other threads will not be able to perform AddMessage(), RemoveMessage() or NextMessage().
Any threads attempting to do so will block until the BMessageQueue is unlocked.</P></LI>
<LI><P><B>Lock 2:</B> The Lock() member function returns true if the lock has successfully been
acquired. It will return false if an unrecoverable error has occurred. An example of such an
error would be deleting the BMessageQueue.</P></LI>
<LI><P><B>Unlock:</B> The Unlock() member function releases a lock on the BMessageQueue. If the
thread no longer holds any locks on the BMessageQueue, other threads are free to acquire the
BMessageQueue lock or call member functions like AddMessage(), RemoveMessage(), NextMessage() or
delete the BMessageQueue.</P></LI>
<LI><P><B>Next Message 1:</B> The NextMessage() member function removes the BMessage which is the
oldest on the queue. It returns that BMessage to the caller. After the call completes, the
BMessage is no longer on the queue and the next oldest BMessage is at the front of the queue
(ie next to be returned by NextMessage()).</P></LI>
<LI><P><B>Next Message 2:</B> BMessage's can be removed using NextMessage() from multiple
threads at the same time with no risk of queue corruption. Similarly, AddMessage() or
RemoveMessage() can be executing from another thread while a NextMessage() is started without
corrupting the queue. A NextMessage() attempt will block if another thread has used the Lock()
member to lock the BMessageQueue.</P></LI>
</OL>
<A NAME="implement"></A><H2>BMessageQueue Implementation:</H2>
<P>Internally, the BMessageQueue uses a BLocker to ensure that member functions like AddMessage(),
RemoveMessage() and NextMessage() do not corrupt the queue when used from multiple threads. The
same BLocker is used to implemented the Lock() and Unlock() members.</P>
<P>Testing with a debugger shows that the queue is implemented using a "link" pointer in the
BMessage class itself. Each BMessage is also a singly linked list which represents the queue.
All the BMessageQueue needs is a pointer to the BMessage which starts the list. For performance
reasons, it is worth maintaining a pointer to the BMessage at the end of the list and the count
of the number of elements in the list. If these are not maintained, adding an element to the
list will get slower as the number of elements grows and the cost to determine the number of
elements in the list will be high.</P>
<P>Because the BMessageQueue uses the link pointer which is a private part of the BMessage class,
the BMessageQueue must be a friend class of BMessage. Checking the headers, this is in fact the
case in Be's implementation. Although friendship in classes can cause some pretty serious long
term headaches if abused (and I am not convinced that this is an abuse), the OpenBeOS
implementation will follow the same implementation for now.</P>
</BODY>
</HTML>
@@ -0,0 +1,48 @@
<HTML>
<HEAD>
<TITLE>PortLink Use Cases and Implementation Details</TITLE>
</HEAD>
<BODY BGCOLOR="white" LINK="#000067" VLINK="#000067" ALINK="#0000FF">
<FONT FACE="Verdana,Arial,Helvetica,sans-serif" SIZE="-1">
<H1>PortLink Use Cases:</H1>
<P>This document describes the PortLink interface and some basics of how it is implemented.
The document has the following sections:</P>
<OL>
<LI><A HREF="#interface">PortLink Interface</A></LI>
<LI><A HREF="#usecases">PortLink Use Cases</A></LI>
</OL>
<A NAME="interface"><H2>PortLink Interface:</H2>
<P>The PortLink class is a lightweight class designed to ease the pain of sending a message to a port. Normal use boils down to creating a PortLink object, setting the message code, attaching any extra data via Attach(), and calling Flush() to send it.
</P>
<P>While this class is designed to facilitate port-based messaging, it does not devise any protocols for such. The recipient will need to know if data is included in a message, for example. Likewise, all extra data must be freed by the recipient.
</P>
<A NAME="usecases"><H2>PortLink Use Cases:</H2>
<P>The following use cases cover the PortLink functionality:</P>
<OL>
<LI><P><B>Construction:</B> A PortLink is created by passing it a port ID. Error-checking is not performed on the port itself, so be sure it is a valid port.
</P></LI>
<LI><P><B>Destruction:</B> When a PortLink is destroyed, any data which is currently attached to a pending message is freed.</P></LI>
<LI><P><B>Creating a message:</B> Creating a message can be as simple as setting the message code (similar to BMessage's <i>what</i> member). Extra data is not required.</P></LI>
<LI><P><B>Attaching Data:</B> Adding extra data is as simple as calling the member function Attach(), which makes a copy of the parameter passed to it.</P></LI>
<LI><P><B>Sending a message:</B> Call Flush(). Whatever opcode has been set will be sent to the target. Optionally, a timeout (in microseconds) of type bigtime_t can be specified. This can be useful in preventing deadlocks if the target has crashed and its port fills up.</P></LI>
<LI><P><B>Synchronous Messaging:</B> This one requires a little more care in order to prevent deadlocks. Attachments may be used as with Flush(), but FlushWithReply() will wait until the target replies unless a timeout value is specified in microseconds of type bigtime_t. A return code of B_ERROR indicates an internal data error and your message is intact. If a reply times out, it will return B_TIMED_OUT. Otherwise, it returns B_OK.
<P>
<i>Reply Protocol:</i> The target will receive the message with all attached data with one slight modification to the otherwise chosen message protocol - the first item will be a port_id which is the port to which the sender is to reply. All other attached data (if any) immediately follows this port id.
</li>
</OL>
<h6>HTML Documentation Format by Jeremy Rand</h6>
</BODY>
</HTML>
+54
View File
@@ -0,0 +1,54 @@
<HTML>
<HEAD>
<TITLE>Documentation and Resources for writing BeOS File Systems</TITLE>
</HEAD>
<BODY text="#000000" link="#0000FF" bgcolor="#FFFFFF">
<H1>Hints for BeOS File System Authors</H1>
<P>Besides the example DOS file system that comes with the BeOS developers
stuff, there's also a CD-ROM file system example. If you installed the
optional stuff on the BeOS 5.0 Pro CD-ROM (or the developer's kit from the free
site), it's at: /boot/optional/sample-code/add-ons/iso9660
<P>On <A HREF="http://www.bebits.com/">BeBits</A> you can get source code
examples from a few programs, such as AtheOS FS (<A
HREF="http://www.bebits.com/app/2028">app 2028 on BeBits</A>). There used to
be a copy of NTFS too with source (<A HREF="http://www.bebits.com/app/620">app
620 on BeBits</A>), but the site seems to be down. There are also other file
systems there, but source is not included (some have it available on request).
<P>Another useful source of information is the <A
HREF="http://www.be.com/developers/dev_lib/index.html">BeOS developer library
web site</A>. It has some articles on file systems, the most relevant being
the <A
HREF="http://www-classic.be.com/aboutbe/benewsletter/volume_III/Issue20.html#Insight">One
File Network File System</A>, which shows one way of combining a user space
program with a kernel file system stub. Another good one is <A
HREF="http://www-classic.be.com/aboutbe/benewsletter/Issue52.html#Insight">about
the FSP</A> (file system protocol). The prior issue describes what <A
HREF="http://www-classic.be.com/aboutbe/benewsletter/Issue51.html#Insight">features
the BFS supports</A>. There are lots of other tangentially related articles,
such as ones on device drivers, programming in kernel mode, debugging, etc.
<P>There's also the very good <CITE>Practical File System Design</CITE> book
by Dominic Giampaolo, from <A HREF="http://www.mkp.com/">Morgan Kaufmann
Publishers</A>, read their <A
HREF="http://www.mkp.com/books_catalog/catalog.asp?ISBN=1-55860-497-9">catalog
entry</A> for more info about the book.
<P>Finally, there's <A
HREF="http://www.google.com/search?q=%22Alexander+G.+M.+Smith%22">Alexander G.
M. Smith</A>'s ongoing documentation of the file system API, condensed from all
these sources and from his continuing experiences with trying to write a RAM
file system. You can get the StyledEdit text file with the <A
HREF="http://www.achilles.net/~agmsmith/beos/FileSystemAPINotes20011018.zip">October
18 2001 version</A> or check the <A
HREF="http://www.achilles.net/~agmsmith/beos/">BeOS directory</A> on his site
for newer versions.
<P><FONT SIZE="-1">Last updated November 11, 2001 by AGMS.</FONT>
</BODY>
</HTML>
+165
View File
@@ -0,0 +1,165 @@
Drive Setup Design Document
Contents
--------
1 General
2 Display View
3 Menus
3.1 Mount
3.2 Unmount
3.3 Setup
3.4 Options
3.5 Rescan
4 Partition View
4.1 Intel
4.2 Apple
1: General
----------
- When the app starts up, it pops up a dialog while scanning for devices.
- The window is resizeable.
- There doesn't seem to be any way to get the information that I need
easily: I suspect that some direct reading of the partition map is
needed. For now, a fake struct with the info I need will suffice.
2: Display View
---------------
The display view displays information about the drives that the system knows
about. The following information is shown:
- Device: Where the device is mounted on the system. For example, my floppy
drive is at /dev/disk/floppy.
- Map Style: Either apple or intel, depending on which type the media is.
- Partition type: Empty for a drive.
- File System: Comma seperated list of the File Systems on the selected
device.
- Volume Name: Comma seperated list of the Volume Names of the partitions on
the selected device.
- Mounted At: Comma seperated list of the mount points of the partitions on
the selected device.
- Size: Total size of the media at the selected device.
Selecting a drop down arrow on a device shows a list of partitions on the media
in the device. The following information is shown:
- Device: Empty for a partition.
- Map Style: Empty for a partition.
- Partition type: The type of the partition.
- File System: The file system on that partition.
- Volume Name: The name of the partition.
- Mounted At: The mount point of the partition.
- Size: The size of the partition.
3: Menus
--------
Mount
- Only available when there is a partition available to mount on the selected
drive.
*Mount All Partitions
- Shortcut: Alt-M
- Action: Mounts all unmounted partitions on the selected drive.
*[List of partitions on the selected drive, with mounted partitions greyed
out and unmounted partitions selectable]
- Action: Mounts the selected partition on the selected drive.
Unmount
- Only available when there is a mounted partition on the selected drive.
*[List of mounted partitions on the selected drive, with all mounted partitions
selectable except /boot]
- Action: Unmounts the selected partition.
Setup
- Only available when the selected drive has valid media in it: example, a
hard drive, or a floppy drive with a disk in.
*Format
- Shortcut: Alt-F
- Action: Formats the drive.
*Partition
- Action: Opens sub menu.
*apple...
- Action: Allows partitioning of apple hard drives, using an apple-like
interface.
*intel...
- Action: Allows partitioning of intel hard drives.
*Initialize
- Action: Opens sub menu.
*[List of partitions on the selected drive, with unmounted partitions
selectable]
- Action: Opens sub menu.
*[List of supported formats to initialize the drive to.]
- Current list of formats:
- Be File System...
- cdda...
- cifs...
- DOS/FAT...
- ext2...
- Mac HFS...
- iso9660...
- NTFS...
- Old Be File System...
- uspacefs...
- Possibly this section should be dynamically created, with initializing
code done in a plug-in type way, so other formats can be easily added.
- Action: Initializes the selected partition.
Options
- Only available when the selected drive has valid media in it: example, a
hard drive, or a floppy drive with a disk in.
*Eject
- Only available if the selected drive has removable media.
- Shortcut: Alt-E
- Action: Ejects the media.
*Surface Test
- Shortcut: Alt-T
- Action: Performs a surface test on the media.
Rescan
*IDE
- Action: Rescans the IDE chain for new media/devices/whatever.
*SCSI
- Action: Rescans the SCSI chain for new media/devices/whatever.
Context Sensitive Right Click Menu
- Available by right clicking on a drive in the display view.
- Allows access to the Mount, Unmount, Setup, and Options menus, with the
same "selectability" as above - if the menu is not selectable on the main'
menu bar, it is not selectable on this context menu.
4: Partition View
-----------------
- The partition view is brought up when "Partition" is chose from the Setup
menu.
- If the selected drive has partitions that are currently mounted, a dialog
is brought up explaining that the partition map can not be modified, only
viewed, and offering a choice to cancel or proceed. If the user proceeds,
all of the UI components are set to an inactive state, except for the
Cancel and Ok buttons.
Intel
- The top part of the view shows the device path.
- The middle section of the view shows the partitions, the type (in a text
box), a readable explanation of the type number in a drop down menu, and
a checkbox indicating the state of the Active flag.
- The bottom section of the view consists of a slide bar for each partition,
allowing the user to set the size of the partitions. Each slide bar can
be locked or unlocked, which disallows or allows movement of the slide bar.
- The button actions are Revert, Cancel, and Ok.
Apple
- (I have no apple partitions available, help needed!!)
+5
View File
@@ -0,0 +1,5 @@
TODO:
* make the unmount menu build off of the selected drive,
rather than all mounted partitions
+16
View File
@@ -0,0 +1,16 @@
Font Pref App
ISSUES
* Rescanning fonts causes the bold font to lose its boldness.
* Fixed width font selector should only show fixed width fonts
TODO
* When a style is selected, the font menu label needs to be updated to reflect this
* make a cache panel function that updates the slider labels with an int as a parameter
* Add the VMSettings code so that the panel uses the settings file for position/size
Matt McMinn
[email protected]
+112
View File
@@ -0,0 +1,112 @@
<documentation>
<appName>Fonts</appName>
<version>0.8</version>
<author>
<name>Matt McMinn</name>
<email>[email protected]</email>
<homePage>http://home.earthlink.net/~melfina/</homePage>
</author>
<description>
It's just a copy of the fonts preferences app that comes with BeOS.
</description>
<issues>
<issue>
<id>1</id>
<description>
Rescanning fonts causes the bold font to lose its boldness.
</description>
<relatedInfo />
</issue>
<issue>
<id>2</id>
<description>
Fixed width font selector should only show fixed width fonts.
</description>
<relatedInfo>
<note>
Should be relatively easy - just filter the fonts.
</note>
</relatedInfo>
</issue>
</issues>
<todoList>
<todo>
<id>1</id>
<forVersion>0.9</forVersion>
<description>
When a style is selected, the font menu label needs to be
updated to reflect this.
</description>
<relatedInfo />
</todo>
<todo>
<id>2</id>
<forVersion>0.9</forVersion>
<description>
Make a cache panel function that updates the slider labels with
an int as a parameter.
</description>
<relatedInfo />
</todo>
<todo>
<id>3</id>
<forVersion>0.9</forVersion>
<description>
Add the VMSettings code so that the panel uses the settings
file for position/size.
</description>
<relatedInfo />
</todo>
<todo>
<id>4</id>
<forVersion>0.9</forVersion>
<description>
Update the default fonts on close.
</description>
<relatedInfo />
</todo>
</todoList>
</documentation>
+181
View File
@@ -0,0 +1,181 @@
<html>
<header>
<title>Maintaining Binary Compatibility</title>
</header>
<body>
<h1>Binary Compatibility in 3 Easy Steps!<hr></h1>
<h2>An Introduction</h2>
In the early days of the OpenBeOS project, a debate raged concerning one of the projects
primary goals: maintaining binary compatibility with BeOS R5. The idea was that the
only way an effort to rewrite BeOS would be successful was if folks could continue
running the apps they already had. Certainly, a lot of software available for BeOS is
open source or actively maintained -- these apps could just be recompiled if necessary.
Others -- PostMaster, gobe's Productive suite and a few other crucial apps -- weren't
likely to get rebuilt, either because the original author had stopped maintainance
without being kind enough to release the source, or because it just wouldn't be
commercially feasible.<p>
Some said that we were crazy; that it couldn't be done. Thankfully, cooler heads
prevailed and we're well on our way to a binary compatible clone of R5.<p>
"But wait!" you cry. "How did the cooler heads which prevailed know that the holy grail
of binary compatibility was achievable?" I'm so glad you asked! Keeping reading and be
enlightened, Grasshopper.<p>
<h2>The Issues</h2>
There are three basic issues that have to be addressed to ensure binary compatibility:
<ul>
<li>
<b>Names must be identical</b><br>
This includes class and structure names as well as public, protected and global
function and variable names.
</li>
<li>
<b>Object sizes must be identical</b><br>
Classes must contain the same number of bytes of data; global variables must
be the same size. Maybe BGlobalVar should've been an <code>int32</code>
instead of an <code>int16</code>, but we're stuck with it now.
</li>
<li>
<b>Virtual function table layout must be identical</b><br>
The most cryptic and confusing aspect of maintaining binary compatibility.
The issue essentially boils down to this: for any given class, there must
be the same number of virtual functions, declared in the same order as the
original.
</li>
</ul>
<h2>The Nitty Gritty</h2>
"Good grief!" you say. "How on earth do I keep all this stuff straight?" Ah,
Grasshopper, it is easier that you might imagine. Just follow these steps, and you
should be binary compatible in no time!
<ol>
<li>
<b>Make a copy of the appropriate Be header file</b><br>
This is now your header file. You may need to change a thing or two, but what
you can (or will need to) change is quite limited, and discussed below.
</li>
<li>
<b>Implement public, protected and virtual functions</b><br>
In the course of doing this, you may discover that there are some private
non-virtual function declarations that you just don't use. Feel free to axe
them! Since they're private, nobody using the class will miss them, and
because they're not virtual, they don't effect the vtable layout. Conversely,
if you find a need to add some private, non-virtual functions, go right ahead
(for the very same reasons).
</li>
<li>
<b>Make sure you don't change the number of bytes used for data</b><br>
There are two situations that can make this seem difficult. First, there
may be data members that you don't use in your reimplementation. You can
just leave them (safe, but a little messy) or you can add the extra members'
bytes to the class's "unused" data array. An example will make this clear.<br>
Let's say we have a class BFoo:<br>
<code>
<pre>
class BFoo {
public:
BFoo();
void SomeFunc();
private:
int32 fBar;
char fZig;
int32 fQux;
int32 fUnused[2];
};
</pre>
</code>
The Be engineers that originally wrote this BFoo purposely added some data
padding in the form of an array of 2 <code>int32</code>s (they did this with
most classes in the API). Now let's suppose in your implementation, you
really didn't need <code>fQux</code>. You can add <code>fQux</code>'s bytes
into <code>fUnused</code>:<br>
<code>
<pre>
class BFoo
{
...
private:
int32 fBar;
char fZig;
int32 fUnused[3];
};
</pre>
</code>
Nothing could be easier! An additional twist that should be noted is that
data member order must also be preserved. In much the same way as existing
apps will "look" for virtual functions in a specific place in the vtable,
so will they "look" for data members in a specific place in an object.<br>
"But what if I don't need <code>fZig</code>, either?" you wonder. "It's only
one byte, not four like an <code>int32</code>!" Have no fear! Just rename it
"<code>fUnusedChar</code>" and be done with it.<p>
The second situation that can make preserving object size tricky is if there
aren't <i>enough</i> bytes of data available. Building on our cheesy BFoo
example, let's suppose that rather than getting rid of <code>fQux</code> and
<code>fZig</code>, you actually needed to <i>add</i> another 4
<code>int32</code>s worth of data: <code>fNewData1</code> through
<code>fNewData4</code>. The original implementation of BFoo has two extra
<code>int32</code>s which we can use, but that leaves us two <code>int32</code>s
short. What to do? The easiest thing to do is create a data structure to hold
your new data and convert one of the <code>fUnused</code> items into a pointer
to that structure:
<code>
<pre>
// Foo.h
struct _BFooData_;
class BFoo
{
public:
BFoo();
~BFoo();
void SomeFunc();
private:
int32 fBar;
char fZig;
_BFooData_* fNewData;
int32 fUnused[1];
};
// Foo.cpp
struct _BFooData_
{
int32 fNewData1;
int32 fNewData2;
int32 fNewData3;
int32 fNewData4;
};
BFoo::BFoo()
{
fNewData = new _BFooData_;
}
BFoo::~BFoo()
{
delete fNewData;
}
</pre>
</code>
Voila! More data without making the class bigger. Notice the added
destructor; make sure you're cleaning up your new (dynamically allocated) data.
</li>
</ol>
And there you have it: Binary Compatibility in 3 Easy Steps!<br>
Questions, comments, or corrections? Please let
<a href="mailto:[email protected]">me</a> know!<br>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
+140
View File
@@ -0,0 +1,140 @@
<html>
<Title>Interface Kit Team Process</Title>
<body>
<h1>Interface Kit Team Process</h1>
<p>
This paper deals with the set of requirements for reimplementing any portion of the BeOS
covered by the Interface Kit team's charter; namely, the Interface Kit, the Application
Kit, the app_server, and related preferences applets. &nbsp; This team's resposibilities
may broaden later to include more areas of the OS which are related (the input_server
comes to mind as a possibility). &nbsp; Since the mandate of the group covers such a
large and public (from a 3rd party developer's perspective) portion of BeOS -- a portion
that is central to the user and developer experience of BeOS -- it is vital that our work
be done in a scrupulously documented and tested fashion. &nbsp; This paper lays out the
process which, when adhered to, aims to ensure this high standard of documentation and
testability.
</p><p>
First, a definition of "module" as it pertains to this paper.
<p>
<b>Module:</b>
A function, class, kit, application or related set of functions, classes, kits or
applications is refered to as a "module" in this paper, the implication being that
there can be modules within modules. &nbsp; A module is any specifiable and testable
entity -- which may or may not rely on other modules to accomplish its functionality.
</p><p>
<h2>
Process Requirements
<hr align="left" width="25%">
</h2>
Each module in this project shall have the following items:
<ul>
<li>Complete interface specification. &nbsp; For kits, this will mostly come
from the BeBook, but in many cases the specification will have to elaborate
on what the BeBook provides or even be created entirely (app_server internals
are a good example).</li>
<li>Complete use case specification. &nbsp; For those not familiar with use cases,
they consist of the following:
<ul>
<li>A list of ways in which a module is expected to be used</li>
<li>Sublists of assumptions/prerequisites for each of those cases. &nbsp;
This should include items such as state of an object instance at the
time of method invocation, the state of parameters passed to functions,
etc.</li>
<li>Sublists of error conditions and handling for each case where
assumptions/prerequisites are not properly met. &nbsp; This list should
not attempt to be all inclusive: &nbsp; circumstances that do not
directly bear upon the assumptions/prerequisites do not need to be
considered unless clearly necessary.</li>
</ul></li>
<li>A set of unit tests which verify that the module performs correctly in expected
use cases as well as under error conditions as described in the use case
specification.</li>
<li>A plain-english discussion of how the module implements its functionality: &nbsp;
what algorithms are to be used, what other modules are relied upon, the general
design rationale, execution flow, etc.</li>
<li>The actual reimplementation.</li>
</ul>
Each of the above items is to be completed roughly in the order listed. &nbsp; In other
words, a given module should have a complete interface specification, etc., before it is
reimplemented. &nbsp; Prototyping is encouraged, of course. &nbsp; For existing APIs, the
recommended course is to write the interface spec, use case spec and unit tests to the
API. &nbsp; Unit tests, in particular, should perform as expected when run against the
existing API. &nbsp; When they do not, changes may need to be made to the specifications.
&nbsp; Our goal is to reimplement the APIs as they are, not necessarily as they're
documented -- and then ensure that the docs accurately reflect the reimplementation.
&nbsp; Thorough testing of the existing implementation will show us where the
documentation is wrong, misleading or absent, thereby helping to ensure that our
reimplementation is functionaly identical to the existing one.
<p>
<a href="http://www.xprogramming.com/ftp/TestingFramework/CppUnit/CppUnit15.zip">
CppTest</a>
is the test framework we will be using. &nbsp; By using this framework for all our unit
tests, we can easily build large test suites which will verify the codebase in a single
executed run. &nbsp; An excellent short discussion of the value of unit tests is here:<br>
<a href="http://www.extremeprogramming.org/rules/unittests.html">
http://www.extremeprogramming.org/rules/unittests.html</a>
<h2>
A Suggestion
<hr align="left" width="25%">
</h2>
Although the interface specification for each module should be completed first, I have a
suggestion for how to proceed from there which should make the remainder of the process
less boring. &nbsp; Rather than following the interface specification with a full set of
use cases followed by a full set of tests, a more productive and enjoyable way to go is
to take each module in turn, write one of the use cases/error conditions for it and
immediately write the test for that use case/error condition. &nbsp; This will break up
the tedious process of specifying all the use cases and error conditions with a bit of
coding -- not implementation code, but code nonetheless.
<h2>
Some Final Thoughts
<hr align="left" width="25%">
</h2>
This process is a very rigorous approach to take. &nbsp; Given that our goal is to produce
the most stable, robust and professional desktop operating system available, this sort of
thoroughness is justifiable and necessary. &nbsp; Our understanding of the system will be
greatly increased and the task of coming up to speed on the system will be made much
easier for outsiders and newcomers to the project.
<p>
This approach is also not the most "fun": &nbsp; sitting down and hacking out code has the
attraction of instant gratification that design work does not. &nbsp; It is important to
understand, however, that proper design work done up front makes the task of
implementation easier, the chore of integration much less onerous and testing and
code verification a snap. &nbsp; Provided we do not get locked in "analysis paralysis"
and attack the design work as vigorously as the coding work, the entire project will
actually move more quickly -- usually quite a bit more quickly -- than if we had simply
started coding. &nbsp; Thrown away versions of the codebase should be just that:
&nbsp; quick prototypes intended to be disposable, rather than full-blown implementation
attempts which fail or are mysterious blackboxes because we don't really understand the
module. &nbsp; Following this process makes it far more likely that when we sit down to
do a module implementation, the first try will be the last (bug fixes not withstanding,
of course ;).
</p><p>
To ensure the process is followed and we produce the highest quality code we can, code
will not be accepted for release until all of the process items are covered. &nbsp; If
this seems like a hardline stance to take, remember: &nbsp; every single app which
utilizes the Application and Interface Kits relies on our code to be rock solid --
totally predictable and completely reliable. &nbsp; Let's strive to be engineers, not
h4X0rz.
</p>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
+391
View File
@@ -0,0 +1,391 @@
<HTML>
<!-- $Id: UnitTestingInfo.html,v 1.1 2002/07/09 12:24:30 ejakowatz Exp $ -->
<HEAD>
<TITLE>Unit Testing Information</TITLE>
</HEAD>
<BODY BGCOLOR="white" LINK="#000067" VLINK="#000067" ALINK="#0000FF">
<FONT FACE="Verdana,Arial,Helvetica,sans-serif" SIZE="-1">
<H1>Unit Testing Information:</H1>
<P>This document describes the "why's" and "how's" of unit testing for the AppKit team of the
OpenBeOS project. Although it is intended for the AppKit team, there is no reason other teams
couldn't use this information to develop a similar unit testing strategy.</P>
<P>The document has the following sections:</P>
<OL>
<LI><A HREF="#what">What is unit testing?</A></LI>
<LI><A HREF="#why">Why is unit testing important?</A></LI>
<LI><A HREF="#when">When should I write my unit tests?</A></LI>
<LI><A HREF="#whattests">What kinds of tests should be in a unit test?</A></LI>
<LI><A HREF="#testframework">What framework is being used to do unit testing for the AppKit?</A></LI>
<LI><A HREF="#frameworkmods">What AppKit specific modifications have been made to this framework?</A></LI>
<LI><A HREF="#futuremods">What framework modifications might be required in the future?</A></LI>
<LI><A HREF="#buildingtests">How do I build the framework and current tests for the AppKit?</A></LI>
<LI><A HREF="#runningtests">How do I run tests?</A></LI>
<LI><A HREF="#writingtests">How do I write tests for my component?</A></LI>
<LI><A HREF="#exampletests">Are there example tests to base mine on?</A></LI>
<LI><A HREF="#threadedtests">How do I write a test with multiple threads?</A></LI>
</OL>
<A NAME="what"></A><H2>What is unit testing?</H2>
<P>Unit testing is the process of showing that a part of a software system works as far as the
requirements created for that part of the system. Unit testing is best if it has the following
characteristics:</P>
<UL>
<LI>The software component is tested in isolation with as little interaction with other software
components as possible.</LI>
<LI>The software component is tested using automated tools so that unit tests can be run with
every build of the software if required.</LI>
<LI>All requirements of the software component are tested as part of the unit tests.</LI>
</UL>
<P>Unit testing is not the only type of testing but is definitely a very important part of any
testing strategy. Following unit testing, software should go through "integration testing" to
show that the components work as expected when put together.</P>
<A NAME="why"></A><H2>Why is unit testing important?</H2>
<P>A basic concept of software engineering is that the cost of fixing a bug goes up by a factor
of 2-10x (depending on the source of the information) the later in the development process it is
found. Unit testing is critical to finding implementation bugs within a particular component as
quickly as possible.</P>
<P>Unit testing will also help to find requirements problems also. If you write the requirements
(or use cases) for your component from the BeBook, hopefully the BeBook and your use cases will
match the actual Be implementation. A good way to confirm that the BeBook documentation matches
Be's implementation is to write your unit tests and run them against the original Be code.</P>
<P>Unit tests will also continue to be maintained and run in the future also. As the mailing
lists obviously show, many people are looking forward to OpenBeOS post-R1 when new features
will be introduced above and beyond BeOS R5. These unit tests will be critical to ensuring that
any new feature or even just a bug fix doesn't break existing functionality.</P>
<P>Speaking of bug fixes, consider adding unit tests for any bugs you identify that slipped
through your original unit test suite. This will ensure that this bug or a similar one is not
re-introduced in the future.</P>
<P>Finally, unit testing is not the be all, end all of testing. As mentioned above, integration
testing must be done to show that software components work together. If all unit tests cover
all requirements and have run successfully against all components, then a failure has to be
due to a bug in the interaction of two or more known working software components.</P>
<A NAME="when"></A><H2>When should I write my unit tests?</H2></LI>
<P>As the AppKit process document describes the recommended order for implementing a component
is:</P>
<OL>
<LI>Write an interface specification</LI>
<LI>Write the use case specifications</LI>
<LI>Write the unit tests</LI>
<LI>Write an implementation plan</LI>
<LI>Write the code</LI>
</OL>
<P>Please see the AppKit process document for more details about the entire sequence. The unit
test are to be written once the use cases are written and before any implementation work is
done. The use cases must be done because they determine what the tests will be. You need to
write as many tests are required so that all use cases for that component are tested. The use
cases should be detailed enough that you can write your unit tests from them.</P>
<P>The unit tests are to be done before implementation for a very good reason. You should be able
to run these unit tests against the Be implementation and confirm that they all pass. If they do
not pass, then either there is a bug in the unit test itself or you have found a difference
between your use cases and the actual implementation. Even if your use cases match the BeBook,
if that is not how the actual Be implementation works, we must match the current implementation and
not the BeBook. You should go back and modify the use case. Change the use case so that it
matches Be's implementation and consider adding a note indicating this doesn't match the
BeBook.</P>
<P>Imagine if you completed the implementation and then wrote and ran the unit tests. If you run
the tests against your implementation and Be's implementation, you will notice the test passes
for your code but fails on Be's. At this point, you will have to change the implementation, change
the unit test and change the use case which is more work that if you write the unit tests before
the implementation. Worse, if you only ran the unit tests against your implementation and not
Be's, you may not notice the problem at all.</P>
<A NAME="whattest"></A><H2>What kinds of tests should be in a unit test?</H2>
<P>The unit tests you write should cover all the functionality of your software module. That
means your unit tests should include:</P>
<UL>
<LI>All standard expected functionality of the software component</LI>
<LI>All error conditions handled by the software component</LI>
<LI>Interaction with software components which cannot be decoupled from the target software
component</LI>
<LI>Concurrency tests to show that a software component which is expected to be thread safe (most
things are under BeOS) is safe and free from deadlocks.</LI>
</UL>
<A NAME="testframework"></A><H2>What framework is being used to do unit testing for the AppKit?</H2>
<P>The AppKit team has chosen to use CppUnit version 1.5 as the basis of all of our unit tests.
This framework provides very useful features and ensures that all unit tests for AppKit code
are consistent and can be executed from a single environment.</P>
<P>There are two key components to the framework. First, there is a library called libCppUnit.so
which provides all the C++ classes for defining your own testcases. Secondly, there is an
executable called "TestRunner" which is capable of executing a set of testcases.</P>
<P>For more information on CppUnit, please refer to
<A HREF="http://cppunit.sourceforge.net/">this website</A>
<A NAME="frameworkmods"></A><H2>What AppKit specific modifications have been made to this framework?</H2>
<P>The following are the modifications that have been introduced into the CppUnit v1.5
framework:</P>
<UL>
<LI>A makefile has been added for the library and the TestRunner.</LI>
<LI>Some "bugs" in CppUnit v1.5 which lead to it not compiling under BeOS v5.</LI>
<LI>The TestRunner has been modified to support BeOS based addons. Each test which you can
select from the TestRunner is found in the "add-ons" directory at runtime. The original
TestRunner required you to change the TestRunner when new tests were added to it.</LI>
<LI>Changed the output from TestRunner. The output includes a name of the test being run and
a run time for the test in microseconds.</LI>
<LI>Changed the arguments of the assert functions in the TestCase class from std::string to
const char *'s due to apparent concurrency problems with std::string under BeOS when testing
threaded tests.</LI>
<LI>Added locking to the TestResults class so that multiple threads can safely add result
information at the same time for a single test.</LI>
<LI>The ThreadedTestCaller class was written to allow us to write tests which contain multiple
threads. This is an important class because many BeOS components are thread safe and we need
to confirm that the OpenBeOS implementation is also thread safe.</LI>
</UL>
<P>This is the list of the important modifications done to CppUnit v1.5 at the time this document
is being written. For the latest information about modifications to CppUnit, check the code
which can be found in the OpenBeOS CVS repository.</P>
<A NAME="futuremods"></A><H2>What framework modifications might be required in the future?</H2>
<P>This framework will have to evolve as our needs grow. The main issues I think we need to
solve are:</P>
<UL>
<LI>The format of the test name is an encoded string representing the class definition of the
test class from gcc. It is not a very readable format but given that the test class is often
a template class and you would like different names for different instances of the template,
this seemed the best compromise. Suggestions welcome.</LI>
<LI>The threaded test support added into CppUnit forces you to specify the entry point for each
thread in your test. If you are doing a test with a BLooper or a BWindow, these classes start
a thread of their own. This thread will not be started through the standard entry point so
doing "assert's" from one of these threads will not work. Perhaps we need TestBLooper and
TestBWindow classes which will work with the assert's.</LI>
</UL>
<P>If you find you need some other features, feel free to add them to CppUnit.</P>
<A NAME="buildingtests"></A><H2>How do I build the framework and current tests for the AppKit?</H2>
<P>As of writing this document, you can build the framework and all the current AppKit tests
by performing the following steps:</P>
<OL>
<LI>Checkout the "app_kit" sources or the entire repository from the OpenBeOS CVS repository.
There is information at the OpenBeOS site about how to access the CVS repository.</LI>
<LI>In a terminal, "cd" into the "app_kit" directory in the CVS files you checked out.</LI>
<LI>Type "make".</LI>
</OL>
<P>Note that the build system for OpenBeOS is moving to jam so these steps may become obsolete.
When you the make has finished, you should find the following files:</P>
<UL>
<LI><CODE>app_kit/test/CppUnit/TestRunner</CODE> - this is the executable to use to execute
tests.</LI>
<LI><CODE>app_kit/test/CppUnit/lib/libCppUnit.so</CODE> - this is CppUnit library which your tests
must link against.</LI>
<LI><CODE>app_kit/test/CppUnit/lib/libopenbeos.so</CODE> - this is library which contains OpenBeOS
implementation of some Be classes (usually found in libbe.so, called libopenbeos.so to avoid a name
clash at runtime).</LI>
<LI><CODE>app_kit/test/add-ons/BAutolockTests</CODE> - this is the addon which contains the tests
which are run against the Be and OpenBeOS implementation of BAutolock.</LI>
<LI><CODE>app_kit/test/add-ons/BLockerTests</CODE> - this is the addon which contains the tests
which are run against the Be and OpenBeOS implementation of BLocker.</LI>
<LI><CODE>app_kit/test/add-ons/BMessageQueueTests</CODE> - this is the addon which contains the tests
which are run against the Be and OpenBeOS implementation of BMessageQueue.</LI>
</UL>
<P>These are the key files which ensure that the tests can be run.</P>
<A NAME="runningtests"></A><H2>How do I run tests?</H2>
<P>You have a few different options for how you run a test or a series of tests. Before you start
however, you must build the code as describe <A HREF="#buildingtests">in this section</A>. Once
it is built, you can run tests any of these ways:</P>
<UL>
<LI>Run "make test" from the app_kit directory. This will lead to all of the tests defined in
app_kit/test/add-ons directory to be run.</LI>
<LI>From the "app_kit/test" directory, execute the command "CppUnit/TestRunner -all". This will
lead to all of the tests defined in the app_kit/test/add-ons directory to be run and is the same
as what happens in the "make" example above. However, recompile any code that has changed in the
process.</LI>
<LI>From the "app_kit/test" directory, execute the command "CppUnit/TestRunner &lt;TestName&gt;"
where &lt;TestName&gt; is one of the addons found in the "app_kit/test/add-ons" directory. Only
the tests defined in that add-on will be run.</LI>
</UL>
<A NAME="writingtests"></A><H2>How do I write tests for my component?</H2>
<P>The first step to writing your tests is to develop a plan for how you will test the
functionality. For ideas of the kinds of tests you may want to consider, you should reference
<A HREF="#whattests">this section</A>.</P>
<P>Once you know the kinds of tests you want, you need to:</P>
<UL>
<LI><P>For every test you want, define a class which derives from the "TestCase" class in the
CppUnit framework.</P></LI>
<LI><P>Within each test class you define, create a "void setUp(void)" and "void tearDown(void)"
member function if required. If before executing your test, you need to perform some actions,
put those actions in the "setUp()" member. If you need to cleanup after your test, put those
actions in the "tearDown()" member.</P></LI>
<LI><P>Within each test class you define, create a member function which takes "void" and
returns "void". Within this member function, write the code to execute the test. Whenever you
want to ensure that some condition is true during your test, add a line within the member function
that looks like "assert(condition)". For example, if the variable "result" must have the value
B_OK at a particular point in your test, you should add a line which reads
"assert(result = B_OK)".</P></LI>
<LI><P>Create a constructor for all of your test classes that takes a "std::string name" argument
and pass that onto the TestCase parent class. Add whatever actions you need to take in the
constructor.</P></LI>
<LI><P>Create a destructor for all of your test classes and take whatever actions are
appropriate.</P></LI>
<LI><P>Within each test class you define, create a member with the signature
"static Test *suite(void)". For a simple test where only one test needs to be run for this class,
the contents of this member should look like:</P>
<PRE>
return(new TestCaller&lt;ClassName&gt;("", &amp;ClassName::MemberName));
</PRE>
<P>Replace "ClassName" with the name of your test class and "MemberName" with the name
of the member function you defined your test in. If you need to define more than one test to run
from this class, refer to instructions below on how to use the TestSuite class of CppUnit. If you
are creating a threaded test, refer to <A HREF="#threadedtests">this section</A>.</P></LI>
<LI><P>Create one ".cpp" file for defining the "addonTestFunc()" function. This function must
exist in global scope within your test addon. The contents of this ".cpp" file will look something
like:</P>
<PRE>
#include "TestAddon.h"
Test *addonTestFunc(void)
{
TestSuite *testSuite = new TestSuite("&lt;TestSuiteName&gt;");
testSuite-&gt;addTest(&lt;ClassName1&gt;::suite());
testSuite-&gt;addTest(&lt;ClassName2&gt;::suite());
/* etc */
return(testSuite);
}
</PRE>
<P>In the above example, replace &lt;TestSuiteName&gt; with an appropriate name for the group of
tests and &lt;ClassName1&gt; and &lt;ClassName2&gt; with the names of the test classes you have
defined.</P></LI>
<LI><P>Create a build system around a BeIDE project, Makefile or preferrably a jam file which
builds all the necessary code you have written into an addon.</P></LI>
<LI><P>Put this addon into the app_kit/test/add-ons directory and follow the above instructions
for how to run your tests.</P></LI>
</UL>
<A NAME="exampletests"></A><H2>Are there example tests to base mine on?</H2>
<P>There are example tests which you can find in the following directories:</P>
<UL>
<LI><CODE>app_kit/test/lib/application/BMessageQueue</CODE></LI>
<LI><CODE>app_kit/test/lib/support/BAutolock</CODE></LI>
<LI><CODE>app_kit/test/lib/support/BLocker</CODE></LI>
</UL>
<P>There are some things done in these tests which make things a bit more complex, but you may
want to do similar things:</P>
<UL>
<LI>Most tests use a ThreadedTestCaller class even in some situations when there aren't actually
more than one thread in the test.</LI>
<LI>All tests are defined as a template class. The test class is a template of the class to test
(if that makes sense to you). For example, to test both the Be and OpenBeOS BLocker and not
end up with a symbol conflict, the OpenBeOS implementation of BLocker is actually in a namespace
called "OpenBeOS". So, the tests must be run against the classes "::BLocker" and
"OpenBeOS::BLocker". The easiest way to do this was to make the class to be tested a template
and define it for both "::BLocker" and "OpenBeOS::BLocker".</LI>
</UL>
<P>Even with the complexity, I think this code provides a pretty good example of how to write
your tests.</P>
<A NAME="threadedtests"></A><H2>How do I write a test with multiple threads?</H2>
<P>If you have a test which you want to define that requires more than one thread of execution
(most likely a concurrency test of you code), you need to use the ThreadedTestCaller class.
The steps which differ from the above description on how to write a test case are:</P>
<UL>
<LI><P>In your test class, define a member function for each thread you will be starting. All of
these member functions must take "void" and return "void". If all the threads in your test
perform the exact same actions, it is OK to just define one member function. Usually in the
tests I have written, I have called these member functions "TestThread1()", "TestThread2()",
etc.</P></LI>
<LI><P>If your "static Test *suite()" function for your test class, you must return a
ThreadedTestCaller. Imagine that the test class name is "MyTestClass" and you want two threads
which run member functions "TestThread1()" and "TestThread2()". That code would look like:</P>
<PRE>
Test *MyTestClass::suite(void)
{
MyTestClass *theTest = new MyTestClass("");
ThreadedTestCaller&lt;MyTestClass&gt; *threadedTest = new TreadedTestCaller&lt;MyTestClass&gt;("", theTest);
threadedTest-&gt;addThread(":Thread1", &amp;MyTestClass::TestThread1);
threadedTest-&gt;addThread(":Thread2", &amp;MyTestClass::TestThread2);
return(threadedTest);
}
</PRE>
<P>If you need to, you can put a number of ThreadedTestCaller instances into a TestSuite and return
them in the suite() member function. Examples of this can be found in the BLocker and
BMessageQueue test examples.</P></LI>
</UL>
<P>Otherwise the steps are the same as for other tests. The code gets much more complex if you
define your test classes as templates as the examples do.</P>
</FONT>
</BODY>
</HTML>
Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1021 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1003 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 987 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

+43
View File
@@ -0,0 +1,43 @@
<html>
<head>
<title>Interface Kit Team Central</title>
</head>
<body>
<h1>Welcome to Interface Kit Team Central!</h1>
<p>
This is the IK Team's public face, where OpenBeOS folk and intrepid members of the
BeOS community can find such goodies as:
<ul>
<li>The IK Team <a href="IK_Process.html">Process</a></li>
<li>The IK Team <a href="schedule/index.html">Schedule</a>, including:
<ul>
<li><a href="schedule/index.html#CurrentStatus">Current Status</a></li>
<li>Project Milestones</li>
</ul>
</li>
<li>IK Team <a href="schedule/assignments.html">assignments</a></li>
<li>A tongue-in-cheek paper on
<a href="BinCompat.html">Maintaining Binary Compatibility</a>
</li>
<li>An article on <a href="UnitTestingInfo.html">unit testing</a> by Jeremy Rand
</li>
</ul>
With more sure to come.
<br>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,71 @@
<html>
<title>Schedule Rationale</title>
<body>
<h1>Schedule Rationale</h1>
Below is an informal discussion of the rationale behind the Interface Kit team's
behemoth schedule. Various details may not reflect the current form of the schedule,
but the basic gist is what's really important here.
<br>
<hr>
<p>
First, let me head off the suggestion that we formally split into 3 or 4 stand-alone
projects: &nbsp; the Interface Kit, Application Kit and app_server are completely
dependent on one another in a way that no other set of system components is. Each
without the others can accomplish almost *nothing*; I think the existence of Integration
highlights this fact.
</p><p>
Each milestone listed has a number of tasks associated with it; these need to be listed
and the time for each estimated. These tasks should be as fine grained as possible.
Taking BView as an example, I would expect each method on BView to have its own entry
under milestones 1, 2, 3, 4 and 8 with entries added as necessary to milestones 18 to
22. "Why so detailed?" you say. I'm glad you asked. ;)
</p><p>
First off, the finer the schedule's granularity, the more realistic estimate you have for
the project as a whole. Asked to implement BView, one might be tempted to say "Oh, about
3 weeks," whereas an estimate of the time needed for each method might yield a total of
two to three times that. While the more realistic overall estimate may be more depressing
initially, being able to hit goals on or near the estimated date is much better for
morale in the long run than constantly being behind because all the estimates were too
low. Trust me on this, I've worked on *way* too many projects that went south because of
scheduling that was too broad -- usually because the project manager doesn't want to
"distress" the client by making them pay for the time to schedule correctly. Or design
correctly, but that's a different rant. =)
</p><p>
Second, a fine-grained schedule helps to ensure that nothing gets missed. You might
think it would be hard to forget to implement a BView method, but if you don't expressly
schedule for that method, there will be no interface, use case or technical specifications
or unit tests to fail because the method isn't doing anything. In fact, we might not
notice the missing functionality until some app that uses it dies a horrible death and
we have to figure out why.
</p><p>
Third, it helps us figure out what functionality is dependent on what -- which helps us
schedule our tasks in a logical sequence.
</p><p>
Fourth, it makes it much easier for someone that doesn't have a lot of time available or
much experience to pick something that they can tackle and know that they will be making
a meaningful contribution. It also makes it easier for us to keep track of who is doing
what on large items like BView: instead of saying "there's a bunch of stuff on BView
that needs doing," we can say "BView::StrokeEllipse() needs to be implemented" and know
that a specific person is responsible for that deliverable.
</p><p>
Fifth, as daunting as a detailed schedule looks like out of the gate, tasks are getting
completed *constantly* and it's very satisfying to see progress get made on a regular
basis. Ideally, one would like to be able to check on the progress each week and find
several items completed since the last time it was checked.
</p>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,165 @@
<html>
<head>
<title>Application Kit Milestones</title>
</head>
<body>
<h1>Application Kit Milestones<hr></h1>
<ol>
<li>
Interface specs completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="4" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="196" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="right">2%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Use cases completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="4" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="196" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">2%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Unit tests completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="4" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="196" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">2%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Design discussions completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="4" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="196" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">2%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
<a href="Messaging.html">Messaging</a> complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="38" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="162" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">19%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
<li>
<a href="BHandler.html">BHandler</a> complete
<li>
<a href="BLooper.html">BLooper</a> complete
<li>
<a href="Roster.html">Roster</a> complete
<li>
<a href="Clipboard.html">Clipboard</a> complete
<li>
<a href="BCursor.html">BCursor</a> complete
<li>
<a href="ScriptingSupport.html">Scripting Support</a> complete
</li>
<li>
Alpha
</li>
<li>
Beta 1
</li>
<li>
Beta 2
</li>
<li>
Release Candidate 1
</li>
<li>
1.0!
</li>
</ol>
<!-- Not implemented yet
See the complete list of <a href="ApplicationKitTasks.html">Application Kit tasks</a>.
<br>
-->
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,305 @@
<html>
<head>
<title>BCursor Tasks</title>
</head>
<body>
<h1>BCursor Tasks<hr></h1>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BCursor
</td>
<!-- owner -->
<td width="25%">
Gabe Yoder
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BCursor Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BCursor(const void* cursorData);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BCursor(BMessage* data);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BCursor();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t Archive(BMessage* into, bool deep = true) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
static BArchivable* Instantiate(BMessage* data);
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,930 @@
<html>
<head>
<title>BHandler Tasks</title>
</head>
<body>
<h1>BHandler Tasks<hr></h1>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BHandler
</td>
<!-- owner -->
<td width="25%">
Erik Jaesler
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BHandler Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BHandler(const char* name = NULL);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BHandler(BMessage* data);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BHandler();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
static BArchivable* Instantiate(BMessage* data);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t Archive(BMessage* data, bool deep = true) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual void MessageReceived(BMessage* message);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BLooper* Looper() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void SetName(const char* name);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
const char* Name() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual void SetNextHandler(BHandler* handler);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BHandler* NextHandler() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual void AddFilter(BMessageFilter* filter);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual bool RemoveFilter(BMessageFilter* filter);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual void SetFilterList(BList* filters);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BList* FilterList();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool LockLooper();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t LockLooperWithTimeout(bigtime_t timeout);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void UnlockLooper();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual BHandler* ResolveSpecifier(BMessage* msg, int32 index, BMessage* specifier, int32 form, const char* property);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t GetSupportedSuites(BMessage* data);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StartWatching(BMessenger, uint32 what);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StartWatchingAll(BMessenger);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StopWatching(BMessenger, uint32 what);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StopWatchingAll(BMessenger);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StartWatching(BHandler* , uint32 what);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StartWatchingAll(BHandler* );
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StopWatching(BHandler* , uint32 what);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StopWatchingAll(BHandler* );
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual void SendNotices(uint32 what, const BMessage* = 0);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool IsWatched() const;
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,555 @@
<html>
<head>
<title>Clipboard Tasks</title>
</head>
<body>
<h1>Clipboard Tasks<hr></h1>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BClipboard
</td>
<!-- owner -->
<td width="25%">
Gabe Yoder
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BClipboard Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BClipboard(const char* name, bool transient = false);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BClipboard();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
const char* Name() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
uint32 LocalCount() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
uint32 SystemCount() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StartWatching(BMessenger target);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StopWatching(BMessenger target);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool Lock();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void Unlock();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool IsLocked() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Clear();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Commit();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Revert();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BMessenger DataSource() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BMessage* Data() const;
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,955 @@
<html>
<head>
<title>Roster Tasks</title>
</head>
<body>
<h1>Roster Tasks<hr></h1>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BRoster
</td>
<!-- owner -->
<td width="25%">
Joe Banafato
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BRoster Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BRoster();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
~BRoster();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool IsRunning(const char* mime_sig) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool IsRunning(entry_ref* ref) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
team_id TeamFor(const char* mime_sig) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
team_id TeamFor(entry_ref* ref) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void GetAppList(BList* team_id_list) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void GetAppList(const char* sig, BList* team_id_list) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t GetAppInfo(const char* sig, app_info* info) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t GetAppInfo(entry_ref* ref, app_info* info) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t GetRunningAppInfo(team_id team, app_info* info) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t GetActiveAppInfo(app_info* info) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t FindApp(const char* mime_type, entry_ref* app) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t FindApp(entry_ref* ref, entry_ref* app) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Broadcast(BMessage* msg) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Broadcast(BMessage* msg, BMessenger reply_to) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StartWatching(BMessenger target, uint32 event_mask = B_REQUEST_LAUNCHED | B_REQUEST_QUIT) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t StopWatching(BMessenger target) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t ActivateApp(team_id team) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Launch(const char* mime_type, BMessage* initial_msgs = NULL, team_id* app_team = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Launch(const char* mime_type, BList* message_list, team_id* app_team = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Launch(const char* mime_type, int argc, char** args, team_id* app_team = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Launch(const entry_ref* ref, const BMessage* initial_message = NULL, team_id* app_team = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Launch(const entry_ref* ref, const BList* message_list, team_id* app_team = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t Launch(const entry_ref* ref, int argc, const char* const* args, team_id* app_team = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void GetRecentDocuments(BMessage* refList, int32 maxCount, const char* ofType = NULL, const char* openedByAppSig = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void GetRecentDocuments(BMessage* refList, int32 maxCount, const char* ofTypeList[], int32 ofTypeListCount, const char* openedByAppSig = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void GetRecentFolders(BMessage* refList, int32 maxCount, const char* openedByAppSig = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void GetRecentApps(BMessage* refList, int32 maxCount) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void AddToRecentDocuments(const entry_ref* doc, const char* appSig = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void AddToRecentFolders(const entry_ref* folder,const char* appSig = NULL) const;
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,580 @@
<html>
<head>
<title>Scripting Support Tasks</title>
</head>
<body>
<h1>Scripting Support Tasks<hr></h1>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BPropertyInfo
</td>
<!-- owner -->
<td width="25%">
Jeremy Rand
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BPropertyInfo Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BPropertyInfo(property_info* p = NULL, value_info* ci = NULL, bool free_on_delete = false);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BPropertyInfo();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual int32 FindMatch(BMessage* msg, int32 index, BMessage* spec, int32 form, const char* prop, void* data = NULL) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual bool IsFixedSize() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual type_code TypeCode() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ssize_t FlattenedSize() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t Flatten(void* buffer, ssize_t size) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual bool AllowsTypeCode(type_code code) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t Unflatten(type_code c, const void* buf, ssize_t s);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
const property_info* Properties() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
const value_info* Values() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
int32 CountProperties() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
int32 CountValues() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void PrintToStream() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
static bool FindCommand(uint32, int32, property_info* );
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
static bool FindSpecifier(uint32, property_info* );
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,789 @@
<html>
<head>
<title>Interface Kit Team Assignments</title>
</head>
<body>
<h1>
Interface Kit Team Assignments and Open Tasks
<hr>
</h1>
<h2>
Assignments:
</h2>
<table>
<tr>
<td>
Erik Jaesler
</td>
</tr>
<tr>
<td>
</td>
<td>
BMessageFilter
</td>
</tr>
<tr>
<td>
</td>
<td>
BHandler
</td>
</tr>
<tr>
<td>
</td>
<td>
BLooper
</td>
</tr>
<tr>
<td>
</td>
<td>
BAlert
</td>
</tr>
<tr>
<td>
</td>
<td>
BArchivable
</td>
</tr>
<tr>
<td>
</td>
<td>
BArchivable
</td>
</tr>
<tr>
<td>
</td>
<td>
BApplication
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Gabe Yoder
</td>
</tr>
<tr>
<td>
</td>
<td>
BClipboard
</td>
</tr>
<tr>
<td>
</td>
<td>
BCursor
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Graham Gilmore
</td>
</tr>
<tr>
<td>
</td>
<td>
BBlockCache
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Graham Macdonald
</td>
</tr>
<tr>
<td>
</td>
<td>
BPictureButton
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Greg Gelfond
</td>
</tr>
<tr>
<td>
</td>
<td>
BPoint
</td>
</tr>
<tr>
<td>
</td>
<td>
BShape
</td>
</tr>
<tr>
<td>
</td>
<td>
BStringItem
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Issac Yonemoto
</td>
</tr>
<tr>
<td>
</td>
<td>
BRect
</td>
</tr>
<tr>
<td>
</td>
<td>
BRegion
</td>
</tr>
<tr>
<td>
</td>
<td>
BList
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Jeremy Rand
</td>
</tr>
<tr>
<td>
</td>
<td>
BMessageQueue
</td>
</tr>
<tr>
<td>
</td>
<td>
BPropertyInfo
</td>
</tr>
<tr>
<td>
</td>
<td>
BDeskbar
</td>
</tr>
<tr>
<td>
</td>
<td>
BAutoLock
</td>
</tr>
<tr>
<td>
</td>
<td>
BLocker
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Joe Banafato
</td>
</tr>
<tr>
<td>
</td>
<td>
BRoster
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Justin Gasper
</td>
</tr>
<tr>
<td>
</td>
<td>
BMenu
</td>
</tr>
<tr>
<td>
</td>
<td>
BMenuBar
</td>
</tr>
<tr>
<td>
</td>
<td>
BMenuItem
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Marc Flerackers
</td>
</tr>
<tr>
<td>
</td>
<td>
BControl
</td>
</tr>
<tr>
<td>
</td>
<td>
BButton
</td>
</tr>
<tr>
<td>
</td>
<td>
BCheckBox
</td>
</tr>
<tr>
<td>
</td>
<td>
BRadioButton
</td>
</tr>
<tr>
<td>
</td>
<td>
BTab
</td>
</tr>
<tr>
<td>
</td>
<td>
BTabView
</td>
</tr>
<tr>
<td>
</td>
<td>
BBox
</td>
</tr>
<tr>
<td>
</td>
<td>
BStatusBar
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Staffan Hellstrom
</td>
</tr>
<tr>
<td>
</td>
<td>
BPolygon
</td>
</tr>
<tr>
<td>
</td>
<td>
BSlider
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Steve Vallee
</td>
</tr>
<tr>
<td>
</td>
<td>
BDataIO
</td>
</tr>
<tr>
<td>
</td>
<td>
BMallocIO
</td>
</tr>
<tr>
<td>
</td>
<td>
BMemoryIO
</td>
</tr>
<tr>
<td>
</td>
<td>
BPositionIO
</td>
</tr>
<tr>
<td>
</td>
<td>
Misc
</td>
</tr>
<tr>
<td>
</td>
<td>
BString Utility
</td>
</tr>
<tr>
<td>
</td>
<td>
BString
</td>
</tr>
<tr>
<td>
</td>
<td>
BStopWatch
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Ulrich Wimboeck
</td>
</tr>
<tr>
<td>
</td>
<td>
BListItem
</td>
</tr>
<tr>
<td>
</td>
<td>
BListView
</td>
</tr>
<tr>
<td>
</td>
<td>
BOutlineListView
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
William Bull
</td>
</tr>
<tr>
<td>
</td>
<td>
BMessage
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Xavier Castellan
</td>
</tr>
<tr>
<td>
</td>
<td>
BBitmap
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
</table>
<h2>
Open Tasks:
</h2>
<table>
<tr>
<td>
Application Kit
</td>
</tr>
<tr>
<td>
</td>
<td>
BInvoker
</td>
</tr>
<tr>
<td>
</td>
<td>
BMessageRunner
</td>
</tr>
<tr>
<td>
</td>
<td>
BMessenger
</td>
</tr>
<tr>
<td>
</td>
<td>
BMessenger Support
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Integration
</td>
</tr>
<tr>
<td>
</td>
<td>
BWindow
</td>
</tr>
<tr>
<td>
</td>
<td>
BView
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td>
Interface Kit
</td>
</tr>
<tr>
<td>
</td>
<td>
BPicture
</td>
</tr>
<tr>
<td>
</td>
<td>
BScreen
</td>
</tr>
<tr>
<td>
</td>
<td>
BShapeIterator
</td>
</tr>
<tr>
<td>
</td>
<td>
Screen Support
</td>
</tr>
<tr>
<td>
</td>
<td>
BFont
</td>
</tr>
<tr>
<td>
</td>
<td>
Font Support
</td>
</tr>
<tr>
<td>
</td>
<td>
BColorControl
</td>
</tr>
<tr>
<td>
</td>
<td>
BStringView
</td>
</tr>
<tr>
<td>
</td>
<td>
BScrollBar
</td>
</tr>
<tr>
<td>
</td>
<td>
BScrollView
</td>
</tr>
<tr>
<td>
</td>
<td>
Scrollbar Config
</td>
</tr>
<tr>
<td>
</td>
<td>
BSeparatorItem
</td>
</tr>
<tr>
<td>
</td>
<td>
BMenuField
</td>
</tr>
<tr>
<td>
</td>
<td>
BPopUpMenu
</td>
</tr>
<tr>
<td>
</td>
<td>
Menu Config
</td>
</tr>
<tr>
<td>
</td>
<td>
BTextView
</td>
</tr>
<tr>
<td>
</td>
<td>
BTextControl
</td>
</tr>
<tr>
<td>
</td>
<td>
unicode_block
</td>
</tr>
<tr>
<td>
</td>
<td>
Deskbar Support
</td>
</tr>
<tr>
<td>
</td>
<td>
Mouse Config
</td>
</tr>
<tr>
<td>
</td>
<td>
Workspace Support
</td>
</tr>
<tr>
<td>
</td>
<td>
Keyboard Config
</td>
</tr>
<tr>
<td>
</td>
<td>
UI Color Info
</td>
</tr>
<tr>
<td>
</td>
<td>
Miscellaneous
</td>
</tr>
<tr>
<td>
</td>
<td>
BDragger
</td>
</tr>
<tr>
<td>
</td>
<td>
BShelf
</td>
</tr>
<tr>
<td>
</td>
<td>
BChannelControl
</td>
</tr>
<tr>
<td>
</td>
<td>
BChannelSlider
</td>
</tr>
<tr>
<td>
</td>
<td>
BMultiChannelControl
</td>
</tr>
<tr>
<td>
</td>
<td>
BOptionControl
</td>
</tr>
<tr>
<td>
</td>
<td>
BOptionPopUp
</td>
</tr>
<tr>
<td height="15" colspan="2"></td>
</tr>
</table>
<br>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
+147
View File
@@ -0,0 +1,147 @@
<html>
<head>
<title>Interface Kit Team Schedule</title>
</head>
<body>
<h1>Interface Kit Team Schedule<hr></h1>
<p>
Here is the schedule for the Interface Kit Team. To help organize our work,
tasks have been broken into 4 general areas:
<ul>
<li><a href="ApplicationKit/ApplicationKitMilestones.html">Application Kit</a></li>
<li><a href="InterfaceKit/InterfaceKitMilestones.html">Interface Kit</a></li>
<li><a href="Integration/IntegrationMilestones.html">Integration</a></li>
<li><a href="SupportKit/SupportKitMilestones.html">Support Kit</a></li>
</ul>
</p><p>
Organizationally, it's best to consider these as separate projects within the
scope of the IK Team's charter. As such, core contributors should pick a
project and stick with it -- it will make things a lot easier to keep track of,
and losing track of stuff would be a bad thing. =)
</p><p>
DarkWyrm is the technical lead for the app_server; he has done an enormous amount
of research and he is currently in the best position to lead the effort.
</p><p>
Erik Jakowatz will continue in his capacity as overall project lead, as well as
being directly involved in Integration as technical lead.
</p><p>
A word of warning: this schedule is downright huge because of the sheer number of
items to be completed. There is a paper available in which the rationale behind the
schedule is <a href="Discussion.html">discussed</a>.
</p>
<hr>
<h2><a name="CurrentStatus"></a>Current Status</h2>
Here are some fuzzy indicators of what progress the team has made base on the number of
outstanding tasks completed. No warranty is made concerning the accuracy of these
graphs. =)
<br><br>
<!-- And here we go into table madness! -->
<table cellspacing="0">
<!-- sub-project header -->
<tr>
<td colspan="3" align="left"><strong>Overall</strong></td>
</tr>
<!-- progress graph -->
<tr>
<table cellspacing="0">
<tr>
<!-- how much is done -->
<td width="24" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="176" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">12%</td>
</tr>
</table>
</tr>
<!-- sub-project header -->
<tr>
<td colspan="3" align="left"><strong><br><br>Application Kit</strong></td>
</tr>
<!-- progress graph -->
<tr>
<table cellspacing="0">
<tr>
<!-- how much is done -->
<td width="4" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="196" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">2%</td>
</tr>
</table>
</tr>
<!-- sub-project header -->
<tr>
<td colspan="3" align="left"><strong><br><br>Interface Kit</strong></td>
</tr>
<!-- progress graph -->
<tr>
<table cellspacing="0">
<tr>
<!-- how much is done -->
<td width="8" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="192" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">4%</td>
</tr>
</table>
</tr>
<!-- sub-project header -->
<tr>
<td colspan="3" align="left"><strong><br><br>Integration</strong></td>
</tr>
<!-- progress graph -->
<tr>
<table cellspacing="0">
<tr>
<!-- how much is done -->
<td width="50" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="150" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">25%</td>
</tr>
</table>
</tr>
<!-- sub-project header -->
<tr>
<td colspan="3" align="left"><strong><br><br>Support Kit</strong></td>
</tr>
<!-- progress graph -->
<tr>
<table cellspacing="0">
<tr>
<!-- how much is done -->
<td width="40" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="160" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">20%</td>
</tr>
</table>
</tr>
</table>
<br>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,513 @@
<html>
<head>
<title>BArchivable Tasks</title>
</head>
<body>
<h1>BArchivable Tasks<hr></h1>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BArchivable
</td>
<!-- owner -->
<td width="25%">
Erik Jaesler
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BArchivable
</td>
<!-- owner -->
<td width="25%">
Erik Jaesler
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BArchivable Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BArchivable();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BArchivable(BMessage* from);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
~BArchivable();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t Archive(BMessage* into, bool deep = true) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
static BArchivable* Instantiate(BMessage* from);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t Perform(perform_code d, void* arg); ???
</td>
</tr>
<!-- Functions header -->
<tr>
<td colspan="7"><center><strong>BArchivable Functions</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BArchivable* instantiate_object(BMessage* from, image_id* id);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BArchivable* instantiate_object(BMessage* from);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool validate_instantiation(BMessage* from, const char* class_name);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
instantiation_func find_instantiation_func(const char* class_name, const char* sig);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
instantiation_func find_instantiation_func(const char* class_name);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
instantiation_func find_instantiation_func(BMessage* archive_data);
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,156 @@
<html>
<head>
<title>Integration Milestones</title>
</head>
<body>
<h1>Integration Milestones<hr></h1>
<ol>
<li>
Interface specs completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="50" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="150" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="right">25%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Use cases completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="50" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="150" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">25%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Unit tests completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="50" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="150" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">25%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Design discussions completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="50" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="150" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">25%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
<a href="BArchivable.html">BArchivable</a> complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="200" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="0" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">100%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
<li>
<a href="BApplication.html">BApplication</a> complete
<li>
<a href="BWindow.html">BWindow</a> complete
<li>
<a href="BView.html">BView</a> complete
</li>
<li>
Alpha
</li>
<li>
Beta 1
</li>
<li>
Beta 2
</li>
<li>
Release Candidate 1
</li>
<li>
1.0!
</li>
</ol>
<!-- Not implemented yet
See the complete list of <a href="IntegrationTasks.html">Integration tasks</a>.
<br>
-->
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,195 @@
<html>
<head>
<title>Interface Kit Milestones</title>
</head>
<body>
<h1>Interface Kit Milestones<hr></h1>
<ol>
<li>
Interface specs completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="6" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="194" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="right">3%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Use cases completed for all classes, functions, structs
</li>
<li>
Unit tests completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="4" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="196" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">2%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Design discussions completed for all classes, functions, structs
</li>
<li>
<a href="Group1Support.html">Group 1 Support</a> complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="50" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="150" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">25%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
<li>
<a href="Group2Support.html">Group 2 Support</a> complete
<li>
<a href="Group3Support.html">Group 3 Support</a> complete
<li>
<a href="ControlWidgets.html">Control Widgets</a> complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="16" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="184" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">8%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
<li>
<a href="Non-ControlWidgets.html">Non-Control Widgets</a> complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="26" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="174" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">13%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
<li>
<a href="ScrollingSupport.html">Scrolling Support</a> complete
<li>
<a href="MenuingSupport.html">Menuing Support</a> complete
<li>
<a href="ListViewSupport.html">ListView Support</a> complete
<li>
<a href="TextViewSupport.html">TextView Support</a> complete
<li>
<a href="Miscellaneous.html">Miscellaneous</a> complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="8" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="192" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">4%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
<li>
<a href="ReplicantSupport.html">Replicant Support</a> complete
<li>
<a href="AdvancedControlWidgets.html">Advanced Control Widgets</a> complete
</li>
<li>
Alpha
</li>
<li>
Beta 1
</li>
<li>
Beta 2
</li>
<li>
Release Candidate 1
</li>
<li>
1.0!
</li>
</ol>
<!-- Not implemented yet
See the complete list of <a href="InterfaceKitTasks.html">Interface Kit tasks</a>.
<br>
-->
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,339 @@
<html>
<head>
<title>BStopWatch Tasks</title>
</head>
<body>
<h1>BStopWatch Tasks<hr></h1>
<!-- master table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task</strong></th>
<th><strong>Owner</strong></th>
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>Class BStopWatch</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BStopWatch(const char *name, bool silent = false);
</td>
<!-- owner -->
<td>
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BStopWatch();
</td>
<!-- owner -->
<td>
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void Suspend();
</td>
<!-- owner -->
<td>
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void Resume();
</td>
<!-- owner -->
<td>
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bigtime_t Lap();
</td>
<!-- owner -->
<td>
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bigtime_t ElapsedTime() const;
</td>
<!-- owner -->
<td>
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void Reset();
</td>
<!-- owner -->
<td>
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
const char* Name() const;
</td>
<!-- owner -->
<td>
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>Hosted by:</small><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002 OpenBeOS Project</small>
</center>
</body>
</html>
@@ -0,0 +1,904 @@
<html>
<head>
<title>IO Tasks</title>
</head>
<body>
<h1>IO Tasks<hr></h1>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BDataIO
</td>
<!-- owner -->
<td width="25%">
Steve Vallee
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BMallocIO
</td>
<!-- owner -->
<td width="25%">
Steve Vallee
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BMemoryIO
</td>
<!-- owner -->
<td width="25%">
Steve Vallee
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BPositionIO
</td>
<!-- owner -->
<td width="25%">
Steve Vallee
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BDataIO Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BDataIO
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BDataIO();
</td>
</tr>
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BMallocIO Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BMallocIO();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BMallocIO();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ssize_t ReadAt(off_t pos, void *buffer, size_t size);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ssize_t WriteAt(off_t pos, const void *buffer, size_t size);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual off_t Seek(off_t pos, uint32 seek_mode);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual off_t Position() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t SetSize(off_t size);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void SetBlockSize(size_t blocksize);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
const void* Buffer() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
size_t BufferLength() const;
</td>
</tr>
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BMemoryIO Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BMemoryIO(void *p, size_t len);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BMemoryIO(const void *p, size_t len);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BMemoryIO();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ssize_t ReadAt(off_t pos, void *buffer, size_t size);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ssize_t WriteAt(off_t pos, const void *buffer, size_t size);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual off_t Seek(off_t pos, uint32 seek_mode);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual off_t Position() const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t SetSize(off_t size);
</td>
</tr>
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BPositionIO Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BPositionIO();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BPositionIO();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ssize_t Read(void *buffer, size_t size);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ssize_t Write(const void *buffer, size_t size);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual status_t SetSize(off_t size);
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,168 @@
<html>
<head>
<title>Support Kit Milestones</title>
</head>
<body>
<h1>Support Kit Milestones<hr></h1>
<ol>
<li>
Interface specs completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="32" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="168" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="right">16%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Use cases completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="32" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="168" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">16%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Unit tests completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="32" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="168" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">16%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Design discussions completed for all classes, functions, structs
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="32" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="168" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">16%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
<a href="IO.html">IO</a> complete
<li>
<a href="Utilities.html">Utilities</a> complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="6" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="194" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">3%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
<li>
<a href="Synchronization.html">Synchronization</a> complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="120" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="80" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">60%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
</li>
<li>
Alpha
</li>
<li>
Beta 1
</li>
<li>
Beta 2
</li>
<li>
Release Candidate 1
</li>
<li>
1.0!
</li>
</ol>
<!-- Not implemented yet
See the complete list of <a href="SupportKitTasks.html">Support Kit tasks</a>.
<br>
-->
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,688 @@
<html>
<head>
<title>Synchronization Tasks</title>
</head>
<body>
<h1>Synchronization Tasks<hr></h1>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BAutoLock
</td>
<!-- owner -->
<td width="25%">
Jeremy Rand
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
BLocker
</td>
<!-- owner -->
<td width="25%">
Jeremy Rand
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BAutoLock Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BAutolock(BLocker *lock);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BAutolock(BLocker &lock);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BAutolock(BLooper *looper);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
~BAutolock();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/blank-20.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool IsLocked();
</td>
</tr>
<!-- Class header -->
<tr>
<td colspan="7"><center><strong>BLocker Class</strong></center></td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BLocker();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BLocker(const char *name);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BLocker(bool benaphore_style);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BLocker(const char *name, bool benaphore_style);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
BLocker(const char *name, bool benaphore_style, bool);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
virtual ~BLocker();
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool Lock(void);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
status_t LockWithTimeout(bigtime_t timeout);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
void Unlock(void);
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
thread_id LockingThread(void) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
bool IsLocked(void) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
int32 CountLocks(void) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
int32 CountLockRequests(void) const;
</td>
</tr>
<tr>
<td>
<table>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
../../images/Check.gif
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
sem_id Sem(void) const;
</td>
</tr>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,83 @@
<html>
<head>
<title>Interface Kit Team Assignments</title>
</head>
<body>
<h1>
Interface Kit Team Assignments and Open Tasks
<hr>
</h1>
<h2>
Assignments:
</h2>
<table>
<scripting>
@for_each engineer in $Assignments.engineers
<tr>
<td>
$engineer.name
</td>
</tr>
@for_each etask in $engineer.tasks
<tr>
<td>
</td>
<td>
$etask.str
</td>
</tr>
@end
<tr>
<td height="15" colspan="2"></td>
</tr>
@end
</scripting>
</table>
<h2>
Open Tasks:
</h2>
<table>
<scripting>
@for_each section in $Assignments.sections
<tr>
<td>
$section.name
</td>
</tr>
@for_each stask in $section.tasks
<tr>
<td>
</td>
<td>
$stask.str
</td>
</tr>
@end
<tr>
<td height="15" colspan="2"></td>
</tr>
@end
</scripting>
</table>
<br>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,167 @@
<html>
<head>
<scripting>
<title>$GROUP.name Milestones</title>
</scripting>
</head>
<body>
<scripting>
<h1>$GROUP.name Milestones<hr></h1>
</scripting>
<ol>
<li>
Interface specs completed for all classes, functions, structs
<scripting>
@if $GROUP.ispec_complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="$GROUP.ispec_table_complete" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="$GROUP.ispec_table_incomplete" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="right">$GROUP.ispec_complete%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
@end
</scripting>
</li>
<li>
Use cases completed for all classes, functions, structs
<scripting>
@if $GROUP.cases_complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="$GROUP.cases_table_complete" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="$GROUP.cases_table_incomplete" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">$GROUP.cases_complete%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
@end
</scripting>
</li>
<li>
Unit tests completed for all classes, functions, structs
<scripting>
@if $GROUP.tests_complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="$GROUP.tests_table_complete" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="$GROUP.tests_table_incomplete" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">$GROUP.tests_complete%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
@end
</scripting>
</li>
<li>
Design discussions completed for all classes, functions, structs
<scripting>
@if $GROUP.tspec_complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="$GROUP.tspec_table_complete" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="$GROUP.tspec_table_incomplete" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">$GROUP.tspec_complete%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
@end
</scripting>
</li>
<scripting>
@for_each milestone in $GROUP.milestones
<li>
<a href="$milestone.short_name##.html">$milestone.name</a>$milestone.note complete
@if $milestone.complete
<!-- Copy this table to each item when work begins on it -->
<!-- progress graph -->
<table cellspacing="0">
<tr>
<!-- spacer -->
<td width=10"></td>
<!-- how much is done -->
<td width="$milestone.table_complete" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="$milestone.table_incomplete" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="35" align="right">$milestone.complete%</td>
</tr>
</table>
<br><br>
<!-- end progress graph -->
@end
@end
</li>
</scripting>
<li>
Alpha
</li>
<li>
Beta 1
</li>
<li>
Beta 2
</li>
<li>
Release Candidate 1
</li>
<li>
1.0!
</li>
</ol>
<!-- Not implemented yet
<scripting>
See the complete list of <a href="$GROUP.short_name##Tasks.html">$GROUP.name tasks</a>.
</scripting>
<br>
-->
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,100 @@
<html>
<head>
<title>Interface Kit Team Schedule</title>
</head>
<body>
<h1>Interface Kit Team Schedule<hr></h1>
<p>
Here is the schedule for the Interface Kit Team. To help organize our work,
tasks have been broken into 4 general areas:
<ul>
<scripting>
@for_each group in $GROUPS
<li><a href="$group.short_name/$group.short_name##Milestones.html">$group.name</a>$group.note</li>
@end
</scripting>
</ul>
</p><p>
Organizationally, it's best to consider these as separate projects within the
scope of the IK Team's charter. As such, core contributors should pick a
project and stick with it -- it will make things a lot easier to keep track of,
and losing track of stuff would be a bad thing. =)
</p><p>
DarkWyrm is the technical lead for the app_server; he has done an enormous amount
of research and he is currently in the best position to lead the effort.
</p><p>
Erik Jakowatz will continue in his capacity as overall project lead, as well as
being directly involved in Integration as technical lead.
</p><p>
A word of warning: this schedule is downright huge because of the sheer number of
items to be completed. There is a paper available in which the rationale behind the
schedule is <a href="Discussion.html">discussed</a>.
</p>
<hr>
<h2><a name="CurrentStatus"></a>Current Status</h2>
Here are some fuzzy indicators of what progress the team has made base on the number of
outstanding tasks completed. No warranty is made concerning the accuracy of these
graphs. =)
<br><br>
<!-- And here we go into table madness! -->
<table cellspacing="0">
<!-- sub-project header -->
<tr>
<td colspan="3" align="left"><strong>Overall</strong></td>
</tr>
<!-- progress graph -->
<tr>
<table cellspacing="0">
<tr>
<!-- how much is done -->
<scripting>
<td width="$GROUPS.table_complete" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="$GROUPS.table_incomplete" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">$GROUPS.complete%</td>
</scripting>
</tr>
</table>
</tr>
<scripting>
@for_each group in $GROUPS
<!-- sub-project header -->
<tr>
<td colspan="3" align="left"><strong><br><br>$group.name</strong></td>
</tr>
<!-- progress graph -->
<tr>
<table cellspacing="0">
<tr>
<!-- how much is done -->
<td width="$group.table_complete" bgcolor="blue" align="left"></td>
<!-- how much is left -->
<td width="$group.table_incomplete" bgcolor="red" align="right"></td>
<!-- the above two translated into a percentage -->
<td width="25" align="center">$group.complete%</td>
</tr>
</table>
</tr>
@end
</scripting>
</table>
<br>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,29 @@
<html>
<head>
<scripting>
<title>$GROUP.name Tasks</title>
</scripting>
<head>
<body>
<scripting>
<h1>$GROUP.name Tasks<hr></h1>
@for_each milestone in $GROUP.milestones
<a href="$milestone.short_name##Tasks.html">$milestone.name</a><br>
@end
</scripting>
<hr>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
@@ -0,0 +1,254 @@
<html>
<head>
<scripting>
<title>$MILESTONE.name Tasks</title>
</head>
<body>
<h1>$MILESTONE.name Tasks<hr></h1>
</scripting>
<!-- summary table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th><strong>Task Summary</strong></th>
<th><strong>Owner</strong></th>
<scripting>
@for_each s in $MILESTONE
<tr>
<td>
<table>
<td><img src="
@if $s.is_ispec_complete
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
@if $s.is_cases_complete
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
@if $s.is_tests_complete
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
@if $s.is_tspec_complete
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
@if $s.is_impl_complete
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td width="100%">
$s.name
</td>
<!-- owner -->
<td width="25%">
$s.owner
</td>
</tr>
@end
</scripting>
</table>
<br>
<br>
<br>
<br>
<br>
<!-- detail table -->
<table border>
<!-- table column headers -->
<th>
<table>
<td>
<a href="#legend">
<img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/User.gif" width="22" height="22" alt="Use Cases" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec" border="0">
</a>
</td>
<td>
<a href="#legend">
<img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation" border="0">
</a>
</td>
</table>
</th>
<th width="100%"><strong>Task Details</strong></th>
<!-- <th><strong>Owner</strong></th> -->
<scripting>
@for_each s in $MILESTONE
<!-- $s.type header -->
<tr>
<td colspan="7"><center><strong>$s.name $s.type</strong></center></td>
</tr>
@for_each t in $s.tasks
<tr>
<td>
<table>
<td><img src="
@if $t.ispec
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Functional Spec"></td>
<td><img src="
@if $t.cases
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Use Cases"></td>
<td><img src="
@if $t.tests
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Unit Tests"></td>
<td><img src="
@if $t.tspec
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Technical Spec"></td>
<td><img src="
@if $t.impl
../../images/Check.gif
@else
../../images/blank-20.gif
@end
" width="22" height="22" alt="Implementation"></td>
</table>
</td>
<!-- task -->
<td>
$t.name
</td>
</tr>
@end
@end
</scripting>
</table>
<br><br>
<hr>
<br><br>
<!-- legend table -->
<a name="legend">
<table border>
<tr>
<td align="center"><strong>Legend</strong></td>
</tr>
<tr>
<td>
<table>
<tr>
<td><img src="../../images/DocumentDraw.gif" width="22" height="22" alt="Functional Spec"></td>
<td>Functional Spec</td>
</tr>
<tr>
<td><img src="../../images/User.gif" width="22" height="22" alt="Use Cases"></td>
<td>Use Cases</td>
</tr>
<tr>
<td><img src="../../images/Help.gif" width="22" height="22" alt="Unit Tests"></td>
<td>Unit Tests</td>
</tr>
<tr>
<td><img src="../../images/Hammer.gif" width="22" height="22" alt="Technical Spec"></td>
<td>Technical Spec</td>
</tr>
<tr>
<td><img src="../../images/GoalFlag.gif" width="22" height="22" alt="Implementation"></td>
<td>Implementation</td>
</tr>
<tr>
<td><img src="../../images/Check.gif" width="22" height="22" alt="Completed"></td>
<td>Completed</td>
</tr>
</table>
</td>
</tr>
</table>
</a>
<br>
<!-- The obligatory SourceForge plug -->
<center>
<small>The OpenBeOS project is hosted by:</small><br><br>
<a href="http://sourceforge.net">
<img src="http://sourceforge.net/sflogo.php?group_id=33869&type=1" width="88" height="31" border="0" alt="SourceForge Logo">
</a>
<p>
<small>Copyright &copy; 2001-2002
<a href="http://www.openbeos.org">OpenBeOS</a> Project</small>
</center>
</body>
</html>
+16
View File
@@ -0,0 +1,16 @@
BInputServerDevice::_ReservedInputServerDevice4(void)
BInputServerDevice::_ReservedInputServerDevice3(void)
BInputServerDevice::_ReservedInputServerDevice2(void)
BInputServerDevice::_ReservedInputServerDevice1(void)
BInputServerDevice::StopMonitoringDevice(char
BInputServerDevice::StartMonitoringDevice(char
BInputServerDevice::EnqueueMessage(BMessage
BInputServerDevice::UnregisterDevices(input_device_ref
BInputServerDevice::RegisterDevices(input_device_ref
BInputServerDevice::Control(char
BInputServerDevice::Stop(char
BInputServerDevice::Start(char
BInputServerDevice::SystemShuttingDown(void)
BInputServerDevice::InitCheck(void)
BInputServerDevice::~BInputServerDevice(void)
BInputServerDevice::BInputServerDevice(void)
+9
View File
@@ -0,0 +1,9 @@
BInputServerFilter::_ReservedInputServerFilter4(void)
BInputServerFilter::_ReservedInputServerFilter3(void)
BInputServerFilter::_ReservedInputServerFilter2(void)
BInputServerFilter::_ReservedInputServerFilter1(void)
BInputServerFilter::GetScreenRegion(BRegion
BInputServerFilter::Filter(BMessage
BInputServerFilter::InitCheck(void)
BInputServerFilter::~BInputServerFilter(void)
BInputServerFilter::BInputServerFilter(void)
+11
View File
@@ -0,0 +1,11 @@
BInputServerMethod::_ReservedInputServerMethod4(void)
BInputServerMethod::_ReservedInputServerMethod3(void)
BInputServerMethod::_ReservedInputServerMethod2(void)
BInputServerMethod::_ReservedInputServerMethod1(void)
BInputServerMethod::SetMenu(BMenu
BInputServerMethod::SetIcon(unsigned
BInputServerMethod::SetName(char
BInputServerMethod::EnqueueMessage(BMessage
BInputServerMethod::MethodActivated(bool)
BInputServerMethod::~BInputServerMethod(void)
BInputServerMethod::BInputServerMethod(char
+32
View File
@@ -0,0 +1,32 @@
**************** BInputServerDevice Section ***************
BInputServerDevice();
virtual ~BInputServerDevice();
virtual status_t InitCheck();
virtual status_t SystemShuttingDown();
virtual status_t Start(const char *device, void *cookie);
virtual status_t Stop(const char *device, void *cookie);
virtual status_t Control(const char *device, void *cookie, int32 code, BMessage *message);
status_t RegisterDevices(input_device_ref **devices);
status_t UnregisterDevices(input_device_ref **devices);
status_t EnqueueMessage(BMessage *message);
status_t StartMonitoringDevice(const char *device);
status_t StopMonitoringDevice(const char *device);
**************** BInputServerFilter Section *****************
BInputServerFilter();
virtual ~BInputServerFilter();
virtual status_t InitCheck();
virtual filter_result Filter(BMessage *message, BList *outList);
status_t GetScreenRegion(BRegion *region) const;
***************** BInputServerMethod Section *****************
BInputServerMethod(const char *name, const uchar *icon);
virtual ~BInputServerMethod();
virtual status_t MethodActivated(bool active);
status_t EnqueueMessage(BMessage *message);
status_t SetName(const char *name);
status_t SetIcon(const uchar *icon);
status_t SetMenu(const BMenu *menu, const BMessenger target);
+51
View File
@@ -0,0 +1,51 @@
Function Specifications
Public BInputServerDevice class interface:
BInputServerDevice();
virtual ~BInputServerDevice();
virtual status_t InitCheck();
virtual status_t SystemShuttingDown();
virtual status_t Start(const char *device, void *cookie);
virtual status_t Stop(const char *device, void *cookie);
virtual status_t Control(const char *device, void *cookie, uint32 code, BMessage *message);
status_t RegisterDevices(input_device_ref **devices);
status_t UnregisterDevices(input_device_ref **devices);
status_t EnqueueMessage(BMessage *message);
status_t StartMonitoringDevice(const char *device);
status_t StopMonitoringDevice(const char *device);
}
Public BInputServerFilter class interface:
BInputServerFilter();
virtual ~BInputServerFilter();
virtual status_t InitCheck();
virtual filter_result Filter(BMessage *message, BList *outList);
status_t GetScreenRegion(BRegion *region) const;
}
Public BInputServerMethod class interface:
BInputServerMethod(const char *name, const uchar *icon);
virtual ~BInputServerMethod();
virtual status_t MethodActivated(bool active);
status_t EnqueueMessage(BMessage *message);
status_t SetName(const char *name);
status_t SetIcon(const uchar *icon);
status_t SetMenu(const BMenu *menu, const BMessenger target);
}
@@ -0,0 +1,66 @@
class InputServer
{
InputServer(void);
~InputServer(void);
ArgvReceived(long, char**);
InitKeyboardMouseStates(void)
InitFilters(void)
InitMethods(void)
QuitRequested(void)
ReadyToRun(void)
MessageReceived(BMessage*);
HandleSetMethod(BMessage*);
HandleGetSetMouseType(BMessage*, BMessage*);
HandleGetSetMouseAcceleration(BMessage*, BMessage*);
HandleGetSetKeyRepeatDelay(BMessage*, BMessage*);
HandleGetKeyInfo(BMessage*, BMessage*);
HandleGetModifiers(BMessage*, BMessage*);
HandleSetModifierKey(BMessage*, BMessage*);
HandleSetKeyboardLocks(BMessage*, BMessage*);
HandleGetSetMouseSpeed(BMessage*, BMessage*);
HandleSetMousePosition(BMessage*, BMessage*);
HandleGetSetMouseMap(BMessage*, BMessage*);
HandleGetKeyboardID(BMessage*, BMessage*);
HandleGetSetClickSpeed(BMessage*, BMessage*);
HandleGetSetKeyRepeatRate(BMessage*, BMessage*);
HandleGetSetKeyMap(BMessage*, BMessage*);
HandleFocusUnfocusIMAwareView(BMessage*, BMessage*);
EnqueueDeviceMessage(BMessage*);
EnqueueMethodMessage(BMessage*);
UnlockMethodQueue(void);
LockMethodQueue(void);
SetNextMethod(bool);
SetActiveMethod(_BMethodAddOn_*);
MethodReplicant(void);
EventLoop(void*);
EventLoopRunning(void);
DispatchEvents(BList*);
CacheEvents(BList*);
GetNextEvents(BList*);
FilterEvents(BList*);
SanitizeEvents(BList*);
MethodizeEvents(BList*, bool);
StartStopDevices(char const*, input_device_type, bool); // device's name, type, 0 or 1 for start or stop)
ControlDevices(char const*, input_device_type, unsigned long, BMessage*);
DoMouseAcceleration(long*, long*);
SetMousePos(long*, long*, long, long);
SetMousePos(long*, long*, BPoint);
SetMousePos(long*, long*, float, float);
SafeMode(void)
private:
sEventLoopRunning
sSafeMode
fMouseState
}
+12
View File
@@ -0,0 +1,12 @@
Input_server threads
input_server(10-Normal Priority)
_input_server_event_loop_(103-Custom Priority)
ScreenSaver Looper(10-Normal Priority)
DevicesLooper(10-Normal Priority)
w>Team Monitor(120-Real Time Priority)
PS/2 Mouse(104-Custom Priority)
AT Keyboard(104-Custom Priority)
Legend:
w> This signifies that the thread is spawned from a parent process. (most likely from the input_server)
+149
View File
@@ -0,0 +1,149 @@
<BASE HREF="http://bedriven.be-in.org/articles/input_server/II_035-an%20introduction%20to%20the%20input%20server.html"><table border=1 width=100%><tr><td><table border=1 bgcolor=#ffffff cellpadding=10 cellspacing=0 width=100% color=#ffffff><tr><td><font face=arial,sans-serif color=black size=-1>This is <b><font color=#0039b6>G</font> <font color=#c41200>o</font> <font color=#f3c518>o</font> <font color=#0039b6>g</font> <font color=#30a72f>l</font> <font color=#c41200>e</font></b>'s <a href="http://www.google.com/help/features.html#cached"><font color=blue>cache</font></a> of <A HREF="http://bedriven.be-in.org/articles/input_server/II_035-an%20introduction%20to%20the%20input%20server.html"><font color=blue>http://bedriven.be-in.org/articles/input_server/II_035-an%20introduction%20to%20the%20input%20server.html</font></a>.<br>
<b><font color=#0039b6>G</font> <font color=#c41200>o</font> <font color=#f3c518>o</font> <font color=#0039b6>g</font> <font color=#30a72f>l</font> <font color=#c41200>e</font></b>'s cache is the snapshot that we took of the page as we crawled the web.<br>
The page may have changed since that time. Click here for the <A HREF="http://bedriven.be-in.org/articles/input_server/II_035-an%20introduction%20to%20the%20input%20server.html"><font color=blue>current page</font></a> without highlighting.</font><br><br><center><font size=-2><i>Google is not affiliated with the authors of this page nor responsible for its content.</i></font></center></td></tr>
<tr><td>
<table border=0 cellpadding=0 cellspacing=0><tr><td><font face=arial,sans-serif color=black size=-1>These search terms have been highlighted:&nbsp;</font></td><td bgcolor=#ffff66><B><font face=arial,sans-serif color=black size=-1>hiroshi&nbsp;</font></B></td><td bgcolor=#A0FFFF><B><font face=arial,sans-serif color=black size=-1>lockheimer&nbsp;</font></B></td></tr></table>
<font face=arial,sans-serif color=black size=-1>These terms only appear in links pointing to this page: <B>input_server </B></font>
</td></tr></table></td></tr></table>
<hr>
<HTML>
<HEAD><TITLE>Be Newsletter, Volume II, Issue 35</TITLE></HEAD>
<BODY BGCOLOR="#FFFFFF">
<HR><Center><B>Be Newsletter, Volume II, Issue 35; September 2, 1998</B></CENTER><HR>
<FONT SIZE=+1><B><A NAME="Insight"></A>BE ENGINEERING INSIGHTS: <p>An Introduction to the Input Server</B></FONT>
<br><B>By <B style="color:black;background-color:#ffff66">Hiroshi </B><B style="color:black;background-color:#A0FFFF">Lockheimer</B> <A HREF="mailto:[email protected]"><B style="color:black;background-color:#ffff66">hiroshi</B>@be.com</A></B>
<P>One of the many upcoming changes in the BeOS is in the world
of input devices and events. The Input Server, slated to
debut in R4, is a server that deals with all things &quot;input.&quot;
Specifically, it serves three functions: manages input
devices such as keyboards and mice; hosts a stream of events
that those devices generate; and dispatches those events
that make it through the stream.
<P>
<b>Managing Input Devices</b>
<P>The Input Server is a pretty dumb piece of software. (Cue to
Alex: roll your eyes and say, &quot;What do you expect <B style="color:black;background-color:#ffff66">Hiroshi</B>,
you wrote it.&quot;) On its own, the server doesn't know how a
keyboard or a mouse works; it relies on <CODE>BInputServerDevice</CODE>
add-ons to tell it.
<P><CODE>BInputServerDevice</CODE> is a base class from which all input
device add-ons must derive. It provides the basic framework
of virtual hook functions and non-virtual member functions
that the Input Server uses to communicate with an add-on,
and that the add-on can use to talk back to the server. To
give a sneak peak of the API, some of the virtuals include
<CODE>InitCheck()</CODE>, <CODE>Start()</CODE>, <CODE>Stop()</CODE>, and <CODE>Control()</CODE>. The common
sequence of the life of an input device is this:
<ol>
<li> The Input Server loads an add-on and constructs its
<CODE><CODE>BInputServerDevice</CODE></CODE>-derived object.
<P><li> The Input Server calls <CODE>InitCheck()</CODE> on the object. The
object determines whether it is capable of doing its job
-- that is, generating input events.
<P><li> This task may involve the object sniffing around for
hardware it can drive, or looking for a kernel device
driver in <CODE>/dev</CODE>. If the object is happy, it registers with
the Input Server any input device(s) it finds, and
returns <CODE>B_NO_ERROR</CODE>. An error return causes the Input
Server to promptly destruct the object and unload the
add-on.
<P><li> At some point in time, someone will tell the input
devices registered with the Input Server to <CODE>Start()</CODE>. The
system automatically starts keyboards and mice at boot
time. Any other type of device (an &quot;undefined&quot; input
device that the system doesn't have any special knowledge
about) can be started by an application using new API in
the Interface Kit.
<P><li> A registered device, whether it has been started or
not, may be <CODE>Control()</CODE>-ed at any time. Think of Control()
as the <CODE>ioctl()</CODE> equivalent in input device parlance.
Examples of system-defined control messages include
keymap changes and mouse speed changes.
</ol>
<P>
<b>Generating Input Events</b>
<P>Once a <CODE>BInputServerDevice</CODE>-derived object's input device is
up and running, its primary task is to generate input
events. These events are expressed as BMessages. For
example, a keyboard input device will most likely generate
<CODE>B_KEY_DOWN</CODE> and <CODE>B_KEY_UP</CODE> messages. Similarly, a mouse input
device will probably generate <CODE>B_MOUSE_UP</CODE>, <CODE>B_MOUSE_DOWN</CODE>, and
<CODE>B_MOUSE_MOVED</CODE> events.
<P>There is nothing that prevents an input device from putting
arbitrary data in any of the <CODE>BMessages</CODE> it generates. So, for
example, a tablet may generate the aforementioned mouse
events with extra data such as pressure and proximity. Any
information packed into the <CODE>BMessages</CODE> is delivered
unmolested by the input server.
<P>When an event is ready to be shipped off, an input device
enqueues it into the Input Server's event stream. Some
<CODE>BHandler</CODE> (most likely a <CODE>BView</CODE>) down the line eventually
receives the event by way of the usual hook functions such
as <CODE>KeyDown()</CODE>, <CODE>MouseDown()</CODE>, and <CODE>MouseMoved()</CODE>.
<P>
<b>The Input Event Stream</b>
<P>The Input Server's event stream is open for inspection and
alteration by anyone in the system. This is achieved through
another set of add-ons called <CODE>BInputServerFilter</CODE>. Like
<CODE>BInputServerDevice</CODE>, <CODE>BInputServerFilter</CODE> is a base class for input filter add-ons to the Input Server.
<P>An input filter add-on is privy to all the events that pass
through the Input Server's event stream. A filter may
inspect, alter, generate, or completely drop input events.
It's similar in some ways to the Interface Kit's
<CODE>BMessageFilter</CODE>, but much more low-level. A
<CODE>BInputServerFilter</CODE> sees all events that exist in the system;
<CODE>BMessageFilters</CODE> are associated with a specific <CODE>BLooper</CODE> and
thus see only the events targeted to its <CODE>BLooper</CODE>. Also,
filters in the Input Server can generate additional events
in place of, or in addition to, the original input event
that it was invoked with.
<P>
<b>Conclusion</b>
<P>With the introduction of loadable input device objects, the
Input Server enables the BeOS to be used with a wide variety
of input devices (and more than one of them at once too).
And with the advent of input filters, the Input Server opens
the door to a new class of tricks, hacks, and (gulp) pranks
for the creative developer. It's going to be fun.
<P>
</BODY>
</HTML>
View File
+100
View File
@@ -0,0 +1,100 @@
000124f0 T InputServer::InputServer(void)
0001277c T InputServer::MessageReceived(BMessage *)
00012e64 T InputServer::QuitRequested(void)
0001306c T InputServer::InitKeyboardMouseStates(void)
00013360 T InputServer::InitMethods(void)
00013460 T InputServer::GetNextEvents(BList *)
000135e8 T InputServer::DoMouseAcceleration(long *, long *)
00013794 T InputServer::SanitizeEvents(BList *)
00013ce0 T InputServer::MethodizeEvents(BList *, bool)
00013ecc T InputServer::FilterEvents(BList *)
000140dc T InputServer::CacheEvents(BList *)
000144d0 T InputServer::DispatchEvents(BList *)
00014800 T InputServer::HandleSetKeyboardLocks(BMessage *, BMessage *)
000148e0 T InputServer::HandleSetModifierKey(BMessage *, BMessage *)
00014ad0 T InputServer::HandleGetSetKeyMap(BMessage *, BMessage *)
00014c3c T InputServer::HandleGetSetKeyRepeatDelay(BMessage *, BMessage *)
00014d4c T InputServer::HandleGetSetKeyRepeatRate(BMessage *, BMessage *)
00014e5c T InputServer::HandleGetSetMouseMap(BMessage *, BMessage *)
00014f9c T InputServer::HandleGetSetMouseType(BMessage *, BMessage *)
000150ac T InputServer::HandleGetSetMouseSpeed(BMessage *, BMessage *)
000151bc T InputServer::HandleGetSetMouseAcceleration(BMessage *, BMessage *)
000152cc T InputServer::HandleGetSetClickSpeed(BMessage *, BMessage *)
000153dc T InputServer::HandleSetMousePosition(BMessage *, BMessage *)
00015534 T InputServer::HandleFocusUnfocusIMAwareView(BMessage *, BMessage *)
00015690 T InputServer::HandleSetMethod(BMessage *)
000157f8 T InputServer::EventLoop(void *)
00015b1c T InputServer::UnlockMethodQueue(void)
00015b5c T InputServer::LockMethodQueue(void)
00015ba4 T InputServer::HandleGetModifiers(BMessage *, BMessage *)
00015bec T InputServer::HandleGetKeyInfo(BMessage *, BMessage *)
00015c40 T InputServer::HandleGetKeyboardID(BMessage *, BMessage *)
00015c88 T InputServer::SetActiveMethod(_BMethodAddOn_ *)
00015d8c T InputServer::SetNextMethod(bool)
00015e04 T InputServer::SetMousePos(long *, long *, float, float)
00015ec4 T InputServer::SetMousePos(long *, long *, long, long)
00015f14 T InputServer::SetMousePos(long *, long *, BPoint)
00015fc8 T InputServer::InitFilters(void)
00016008 T InputServer::EventLoopRunning(void)
00016028 T InputServer::SafeMode(void)
00016048 T InputServer::ControlDevices(char const *, input_device_type, unsigned long, BMessage *)
0001612c T InputServer::StartStopDevices(char const *, input_device_type, bool)
000161fc T InputServer::MethodReplicant(void) const
0001620c T InputServer::EnqueueMethodMessage(BMessage *)
000162ec T InputServer::EnqueueDeviceMessage(BMessage *)
0001631c T InputServer::ReadyToRun(void)
00016344 T InputServer::ArgvReceived(long, char **)
0001647c T BInputServerDevice::_ReservedInputServerDevice4(void)
00016484 T BInputServerDevice::_ReservedInputServerDevice3(void)
0001648c T BInputServerDevice::_ReservedInputServerDevice2(void)
00016494 T BInputServerDevice::_ReservedInputServerDevice1(void)
0001649c T BInputServerDevice::StopMonitoringDevice(char const *)
000164cc T BInputServerDevice::StartMonitoringDevice(char const *)
000164fc T BInputServerDevice::EnqueueMessage(BMessage *)
00016528 T BInputServerDevice::UnregisterDevices(input_device_ref **)
00016550 T BInputServerDevice::RegisterDevices(input_device_ref **)
00016578 T BInputServerDevice::Control(char const *, void *, unsigned long, BMessage *)
00016584 T BInputServerDevice::Stop(char const *, void *)
00016590 T BInputServerDevice::Start(char const *, void *)
0001659c T BInputServerDevice::SystemShuttingDown(void)
000165a8 T BInputServerDevice::InitCheck(void)
000165b4 T BInputServerDevice::~BInputServerDevice(void)
000165e4 T BInputServerDevice::BInputServerDevice(void)
00016614 T BInputServerFilter::_ReservedInputServerFilter4(void)
0001661c T BInputServerFilter::_ReservedInputServerFilter3(void)
00016624 T BInputServerFilter::_ReservedInputServerFilter2(void)
0001662c T BInputServerFilter::_ReservedInputServerFilter1(void)
00016634 T BInputServerFilter::GetScreenRegion(BRegion *) const
00016698 T BInputServerFilter::Filter(BMessage *, BList *)
000166a4 T BInputServerFilter::InitCheck(void)
000166b0 T BInputServerFilter::~BInputServerFilter(void)
000166e0 T BInputServerFilter::BInputServerFilter(void)
00016710 T BInputServerMethod::_ReservedInputServerMethod4(void)
00016718 T BInputServerMethod::_ReservedInputServerMethod3(void)
00016720 T BInputServerMethod::_ReservedInputServerMethod2(void)
00016728 T BInputServerMethod::_ReservedInputServerMethod1(void)
00016730 T BInputServerMethod::SetMenu(BMenu const *, BMessenger)
000167ac T BInputServerMethod::SetIcon(unsigned char const *)
000167d4 T BInputServerMethod::SetName(char const *)
000167fc T BInputServerMethod::EnqueueMessage(BMessage *)
00016828 T BInputServerMethod::MethodActivated(bool)
00016834 T BInputServerMethod::~BInputServerMethod(void)
00016864 T BInputServerMethod::BInputServerMethod(char const *, unsigned char const *)
00018834 T MethodReplicant::SendToInputServer(BMessage *)
00019d98 W InputServer type_info function
00019ddc W InputServer::~InputServer(void)
00019e68 W BInputServerDevice type_info function
00019ea0 W BInputServerFilter type_info function
00019ed8 W BInputServerMethod type_info function
0001b000 R kInputServerSignature
0001cd34 D InputServer::sSafeMode
0001cd35 D InputServer::sEventLoopRunning
0001fb60 W InputServer virtual table
0001fce0 W BInputServerDevice virtual table
0001fd40 W BInputServerFilter virtual table
0001fd80 W BInputServerMethod virtual table
00024580 B InputServer::fMouseState
000245c0 B InputServer type_info node
000245ec B BInputServerMethod type_info node
00024620 B BInputServerFilter type_info node
00024728 B BInputServerDevice type_info node
+100
View File
@@ -0,0 +1,100 @@
InputServer::InputServer(void)
InputServer::MessageReceived(BMessage
InputServer::QuitRequested(void)
InputServer::InitKeyboardMouseStates(void)
InputServer::InitMethods(void)
InputServer::GetNextEvents(BList
InputServer::DoMouseAcceleration(long
InputServer::SanitizeEvents(BList
InputServer::MethodizeEvents(BList
InputServer::FilterEvents(BList
InputServer::CacheEvents(BList
InputServer::DispatchEvents(BList
InputServer::HandleSetKeyboardLocks(BMessage
InputServer::HandleSetModifierKey(BMessage
InputServer::HandleGetSetKeyMap(BMessage
InputServer::HandleGetSetKeyRepeatDelay(BMessage
InputServer::HandleGetSetKeyRepeatRate(BMessage
InputServer::HandleGetSetMouseMap(BMessage
InputServer::HandleGetSetMouseType(BMessage
InputServer::HandleGetSetMouseSpeed(BMessage
InputServer::HandleGetSetMouseAcceleration(BMessage
InputServer::HandleGetSetClickSpeed(BMessage
InputServer::HandleSetMousePosition(BMessage
InputServer::HandleFocusUnfocusIMAwareView(BMessage
InputServer::HandleSetMethod(BMessage
InputServer::EventLoop(void
InputServer::UnlockMethodQueue(void)
InputServer::LockMethodQueue(void)
InputServer::HandleGetModifiers(BMessage
InputServer::HandleGetKeyInfo(BMessage
InputServer::HandleGetKeyboardID(BMessage
InputServer::SetActiveMethod(_BMethodAddOn_
InputServer::SetNextMethod(bool)
InputServer::SetMousePos(long
InputServer::SetMousePos(long
InputServer::SetMousePos(long
InputServer::InitFilters(void)
InputServer::EventLoopRunning(void)
InputServer::SafeMode(void)
InputServer::ControlDevices(char
InputServer::StartStopDevices(char
InputServer::MethodReplicant(void)
InputServer::EnqueueMethodMessage(BMessage
InputServer::EnqueueDeviceMessage(BMessage
InputServer::ReadyToRun(void)
InputServer::ArgvReceived(long,
BInputServerDevice::_ReservedInputServerDevice4(void)
BInputServerDevice::_ReservedInputServerDevice3(void)
BInputServerDevice::_ReservedInputServerDevice2(void)
BInputServerDevice::_ReservedInputServerDevice1(void)
BInputServerDevice::StopMonitoringDevice(char
BInputServerDevice::StartMonitoringDevice(char
BInputServerDevice::EnqueueMessage(BMessage
BInputServerDevice::UnregisterDevices(input_device_ref
BInputServerDevice::RegisterDevices(input_device_ref
BInputServerDevice::Control(char
BInputServerDevice::Stop(char
BInputServerDevice::Start(char
BInputServerDevice::SystemShuttingDown(void)
BInputServerDevice::InitCheck(void)
BInputServerDevice::~BInputServerDevice(void)
BInputServerDevice::BInputServerDevice(void)
BInputServerFilter::_ReservedInputServerFilter4(void)
BInputServerFilter::_ReservedInputServerFilter3(void)
BInputServerFilter::_ReservedInputServerFilter2(void)
BInputServerFilter::_ReservedInputServerFilter1(void)
BInputServerFilter::GetScreenRegion(BRegion
BInputServerFilter::Filter(BMessage
BInputServerFilter::InitCheck(void)
BInputServerFilter::~BInputServerFilter(void)
BInputServerFilter::BInputServerFilter(void)
BInputServerMethod::_ReservedInputServerMethod4(void)
BInputServerMethod::_ReservedInputServerMethod3(void)
BInputServerMethod::_ReservedInputServerMethod2(void)
BInputServerMethod::_ReservedInputServerMethod1(void)
BInputServerMethod::SetMenu(BMenu
BInputServerMethod::SetIcon(unsigned
BInputServerMethod::SetName(char
BInputServerMethod::EnqueueMessage(BMessage
BInputServerMethod::MethodActivated(bool)
BInputServerMethod::~BInputServerMethod(void)
BInputServerMethod::BInputServerMethod(char
MethodReplicant::SendToInputServer(BMessage
InputServer
InputServer::~InputServer(void)
BInputServerDevice
BInputServerFilter
BInputServerMethod
kInputServerSignature
InputServer::sSafeMode
InputServer::sEventLoopRunning
InputServer
BInputServerDevice
BInputServerFilter
BInputServerMethod
InputServer::fMouseState
InputServer
BInputServerMethod
BInputServerFilter
BInputServerDevice
+18
View File
@@ -0,0 +1,18 @@
MethodReplicant::SendToInputServer(BMessage
InputServer
InputServer::~InputServer(void)
BInputServerDevice
BInputServerFilter
BInputServerMethod
kInputServerSignature
InputServer::sSafeMode
InputServer::sEventLoopRunning
InputServer
BInputServerDevice
BInputServerFilter
BInputServerMethod
InputServer::fMouseState
InputServer
BInputServerMethod
BInputServerFilter
BInputServerDevice
+104
View File
@@ -0,0 +1,104 @@
00000000 l df *ABS* 00000000 InputServer.cpp
00000000 l df *ABS* 00000000 InputServerDevice.cpp
00000000 l df *ABS* 00000000 InputServerFilter.cpp
00000000 l df *ABS* 00000000 InputServerMethod.cpp
000245c0 g O .bss 0000000c InputServer type_info node
000164cc g F .text 0000002f BInputServerDevice::StartMonitoringDevice(char const *)
000245ec g O .bss 0000000c BInputServerMethod type_info node
0001fce0 w O .data 00000058 BInputServerDevice virtual table
00016584 g F .text 00000009 BInputServerDevice::Stop(char const *, void *)
00016550 g F .text 00000026 BInputServerDevice::RegisterDevices(input_device_ref **)
00012e64 g F .text 00000207 InputServer::QuitRequested(void)
00024580 g O .bss 00000020 InputServer::fMouseState
00016720 g F .text 00000007 BInputServerMethod::_ReservedInputServerMethod2(void)
000151bc g F .text 0000010f InputServer::HandleGetSetMouseAcceleration(BMessage *, BMessage *)
0001620c g F .text 000000df InputServer::EnqueueMethodMessage(BMessage *)
00014f9c g F .text 0000010f InputServer::HandleGetSetMouseType(BMessage *, BMessage *)
00016008 g F .text 0000001d InputServer::EventLoopRunning(void)
00015b1c g F .text 0000003e InputServer::UnlockMethodQueue(void)
0001612c g F .text 000000cf InputServer::StartStopDevices(char const *, input_device_type, bool)
000157f8 g F .text 00000323 InputServer::EventLoop(void *)
00018834 g F .text 00000157 MethodReplicant::SendToInputServer(BMessage *)
0001b000 g O .rodata 00000022 kInputServerSignature
00015690 g F .text 00000165 InputServer::HandleSetMethod(BMessage *)
00016578 g F .text 00000009 BInputServerDevice::Control(char const *, void *, unsigned long, BMessage *)
00024620 g O .bss 00000008 BInputServerFilter type_info node
000166b0 g F .text 0000002f BInputServerFilter::~BInputServerFilter(void)
00014c3c g F .text 0000010f InputServer::HandleGetSetKeyRepeatDelay(BMessage *, BMessage *)
00013ce0 g F .text 000001ea InputServer::MethodizeEvents(BList *, bool)
0001cd35 g O .data 00000001 InputServer::sEventLoopRunning
00015bec g F .text 00000053 InputServer::HandleGetKeyInfo(BMessage *, BMessage *)
00015b5c g F .text 00000048 InputServer::LockMethodQueue(void)
00016834 g F .text 0000002d BInputServerMethod::~BInputServerMethod(void)
00016494 g F .text 00000007 BInputServerDevice::_ReservedInputServerDevice1(void)
0001631c g F .text 00000026 InputServer::ReadyToRun(void)
0001fd40 w O .data 00000040 BInputServerFilter virtual table
00015d8c g F .text 00000077 InputServer::SetNextMethod(bool)
0001306c g F .text 000002f2 InputServer::InitKeyboardMouseStates(void)
00013360 g F .text 000000ff InputServer::InitMethods(void)
00019ddc w F .text 00000045 InputServer::~InputServer(void)
0001662c g F .text 00000007 BInputServerFilter::_ReservedInputServerFilter1(void)
0001649c g F .text 0000002f BInputServerDevice::StopMonitoringDevice(char const *)
0001fb60 w O .data 00000180 InputServer virtual table
00015ba4 g F .text 00000045 InputServer::HandleGetModifiers(BMessage *, BMessage *)
000148e0 g F .text 000001ef InputServer::HandleSetModifierKey(BMessage *, BMessage *)
000165a8 g F .text 00000009 BInputServerDevice::InitCheck(void)
00013794 g F .text 00000549 InputServer::SanitizeEvents(BList *)
00016710 g F .text 00000007 BInputServerMethod::_ReservedInputServerMethod4(void)
000166e0 g F .text 00000023 BInputServerFilter::BInputServerFilter(void)
000167ac g F .text 00000027 BInputServerMethod::SetIcon(unsigned char const *)
00014800 g F .text 000000dd InputServer::HandleSetKeyboardLocks(BMessage *, BMessage *)
00019d98 w F .text 00000041 InputServer type_info function
000165b4 g F .text 0000002f BInputServerDevice::~BInputServerDevice(void)
00016528 g F .text 00000026 BInputServerDevice::UnregisterDevices(input_device_ref **)
000165e4 g F .text 0000002d BInputServerDevice::BInputServerDevice(void)
00014e5c g F .text 0000013f InputServer::HandleGetSetMouseMap(BMessage *, BMessage *)
000135e8 g F .text 000001ab InputServer::DoMouseAcceleration(long *, long *)
00015ec4 g F .text 0000004e InputServer::SetMousePos(long *, long *, long, long)
00015c88 g F .text 00000103 InputServer::SetActiveMethod(_BMethodAddOn_ *)
00019ed8 w F .text 00000041 BInputServerMethod type_info function
0001277c g F .text 000006e5 InputServer::MessageReceived(BMessage *)
000162ec g F .text 0000002e InputServer::EnqueueDeviceMessage(BMessage *)
000167d4 g F .text 00000027 BInputServerMethod::SetName(char const *)
00016624 g F .text 00000007 BInputServerFilter::_ReservedInputServerFilter2(void)
00016028 g F .text 0000001d InputServer::SafeMode(void)
00016590 g F .text 00000009 BInputServerDevice::Start(char const *, void *)
00016484 g F .text 00000007 BInputServerDevice::_ReservedInputServerDevice3(void)
00016614 g F .text 00000007 BInputServerFilter::_ReservedInputServerFilter4(void)
00016728 g F .text 00000007 BInputServerMethod::_ReservedInputServerMethod1(void)
0001648c g F .text 00000007 BInputServerDevice::_ReservedInputServerDevice2(void)
0001cd34 g O .data 00000001 InputServer::sSafeMode
00016698 g F .text 0000000c BInputServerFilter::Filter(BMessage *, BList *)
000144d0 g F .text 0000032e InputServer::DispatchEvents(BList *)
000140dc g F .text 000003f4 InputServer::CacheEvents(BList *)
000124f0 g F .text 0000028b InputServer::InputServer(void)
0001647c g F .text 00000007 BInputServerDevice::_ReservedInputServerDevice4(void)
00016828 g F .text 00000009 BInputServerMethod::MethodActivated(bool)
00016344 g F .text 00000079 InputServer::ArgvReceived(long, char **)
000150ac g F .text 0000010f InputServer::HandleGetSetMouseSpeed(BMessage *, BMessage *)
00013460 g F .text 00000186 InputServer::GetNextEvents(BList *)
000153dc g F .text 00000155 InputServer::HandleSetMousePosition(BMessage *, BMessage *)
0001661c g F .text 00000007 BInputServerFilter::_ReservedInputServerFilter3(void)
00019e68 w F .text 00000035 BInputServerDevice type_info function
00016864 g F .text 00000097 BInputServerMethod::BInputServerMethod(char const *, unsigned char const *)
000164fc g F .text 00000029 BInputServerDevice::EnqueueMessage(BMessage *)
00015fc8 g F .text 0000003f InputServer::InitFilters(void)
000166a4 g F .text 00000009 BInputServerFilter::InitCheck(void)
000167fc g F .text 00000029 BInputServerMethod::EnqueueMessage(BMessage *)
00013ecc g F .text 0000020d InputServer::FilterEvents(BList *)
000161fc g F .text 00000010 InputServer::MethodReplicant(void) const
00015c40 g F .text 00000046 InputServer::HandleGetKeyboardID(BMessage *, BMessage *)
000152cc g F .text 0000010f InputServer::HandleGetSetClickSpeed(BMessage *, BMessage *)
0001659c g F .text 00000009 BInputServerDevice::SystemShuttingDown(void)
0001fd80 w O .data 00000068 BInputServerMethod virtual table
00024728 g O .bss 00000008 BInputServerDevice type_info node
00016730 g F .text 0000007c BInputServerMethod::SetMenu(BMenu const *, BMessenger)
00016048 g F .text 000000e3 InputServer::ControlDevices(char const *, input_device_type, unsigned long, BMessage *)
00015534 g F .text 0000015b InputServer::HandleFocusUnfocusIMAwareView(BMessage *, BMessage *)
00019ea0 w F .text 00000035 BInputServerFilter type_info function
00016718 g F .text 00000007 BInputServerMethod::_ReservedInputServerMethod3(void)
00015f14 g F .text 000000b4 InputServer::SetMousePos(long *, long *, BPoint)
00014d4c g F .text 0000010f InputServer::HandleGetSetKeyRepeatRate(BMessage *, BMessage *)
00014ad0 g F .text 0000016c InputServer::HandleGetSetKeyMap(BMessage *, BMessage *)
00015e04 g F .text 000000bf InputServer::SetMousePos(long *, long *, float, float)
00016634 g F .text 00000061 BInputServerFilter::GetScreenRegion(BRegion *) const
@@ -0,0 +1,72 @@
static void init_pdentry(pdentry *e)
Sets e's value to 0.
static void init_ptentry(ptentry *e)
Sets e's value to 0.
static void _update_all_pgdirs(int index, pdentry e)
For every entry in the translation map, set the index'th entry to e.
static int lock_tmap(vm_translation_map *map)
Locks the map; if we are the only ones, sets invalidated page count to 0.
static int unlock_tmap(vm_translation_map *map)
unlocks the map; if no one else has it, call flush_tmap
static void destroy_tmap(vm_translation_map *map)
Iterate over the entries in the tmap list, removing map when found. Frees the pages associated with this map.
static void put_pgtable_in_pgdir(pdentry *e, addr pgtable_phys, int attributes)
Populates the pdentry with pgtable_phys and attributes
static int map_tmap(vm_translation_map *map, addr va, addr pa, unsigned int attributes)
Allocates, if necessary, a page table entry. Gets the page for the page table entry (new or not), populates the page tabel entry with pa and attributes. Puts back the page table entry. Updates the pages to invalidate list.
static int unmap_tmap(vm_translation_map *map, addr start, addr end)
Loops over the pagetable, finding the page that is present that holds this address. Gets it, and marks the page as not present. Replaces the page and updates the pages to invalidate list.
static int query_tmap(vm_translation_map *map, addr va, addr *out_physical, unsigned int *out_flags)
Finds the page table's entry for this virtual address. Returns the physical address and flags.
static addr get_mapped_size_tmap(vm_translation_map *map)
Returns map_count.
static int protect_tmap(vm_translation_map *map, addr base, addr top, unsigned int attributes)
Unimplemented.
static int clear_flags_tmap(vm_translation_map *map, addr va, unsigned int flags)
Finds the PTE and clears the requested flags.
static void flush_tmap(vm_translation_map *map)
Invalidates the TLBs. If too many are in the list, all of the TLBs are invalidated. If not, a list is invalidated.
static int map_iospace_chunk(addr va, addr pa)
Creates 1024 page table entries, for io.
static int get_physical_page_tmap(addr pa, addr *va, int flags)
Looks to see if pa is already mapped. If so, return its virtual address in va. If not, find a place to map it and do so.
static int put_physical_page_tmap(addr va)
Releases a reference to a "checked out" virtual mapping
int vm_translation_map_create(vm_translation_map *new_map, bool kernel)
Sets up new_map, allocating memory and setting its initial state.
int vm_translation_map_module_init(kernel_args *ka)
Clears the bottom 2 gig of memory's page mapping. Allocates space for page maps. Initializes data structures. Puts the page tables in the kernel's pagedir.
void vm_translation_map_module_init_post_sem(kernel_args *ka)
Initializes this module's semaphores and mutexes.
int vm_translation_map_module_init2(kernel_args *ka)
Creates anonymous regions for the kernel pagedir, physical page mappings, iospaces' virtual chunk descriptors and iospaces' page tables. Creates a null region for iospace.
int vm_translation_map_quick_map(kernel_args *ka, addr va, addr pa, unsigned int attributes, addr (get_free_page)(kernel_args *))
Maps a page, ignoring already set up info.
static int vm_translation_map_quick_query(addr va, addr *out_physical)
Gets the physical address for a page.
addr vm_translation_map_get_pgdir(vm_translation_map *map)
Returns the pagedirectory structure.
+11
View File
@@ -0,0 +1,11 @@
int arch_vm_init (kernel_args *ka)
First round of initialization; does nothing.
int arch_vm_init2 (kernel_args *ka)
Marks the bios and dma ranges as "in use".
int arch_vm_init_endvm (kernel_args *ka)
Maps the dma region into kernel space
void arch_vm_aspace_swap(vm_address_space *aspace)
Calls i386_swap_pgdir
+210
View File
@@ -0,0 +1,210 @@
Variables
static vm_address_space *kernel_aspace;
static region_id next_region_id;
static void *region_table;
static sem_id region_hash_sem;
static aspace_id next_aspace_id;
static void *aspace_table;
static sem_id aspace_hash_sem;
static int max_commit;
static spinlock_t max_commit_lock;
Functions
static int region_compare(void *_r, const void *key)
Compares _r (a vm_region) to key to see if their id's are the same. If so, return 0, else return -1
static unsigned int region_hash(void *_r, const void *key, unsigned int range)
If _r is null, return key (a region_id) mod range, else return _r's id mod range.
static int aspace_compare(void *_a, const void *key)
Compares _a (an address space) to key to see if their id's are the same. If so, return 0, else return -1
static unsigned int aspace_hash(void *_a, const void *key, unsigned int range)
If _a is null, return key (an aspace_id) mod range, else return _a's id mod range.
vm_address_space *vm_get_aspace_by_id(aspace_id aid)
Does a hash lookup on aid to find a vm_address_space struct. Increments its reference count and returns it.
vm_region *vm_get_region_by_id(region_id rid)
Does a hash lookup on rid to find a vm_region. Increments its reference count and returns it.
region_id vm_find_region_by_name(aspace_id aid, const char *name)
Finds this address space's structure. Iterates over the region list, looking for a match for name. vm_put_aspace's the address space.
static vm_region *_vm_create_region_struct(vm_address_space *aspace, const char *name, int wiring, int lock)
Allocates space for a region and its name. Populates the name. Gets a new region id and assigns it. Sets map to the address space's virtual map.
static int find_and_insert_region_slot(vm_virtual_map *map, addr start, addr size, addr end, int addr_type, vm_region *region)
Loops over the map's region list until it finds where this region should be inserted. If addr_type is any address, find any spot where it will fit and set the region up to start at the end of the previous one + 1. If we are searching for an exact address, see if that area is free and if so, use it. Increment map's change count.
static int map_backing_store(vm_address_space *aspace, vm_store *store, void **vaddr,off_t offset, addr size, int addr_type, int wiring, int lock, int mapping, vm_region **_region, const char *region_name)
Creates a region structure for this address space, name, wiring and lock. If this is a private map, create a new store, cache and cache_ref for private copies of pages. If the store's commited size is too small, ask the store to attempt to commit more. Aquire a reference to the cache_ref. Ensure that no one is deleting this address space; if they are, exit with an error. Insert this region into the address space. Attaches the cache to the region. Inserts the region into the region hash table. Adds a reference to the address space. Releases the cache_ref reference.
region_id user_vm_create_anonymous_region(char *uname, void **uaddress, int addr_type, addr size, int wiring, int lock)
Does some safety checking, copies the name and address to kernel space, calls vm_create_anonymous_region, then copies the return result to uaddress.
region_id vm_create_anonymous_region(aspace_id aid, char *name, void **address, int addr_type, addr size, int wiring, int lock)
Gets the address space structure. Creates an anonymous store object, a (temporary) cache and a cache_ref. Acquires a ref to the cache_ref. Calls map_backing_store for this address and size. Releases the cache_ref. If wiring is lazy, do nothing. If wiring is wired, calls soft_fault to simulate a fault and force the mapping to occur. If the wiring is "wired already", i.e. we cheated at boot time to make this happen, then find the pages and call vm_cache_insert_page to insert the pages into the cache. If the wiring is contiguous, allocate the pages and put them into the cache.
region_id vm_map_physical_memory(aspace_id aid, char *name, void **address, int addr_type, addr size, int lock, addr phys_addr)
Get the address space structure. Create a device store object, a cache and a cache_ref. Acquire a reference for the cache_ref. map backing store to this space and size. release the reference to the cache_ref.
region_id vm_create_null_region(aspace_id aid, char *name, void **address, int addr_type, addr size)
Get the address space structure. Create a null store object, a cache and a cache_ref. Acquire a reference for the cache_ref. map backing store to this space and size. release the reference to the cache_ref.
static region_id _vm_map_file(aspace_id aid, char *name, void **address, int addr_type,addr size, int lock, int mapping, const char *path, off_t offset, bool kernel)
Get the address space structure. Get the vnode from the path. If this cache doesn't already exist:
create a vnode store object, a cache and a cache_ref. Acquire a reference for the cache_ref. set the cache_ptr to this cache_ref, and keep retrying until it works. release the reference to the cache_ref.
Acquire a ref to the cache_ref. map backing store, release the ref and put the address space.
region_id vm_map_file(aspace_id aid, char *name, void **address, int addr_type, addr size, int lock, int mapping, const char *path, off_t offset)
Convenience function - calls _vm_map_file with a kernel param of true.
region_id user_vm_map_file(char *uname, void **uaddress, int addr_type, addr size, int lock, int mapping, const char *upath, off_t offset)
Sanity checks the name, address and path. Copies those into kernel space and calls _vm_map_file with a kernel param of false.
region_id user_vm_clone_region(char *uname, void **uaddress, int addr_type, region_id source_region, int mapping, int lock)
Sanity checks the name and address. Copies those into kernel space and calls vm_clone_region.
region_id vm_clone_region(aspace_id aid, char *name, void **address, int addr_type, region_id source_region, int mapping, int lock)
Gets the address space and region structures. maps backing store and returns.
static int __vm_delete_region(vm_address_space *aspace, vm_region *region)
If the region's address space matches aspace, put_region it.
static int _vm_delete_region(vm_address_space *aspace, region_id rid)
Gets the region, calls __vm_delete_region, then puts the region.
int vm_delete_region(aspace_id aid, region_id rid)
Gets the address space. Calls _vm_delete_region, puts the address space and returns.
static void _vm_put_region(vm_region *region, bool aspace_locked)
Check to see if there are still references to this region. If not, remove it from the global list and return. Remove the region from the adress space's region list. Remove the region from the vm_cache. Unmap it from the translation map.
void vm_put_region(vm_region *region)
Calls _vm_put_region with locked=false.
int user_vm_get_region_info(region_id id, vm_region_info *uinfo)
Calls vm_get_region_info after sanity checking the vm_region_info pointer.
int vm_get_region_info(region_id id, vm_region_info *info)
Fills in the vm_region_info structure with id, base, size, lock, wiring and name.
int vm_get_page_mapping(aspace_id aid, addr vaddr, addr *paddr)
Returns a physical address, given a virtual one.
static void display_mem(int argc, char **argv)
Displays a value in memory.
static void dump_cache_ref(int argc, char **argv)
Dumps a cache ref to debugging terminal
static const char *page_state_to_text(int state)
Converts a state enum to a descriptive string.
static void dump_cache(int argc, char **argv)
Dumps a particular cache entry.
static void _dump_region(vm_region *region)
Dumps a particular region
static void dump_region(int argc, char **argv)
Finds region by id and dumps it.
static void dump_region_list(int argc, char **argv)
Dumps info about every region.
static void _dump_aspace(vm_address_space *aspace)
Dumps data about an address space.
static void dump_aspace(int argc, char **argv)
Finds an address space by ID and dumps it.
static void dump_aspace_list(int argc, char **argv)
Dumps data about every address space.
vm_address_space *vm_get_kernel_aspace(void)
Returns a pointer to the kernel address space structure.
aspace_id vm_get_kernel_aspace_id(void)
Returns the kernel's address space id.
vm_address_space *vm_get_current_user_aspace(void)
Gets the current user address space, given an id.
aspace_id vm_get_current_user_aspace_id(void)
Uses the thread structure to get the current address space id.
void vm_put_aspace(vm_address_space *aspace)
Removes a reference to the adress space. If it is the last one, destory the aspace.
aspace_id vm_create_aspace(const char *name, addr base, addr size, bool kernel)
Allocate space for the structure and the name. Set default state. Creates a translation map. Initializes the virtual map and adds the structure to the global address space list.
int vm_delete_aspace(aspace_id aid)
Gets the aspace struct from the id. If someone is already deleting, bail out. Put all of the regions, and put the aspace twice to cause it to be deleted.
int vm_aspace_walk_start(struct hash_iterator *i)
calls open_hash on the aspace table.
vm_address_space *vm_aspace_walk_next(struct hash_iterator *i)
Get the next address space in the hash list.
static int vm_thread_dump_max_commit(void *unused)
Calls the unused function, then loops forever, printing the max_commit changes. Weird.
int vm_init(kernel_args *ka)
Calls translation_map_module_init, and arch_vm_init. Initializes its globals, maps in the new heap and initializes it. Initializes the page list and the cache list. Creates the region and address space hash maps. Creates the kernel address space. Calls arch_vm_init2 and vm_page_init2. Allocates vm space for the stuff that the boot loader already had (heap, kernel read only, kernel read write, bootdir and the kstacks. Calls arch_vm_init_endvm. Adds commands to the debugger.
int vm_init_postsem(kernel_args *ka)
Calls vm_translation_map_module_init_post_sem, creates the vm locking semaphores, and calls heap_init_postsem.
int vm_init_postthread(kernel_args *ka)
Creates a max_commit_thread, calling vm_thread_dump_max_commit.
int vm_page_fault(addr address, addr fault_address, bool is_write, bool is_user, addr *newip)
Calls vm_soft_fault. If that fails then checks to see if there is a fault handler for this case. If so, ensures that it is called. If there is no such case, kernel_panic (is this a good thing?)
static int vm_soft_fault(addr address, bool is_write, bool is_user)
Sanity checks the address, determining if it is kernel or user land and getting the appropriate address space. Looks up the region from the aspace's map and the address. On failure, fail. Checks permissions. Finds the regions's cache ref; if there is a fault function for that cache_ref, invoke it and return with the error that the fault function returns.
Otherwise, iterates over the cache chain:
If the page is found in the current cache, set that page as busy and stop iterating.
Otherwise, insert a dummy page in this cache (to keep other threads of the same process from chasing us in fault land)
See if this cache's store has a "has_page" function. If so, call it. If it finds the page (meaning that the page is in this cache's storage), allocate a new physical page, read the data into the page and stop iterating.
If we didn't find a cache, pick one (if we are in write mode, the top, if not, the deepest cache).
If we don't have a page at this point, make a new one and insert it into the cache. Replace the dummy page, if any, with our new page.
If this is a writable page and we are not in the topmost cache, we need another physical page for writes. Find the original page and copy it to the new page. Replace the dummy page, if any, with our new page.
Ensure that the address region is still legit.
Map the new page into the address space.
Replace the dummy page, if any, with our new page.
Set the page to active. Release all locks.
static vm_region *vm_virtual_map_lookup(vm_virtual_map *map, addr address)
Walk the region list of this map, looking for a region containing this address and return it.
int vm_get_physical_page(addr paddr, addr *vaddr, int flags)
Get the physical page for this virtual address.
int vm_put_physical_page(addr vaddr)
Put the physical page for this virtual address.
void vm_increase_max_commit(addr delta)
Lock everything, increase max_commit, then unlock everything.
int user_memcpy(void *to, const void *from, size_t size)
Calls the arch_ version.
int user_strcpy(char *to, const char *from)
Calls the arch_ version.
int user_strncpy(char *to, const char *from, size_t size)
Calls the arch_ version.
int user_memset(void *s, char c, size_t count)
Calls the arch_ version.
+41
View File
@@ -0,0 +1,41 @@
Variables
static void *page_cache_table
static spinlock_t page_cache_table_lock
static int page_compare_func(void *_p, const void *_key)
Compares a vm_page's cache_ref and offset to those of key. Returns 0 on match, -1 otherwise.
static unsigned int page_hash_func(void *_p, const void *_key, unsigned int range)
If p is not null, use it otherwise use key; computes a hash value for offset and reference.
int vm_cache_init(kernel_args *ka)
Calls hash_init, sets page_cache_table_lock to unlocked and returns 0.
vm_cache *vm_cache_create(vm_store *store)
Allocates a vm_cache structure and populates with 0's and NULLs (except for store).
vm_cache_ref *vm_cache_ref_create(vm_cache *cache)
Allocates a vm_cache_ref, setting it to point to the passed in cache. It initalizes the references lock and returns.
void vm_cache_acquire_ref(vm_cache_ref *cache_ref, bool acquire_store_ref)
If the cache_ref is null, panic. Otherwise, if we are to aquire a reference and there is an aquire reference function for this cache's store, call that function. Finally, increment this cache references' count.
void vm_cache_release_ref(vm_cache_ref *cache_ref)
If this cache_ref is the last reference to its cache, we call destroy on the store, remove all of its pages from the page_cache_table and set the state of them to free, increase max_commit by the size of the now freed storage, remove the reference to the original cache, destroy the reference's mutex and its space.
Otherwise, we call the store's release ref and return.
vm_page *vm_cache_lookup_page(vm_cache_ref *cache_ref, off_t offset)
Lock the page_cache_table_lock and lookup the offset and cache_ref in the page_cache_table, then unlock.
void vm_cache_insert_page(vm_cache_ref *cache_ref, vm_page *page, off_t offset)
Add this page to the page_cache_table.
void vm_cache_remove_page(vm_cache_ref *cache_ref, vm_page *page)
Find this page and remove it from the hash list. Clean up the linked lists.
int vm_cache_insert_region(vm_cache_ref *cache_ref, vm_region *region)
Add this region to the cache_ref's region list.
int vm_cache_remove_region(vm_cache_ref *cache_ref, vm_region *region)
Remove this region from the cache_ref's region list.
+33
View File
@@ -0,0 +1,33 @@
Variables
bool trimming_cycle;
Do we need free space?
static addr free_memory_low_water;
static addr free_memory_high_water;
static void scan_pages(vm_address_space *aspace, addr free_target)
Finds a region in this address space to scan.
Locks the region's cache_ref.
For each page,
if the page is present, do nothing with this page
Lookup the page structure. If this page doesn't exist, do nothing with this page.
If the page is written to or is hard wired (unswapable), do nothing with it.
If the page is not accessed and is active and we need space (free_target), unmap it. If this is the last reference to that mapped page, put it on the inactive list.
If the page has been modified, but wasn't on the active list, put it there.
Move to the next region in this address space, wrap around until we hit the first one.
static int page_daemon()
Walk through every address space:
Adjust the size of the processes' working set (i.e. memory allocation) to be larger or smaller, to tailor to faults.
Set trimming cycle if free pages is below the high water mark.
Clear trimming cycle if free pages is above high water mark.
Set free memory target to be the processes' mapped size minus the working set
Call scan_pages
int vm_daemon_init()
Sets high water to pages/4 and low water to pages/8.
Creates the page daemon as a kernel thread.
+112
View File
@@ -0,0 +1,112 @@
Variables
extern bool trimming_cycle;
Determines if we are trimming - if we are nearly out of space
static page_queue page_free_queue;
The queue that holds unused (but not cleared) pages
static page_queue page_clear_queue;
The queue that holds cleared (0'ed) pages
static page_queue page_modified_queue;
The queue that holds altered pages
static page_queue page_active_queue;
The queue that holds in use pages that are not altered
static vm_page *all_pages;
Every page in the system
static addr physical_page_offset;
The first address of real ram
static unsigned int num_pages;
Total number of pages in the system
static spinlock_t page_lock;
A lock to protect the queues.
static sem_id modified_pages_available;
A semaphore to indicate if there are pages that need to be written to disk
static void clear_page(addr pa);
Sets all values in this page to 0.
static vm_page * dequeue_page(page_queue *q)
Standard queue remove first page; has count; no locking
void dump_page_stats(int argc, char **argv);
Dumps counts of each state (active, inactive, busy, not used, modified, free, cleared, wired)
void dump_free_page_table(int argc, char **argv)
Not done.
static void enqueue_page(page_queue *q, vm_page *page)
Standard queue add a page; has count; no locking; SPECIAL - for page_modified_queue, if there is only one page modified (new one), release semaphore
static bool is_page_in_phys_range(kernel_args *ka, addr paddr)
Determines if a physical address is in the physical memory that exists.
static void move_page_to_queue(page_queue *from_q, page_queue *to_q, vm_page *page)
Removes the page from the from_q and adds it to the to_q.
static int pageout_daemon()
aquires the "modified pages available" semaphore. Gets first page from modified list. Sets it to busy, updates all processes mapping this page that it is no longer a modified page, writes it out to disk, then puts it on the active list (i.e. not modified). Doesn't write out "anonymous" blocks unless we are trimming.
static int page_scrubber(void *);
Every 1/10 second, takes a page from the free queue, memsets it to 0's, then puts it on the clear queue.
static void remove_page_from_queue(page_queue *q, vm_page *page)
Removes a given page from the given page queue. No locking.
addr vm_alloc_from_ka_struct(kernel_args *ka, unsigned int size, int lock)
Gets virtual space in the ka using vm_alloc_vspace_from_ka_struct, then uses vm_alloc_ppage_from_kernel_struct to find a physical page to map it to.
static addr vm_alloc_ppage_from_kernel_struct(kernel_args *ka)
Attempts to extend, by one page, one of the phys_alloc_range blocks in the kernel args.
static addr vm_alloc_vspace_from_ka_struct(kernel_args *ka, unsigned int size)
Attempts to find an address range that can be extended to hold size bytes.
vm_page * vm_lookup_page(addr page_num)
Does the math to get vm_page pointer from a page number.
int vm_mark_page_inuse(addr page)
Calls vm_mark_page_range_inuse with len of 1.
int vm_mark_page_range_inuse(addr start_page, addr len)
Sets state to PAGE_STATE_UNUSED for all pages in this range.
vm_page * vm_page_allocate_page(int page_state)
Gets a single page from the clear or free queue (from page_state), fall back to the other.
vm_page * vm_page_allocate_page_run(int page_state, addr len)
Attempts to find a run of pages "len" long that are either free or clear. If found, pulls them from their queues and calls vm_page_set_state_nolock on them
vm_page * vm_page_allocate_specific_page(addr page_num, int page_state)
Finds this page, removes it from the clear or free queue, clears it if necessary and returns. Returns NULL for not found or page in use.
int vm_page_init(kernel_args *ka)
Initializes the free, clear, modified and active queues. Sets up the vm structures.
int vm_page_init2(kernel_args *ka)
Properly maps the vm structures allocated in vm_page_init.
int vm_page_init_postthread(kernel_args *ka)
Creates the page scrubber and the pageout daemon.
addr vm_page_num_pages()
Returns the total number of pages.
addr vm_page_num_free_pages()
Returns count of pages in free and clear queues.
int vm_page_set_state(vm_page *page, int page_state)
Locks, then calls vm_page_set_state_nolock, then unlocks.
static int vm_page_set_state_nolock(vm_page *page, int page_state);
Moves a page from the state that it is in to the state specified, and moves it from the old queue to the new one.
@@ -0,0 +1,21 @@
static void anonymous_destroy(struct vm_store *store)
Free's the memory associated with store
static off_t anonymous_commit(struct vm_store *store, off_t size)
Returns 0
static int anonymous_has_page(struct vm_store *store, off_t offset)
Returns 0
static ssize_t anonymous_read(struct vm_store *store, off_t offset, iovecs *vecs)
Returns unimplemented
static ssize_t anonymous_write(struct vm_store *store, off_t offset, iovecs *vecs)
Returns 0
/*
static int anonymous_fault(struct vm_store *backing_store, struct vm_address_space *aspace, off_t offset)
*/
vm_store *vm_store_create_anonymous_noswap()
Allocates space for a vm_store. Populates its ops with the above, sets its cache and data to none.
+20
View File
@@ -0,0 +1,20 @@
static void device_destroy(struct vm_store *store)
Frees the space associated with this store
static off_t device_commit(struct vm_store *store, off_t size)
Sets this store's commited size to size.
static int device_has_page(struct vm_store *store, off_t offset)
Returns 0
static ssize_t device_read(struct vm_store *store, off_t offset, iovecs *vecs)
Returns unimplemented.
static ssize_t device_write(struct vm_store *store, off_t offset, iovecs *vecs)
Returns 0
static int device_fault(struct vm_store *store, struct vm_address_space *aspace, off_t offset)
Should be called when a page is not mapped in. Locks the translation map, Finds the region in the cache that contains this page and maps it in. Unlocks the cache.
vm_store *vm_store_create_device(addr base_addr)
Allocates memory for the vm_store structure, plus the data_store_device structure. Sets cache to null, and data to the device_store_data. Sets the device_store_data's base address to the base address passed in.
+20
View File
@@ -0,0 +1,20 @@
static void null_destroy(struct vm_store *store)
Frees this stores space.
static off_t null_commit(struct vm_store *store, off_t size)
Sets committed size to size and returns it.
static int null_has_page(struct vm_store *store, off_t offset)
returns 1.
static ssize_t null_read(struct vm_store *store, off_t offset, iovecs *vecs)
Returns -1.
static ssize_t null_write(struct vm_store *store, off_t offset, iovecs *vecs)
Returns -1.
static int null_fault(struct vm_store *store, struct vm_address_space *aspace, off_t offset)
Returns a Fatal page fault error.
vm_store *vm_store_create_null(void)
Creates an empty vm_store struct.
+23
View File
@@ -0,0 +1,23 @@
static void vnode_destroy(struct vm_store *store)
Frees memory associated with this store.
static off_t vnode_commit(struct vm_store *store, off_t size)
Sets committed size to size and returns it.
static int vnode_has_page(struct vm_store *store, off_t offset)
Returns 1.
static ssize_t vnode_read(struct vm_store *store, off_t offset, iovecs *vecs)
Calls vfs_readpage.
static ssize_t vnode_write(struct vm_store *store, off_t offset, iovecs *vecs)
calls vfs_writepage
static void vnode_acquire_ref(struct vm_store *store)
Calls vfs_vnode_aquire_ref
static void vnode_release_ref(struct vm_store *store)
Calls vfs_vnode_release_ref
vm_store *vm_store_create_vnode(void *vnode)
Creates space for a vm_store and a vnode_store_data. Sets data = vnode_store_data. Sets the vnode_store_data's vnode to vnode.
+38
View File
@@ -0,0 +1,38 @@
OpenBeOS Keymap preferences
2002-05-16 - The input_server is restarted when a keymap is 'use'd. Hooray!
2002-05-11 - Ok, I have found the 'move keys around with the right mouse button' feature. Now I see the Revert button make sense. Sorry I doubted you JLG :)
2002-05-08 - Fixed switching from user- to system maps and vice versa and added revert button. Just like the original, it does abolutely nothing. Makes one wonder why it is there in the first place.
2002-02-16 - Moved message definitions to messages.h, chopped KeymapApplication::UseKeymap into smaller pieces, created member variable fApplication in KeymapWindow, applied OpenTracker guidelines
2002-02-15 - Added resource file and 'Use' button, made 'System' and 'User' lists mutually exclusive and implemented keymap file copying
2002-02-09 - Added resource file and 'Use' button and made 'System' and 'User' lists mutually exclusive - sort of
2002-02-08 - Initial checkin
This version:
Copies keymap files but doesn't do much else - you even have to restart the Input Server (try BeReset for that) for the new keymap to work. It seems bugfree at doing what it does though :)
To do (likely in this order):
- somehow inform Input Server to use the newly chosen keymap, or else restart the Input Server
- preselect 'Current'
- make the 'System' and 'User' labels show up (or: why are they invisible in the current version?)
- layout the sources to conform to OBOS standards
- find Be-defined constants for paths and/or files
- check validity of keymap file before copying
- add all the fancy stuff that's in the original Keymap application
- switch to Jam
- get rid of all excess symbols (or: what linker switch makes the linker remove all external symbols?)
- hunt leaks and fix'em
If anyone looks at my code and sees any major problems, please email me to tell me, I want to work hard on this app to make sure it's as stable and complete as it can get for the OpenBeOS project.
Sandor Vroemisse
[email protected]
+5
View File
@@ -0,0 +1,5 @@
Milestones
1) Implement all MIDI1 classes.
2) Implement all MIDI2 classes.
+19
View File
@@ -0,0 +1,19 @@
General:
- Fill out headers.
- Add copyright information to files.
BMidi:
- Put semaphores in the right places if necessary.
BMidiStore:
- Implement formats 1 and 2
- Implement frame based timing
- Implement export functionality.
- Cleanup
BMidiText:
- Nothing?
midi_server:
- Get started.
+97
View File
@@ -0,0 +1,97 @@
Just some general thoughts that have occurred to me as I've started
looking at stuff related to designing a network stack...
These are in no particular order.
General Jottings
----------------
- zero-copy is a laudible aim, but in reality single copy is probably
as good as we're going to get to. Basically this means that we copy data
into the stack at some point.
- we should use a version of the mbuff's that the BSD stack uses with changes
so we use them more efficiently for our stack.
- probably need an rx and tx queue for frames.
- we should reallt be dealing with frames as soon as we can in the stack,
though we don't want to fragment earlier than we need to - what a quandry!
- it should be possible to stack/reorder modules as needed. This would be cool
if we could deal with input from other sources, e.g. data from a USB port
to be fed into a ppp stack, onto an atm/ethernet frame module and upwards.
Userland vs Kernel Land
-----------------------
This has been decided as follows...
- initial stack will be userland
- stack should be modular enough that it could be moved into kernel with
little or no real work.
Initial Protocols
-----------------
- ethernet/802.x encapsulation (rx only for 802.x)
- slip (?)
- ppp (?)
- arp
- ipv4
- icmp (v4)
- udp
- tcp
Extra's
-------
- appletalk ?
- ipv6
- icmpv6
- ipv6 discovery (arp for v6)
- atm encapsulation module?
- usb interface (net stack to usb??)
Stack Map
=========
So, how does this all fit together???
[david: My ascii art is terrible, so hope this works out :)]
=================
= User apps = USERLAND
=================
| | |
| | |
========= ========= =========
= UDP = = ICMP* = = TCP =
========= ========= =========
\ | /
\ | /
===============
MBUF = IP (v4/v6) =
===============
|
-----------------------------
| |
=============== | =======
BUFFER = Eth/802.x =----|---= ARP =
=============== | =======
| |
----------------------------|-----
| |
=========== |
= NIC IF = | KERNEL
===========
* ICMP is used as a placeholder for both ICMPv4 and ICMPv6, which are very
different from each other in scope and usage.
Basically every module only needs to be able to call the module that deal with the
input/output of the protocol it find encapsulated, i.e. if IP finds a TCP packet
it simply needs to be able to call tcp_input and pass the mbuf along. There is a
requirement that each call to xxx_input gives the length of the header as they're
variable in most protocols.
This just starts to scratch the surface, but I hope gives more of an idea
of what's been bouncing around in my head. :)
+13
View File
@@ -0,0 +1,13 @@
Network Drivers - Milestone #1
Having done some work on the Tulip cards, here are some general
comments.
- we should have both an rx and tx queue and pop/push from the queue
in the system rx/tx_thread. this should provide good performance
- order of calling is
: detect
: init
- the driver is normally in 2 pieces, one for the general calls and
one for the device specific stuff.
+22
View File
@@ -0,0 +1,22 @@
Net Cache - Milestone #2
========================
Hmm, a general purpose net cache.
Types of Cache
==============
What are we likely to need a fast cache for? Look below.
- ipv4 address to ethernet MAC address (ARP)
- MAC address to IPv4 (RARP)
- list of IPv6 neighbours/routers/prefix's
There remain problems in that for many of these needs additional
information is required, this information being specific to the
use at the time.
However, all these uses require an ability to quickly find information
given a key that is a number of variable length, hence the conceptual
idea of using a hash lookup.
+66
View File
@@ -0,0 +1,66 @@
Milestones
==========
These were agreed 17th january 2002 in an IRC meeting.
IRC log http://www.darkest.org/openbeos/netkit/02.01.17.openbeosnetkit.log
Milestone Description
1 network drivers
It was recognised that until the team members had
working NIC's there was little point in trying to
develop a network stack.
STATUS: rtl8139 in repository
tulip driver written covering Netgear FA310TX
Ne2000 driver started
2 Encapsulation
Ethernet packets come in 2 basic forms,
ethernet encapsulation (rfc 894)
IEEE 802.2/3/4/5 (rfc1042)
We need to be able to handle both. However, we only
MUST be able to send ethernet compatible frames. In pactice
we should try to send the frame in the same format that it
was received. In fact we may want to store the format used by
hosts?
David says this isn't easy to do with the current newos
stack design.
STATUS: newos has ethernet support, but with the current
architecture it's difficult to add fully transparent
support for other encapsulations.
3 ARP module
Once we can get frames from the network, one of the first
things we need to do is start capturing and caching ARP
requests.
NB david thinks this should be aimed at providing more
general purpose caching so it's useful beyond ARP. he
suggests we call this a Net Cache module.
STATUS: newos has an arp module, though cache needs work
and is limited to ipv4
4 IPv4 checksums + routing
Implement IPv4 checksums and routing
STATUS: newos has a basic version of thisi
5 IPv4 ICMP
Add ICMP support to out IPv4 module
6 IPv4 Fragmentation
This will be interesting, adding support for reconstructing
and deconstructing packets into suitable frames for transport.
NB this needs to be abel to deal with different sizes of
frame.
STATUS:
7 TCP/UDP
STATUS: newos has rudimentary UDP support
+20
View File
@@ -0,0 +1,20 @@
Document naming.
Well, I've been thinking about this and I've decided that maybe
this formatting of the numbers we use will work. Maybe it won't,
but until someone else shouts...
First digit is the milestone referred to, with 0 being for
general design.
Second digit:
- layer involved for general design
- incremental for milestones
- 0 for general design comments
So, 00 = general design principals
01 = general design for layer 1
10 = general design comments for milestone 1
11 = first document about milestone 1
Does that work for people?
@@ -0,0 +1,6 @@
PrintServerApp::MessageReceived(): BMessage: what = selp (0x73656c70, or 1936026736)
entry driver, type='CSTR', c=1, size=17, data[0]: "EPSON C40 Series"
entry transport, type='CSTR', c=1, size=12, data[0]: "Serial Port"
entry transport path, type='CSTR', c=1, size=8, data[0]: "serial1"
entry printer name, type='CSTR', c=1, size=8, data[0]: "my_test"
entry connection, type='CSTR', c=1, size=6, data[0]: "Local"
+19
View File
@@ -0,0 +1,19 @@
2x PageSetup
1x Print
config_page((null),0x80013478)
BMessage: what = pgst (0x70677374, or 1885827956)
entry printer, type='LONG', c=1, size= 4, data[0]: 0x80013218 (-2147405288, ী2')
config_page((null),0x80013478)
BMessage: what = pgst (0x70677374, or 1885827956)
entry current_printer, type='CSTR', c=1, size=12, data[0]: "DemoPrinter"
entry printer, type='LONG', c=1, size= 4, data[0]: 0x80013218 (-2147405288, ী2')
config_job((null),0x80013478)
BMessage: what = ppst (0x70707374, or 1886417780)
entry current_printer, type='CSTR', c=1, size=12, data[0]: "DemoPrinter"
entry printer, type='LONG', c=1, size= 4, data[0]: 0x80013218 (-2147405288, ী2')
@@ -0,0 +1,72 @@
BMessage: what = okok (0x6f6b6f6b, or 1869311851)
entry printer, type='LONG', c=1, size= 4, data[0]: 0x8003b390 (-2147241072, ೐')
entry page_format, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry orientation, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry scale, type='FLOT', c=1, size= 4, data[0]: 100.0000
entry xres, type='LONG', c=1, size= 4, data[0]: 0x12c (300, '')
entry yres, type='LONG', c=1, size= 4, data[0]: 0x12c (300, '')
entry paper_rect, type='RECT', c=1, size=16, data[0]: BRect(l:0.0, t:0.0, r:612.0, b:792.0)
entry printable_rect, type='RECT', c=1, size=16, data[0]: BRect(l:18.0, t:18.0, r:594.0, b:774.0)
entry current_printer, type='CSTR', c=1, size=27, data[0]: "HPLaserJetPCL3Driver_BeInc"
BMessage: what = GOOD (0x474f4f44, or 1196379972)
entry printer, type='LONG', c=1, size= 4, data[0]: 0x800131a8 (-2147405400, ী౨')
entry EPST_copies, type='LONG', c=1, size= 4, data[0]: 0x1 (1, '')
entry EPST_dst_idx_page, type='LONG', c=1, size= 4, data[0]: 0x5 (5, '')
entry EPST_src_idx_page, type='LONG', c=1, size= 4, data[0]: 0x7 (7, '')
entry EPST_orientation, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_page_order, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_centered, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_extended, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_rotate180, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_page_state, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_logic_userdef_width, type='FLOT', c=1, size= 4, data[0]: 0.0000
entry EPST_logic_userdef_height, type='FLOT', c=1, size= 4, data[0]: 0.0000
entry EPST_page_name, type='CSTR', c=1, size=3, data[0]: "A4"
entry EPST_scale, type='FLOT', c=1, size= 4, data[0]: 100.0000
entry paper_rect, type='RECT', c=1, size=16, data[0]: BRect(l:0.0, t:0.0, r:595.2, b:841.8)
entry printable_rect, type='RECT', c=1, size=16, data[0]: BRect(l:8.4, t:8.4, r:586.8, b:802.2)
entry EPST_page_rect, type='RECT', c=1, size=16, data[0]: BRect(l:0.0, t:0.0, r:2976.0, b:4209.0)
entry EPST_printer_rect, type='RECT', c=1, size=16, data[0]: BRect(l:42.0, t:42.0, r:2934.0, b:4011.0)
entry EPST_page_settings_dpi, type='FLOT', c=1, size= 4, data[0]: 72.0000
entry EPST_printer_settings_dpi, type='FLOT', c=1, size= 4, data[0]: 360.0000
entry EPST_paper_feed, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_quality, type='LONG', c=1, size= 4, data[0]: 0x1 (1, '')
entry EPST_resolution, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_paper_type, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_color, type='LONG', c=1, size= 4, data[0]: 0x6 (6, '')
entry EPST_microweave, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry EPST_unidirectionnal, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry xres, type='LONG', c=1, size= 4, data[0]: 0x168 (360, '')
entry yres, type='LONG', c=1, size= 4, data[0]: 0x168 (360, '')
entry EPST_BEATWARE, type='BOOL', c=1, size= 1, data[0]: 0
entry first_page, type='LONG', c=1, size= 4, data[0]: 0x1 (1, '')
entry last_page, type='LONG', c=1, size= 4, data[0]: 0x7fffffff (2147483647, '')
entry EPST_preview, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry current_printer, type='CSTR', c=1, size=24, data[0]: "EPSONStylusDriver_BeInc"
BMessage: what = okok (0x6f6b6f6b, or 1869311851)
entry printer, type='LONG', c=1, size= 4, data[0]: 0x8003b498 (-2147240808, ഘ')
entry bitmap, type='BOOL', c=1, size= 1, data[0]: 0
entry HighQuality, type='BOOL', c=1, size= 1, data[0]: 0
entry in_color, type='BOOL', c=1, size= 1, data[0]: 0
entry orientation, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry page size, type='CSTR', c=1, size=7, data[0]: "Letter"
entry ppd_item, type='MSGG', c=1, size= 0,
entry xres, type='LLNG', c=1, size= 8, data[0]: 0x12c (300, '')
entry yres, type='LLNG', c=1, size= 8, data[0]: 0x12c (300, '')
entry paper_rect, type='RECT', c=1, size=16, data[0]: BRect(l:0.0, t:0.0, r:612.0, b:792.0)
entry units, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry printable_rect, type='RECT', c=1, size=16, data[0]: BRect(l:14.4, t:21.6, r:597.6, b:784.8)
entry first up, type='BOOL', c=1, size= 1, data[0]: 1
entry current_printer, type='CSTR', c=1, size=23, data[0]: "PostScriptDriver_BeInc"
BMessage: what = okok (0x6f6b6f6b, or 1869311851)
entry printer, type='LONG', c=1, size= 4, data[0]: 0x80018af0 (-2147382544, 瀊')
entry orientation, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry scale, type='FLOT', c=1, size= 4, data[0]: 100.0000
entry xres, type='LONG', c=1, size= 4, data[0]: 0x12c (300, '')
entry yres, type='LONG', c=1, size= 4, data[0]: 0x12c (300, '')
entry paper_rect, type='RECT', c=1, size=16, data[0]: BRect(l:0.0, t:0.0, r:612.0, b:792.0)
entry printable_rect, type='RECT', c=1, size=16, data[0]: BRect(l:0.0, t:0.0, r:612.0, b:792.0)
entry current_printer, type='CSTR', c=1, size=20, data[0]: "PreviewDriver_BeInc"

After

Width:  |  Height:  |  Size: 5.3 KiB

@@ -0,0 +1,40 @@
$ print_server
----------------------------------------------------------------------------------------------------------------------------------------------------
PAGE SETUP.........
----------------------------------------------------------------------------------------------------------------------------------------------------
PrintServerApp::MessageReceived(): BMessage: what = pgst (0x70677374, or 1885827956)
PrintServerApp::MessageReceived(): BMessage: what = BRAW (0x42524157, or 1112686935)
entry active, type='BOOL', c=1, size= 1, data[0]: 1
PrintServerApp::MessageReceived(): BMessage: what = BRAW (0x42524157, or 1112686935)
entry active, type='BOOL', c=1, size= 1, data[0]: 0
PrintServerApp::MessageReceived(): BMessage: what = pgcp (0x70676370, or 1885823856)
----------------------------------------------------------------------------------------------------------------------------------------------------
PRINT.........
----------------------------------------------------------------------------------------------------------------------------------------------------
PrintServerApp::MessageReceived(): BMessage: what = pgcp (0x70676370, or 1885823856)
PrintServerApp::MessageReceived(): BMessage: what = ppst (0x70707374, or 1886417780)
entry orientation, type='LONG', c=1, size= 4, data[0]: 0x0 (0, '')
entry scale, type='FLOT', c=1, size= 4, data[0]: 100.0000
entry xres, type='LONG', c=1, size= 4, data[0]: 0x12c (300, '')
entry yres, type='LONG', c=1, size= 4, data[0]: 0x12c (300, '')
entry paper_rect, type='RECT', c=1, size=16, data[0]: BRect(l:0.0, t:0.0, r:612.0, b:792.0)
entry printable_rect, type='RECT', c=1, size=16, data[0]: BRect(l:0.0, t:0.0, r:612.0, b:792.0)
entry current_printer, type='CSTR', c=1, size=20, data[0]: "PreviewDriver_BeInc"
PrintServerApp::MessageReceived(): BMessage: what = BRAW (0x42524157, or 1112686935)
entry active, type='BOOL', c=1, size= 1, data[0]: 1
PrintServerApp::MessageReceived(): BMessage: what = BRAW (0x42524157, or 1112686935)
entry active, type='BOOL', c=1, size= 1, data[0]: 0
PrintServerApp::MessageReceived(): BMessage: what = pgcp (0x70676370, or 1885823856)
----------------------------------------------------------------------------------------------------------------------------------------------------
After spooling:
----------------------------------------------------------------------------------------------------------------------------------------------------
PrintServerApp::MessageReceived(): BMessage: what = pgcp (0x70676370, or 1885823856)
PrintServerApp::MessageReceived(): BMessage: what = psns (0x70736e73, or 1886613107)
entry JobName, type='CSTR', c=1, size=15, data[0]: "InterestFields"
entry Spool File, type='CSTR', c=1, size=79, data[0]: "/boot/home/config/settings/printers/PreviewDriver_BeInc/InterestFields@8257001"
@@ -0,0 +1 @@
BRect(78.0, 71.0, 561.0, 409.0)
@@ -0,0 +1,5 @@
Information from BeOS R5 implementation:
BPrintJob::ConfigPage()
BPrintJob::ConfigJob()
BPrintJob::TakeJob()
@@ -0,0 +1,18 @@
$ print_server
Loaded addon /boot/home/config/add-ons/Print/DemoDriver
Loaded addon /boot/beos/system/add-ons/Print/transport/Serial Port
Loaded addon /boot/beos/system/add-ons/Print/EPSON Stylus Driver
Loaded addon /boot/beos/system/add-ons/Print/transport/Parallel Port
Loaded addon /boot/beos/system/add-ons/Print/HP PCL3 LaserJet Compatible
Loaded addon /boot/beos/system/add-ons/Print/transport/USB Port
Loaded addon /boot/beos/system/add-ons/Print/PostScript
Loaded addon /boot/beos/system/add-ons/Print/transport/Print To File
Loaded addon /boot/beos/system/add-ons/Print/Preview
BMessage: what = pgst (0x70677374, or 1885827956)
BMessage: what = pgcp (0x70676370, or 1885823856)
-------------------------------------------------
BMessage: what = pgcp (0x70676370, or 1885823856)
BMessage: what = ppst (0x70707374, or 1886417780)
entry current_printer, type='CSTR', c=1, size=24, data[0]: "EPSONStylusDriver_BeInc"
BMessage: what = pdef (0x70646566, or 1885627750)
BMessage: what = pgcp (0x70676370, or 1885823856)

Some files were not shown because too many files have changed in this diff Show More