ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /module/palm.m/
Palm: module {
#
# basic Palm data types
#
PATH: con "/dis/lib/palm.dis";
DBInfo: adt {
name: string;
attr: int;
dtype: string; # database type (byte[4])
version: int; # defined by application
creator: string; # creating application (byte[4])
ctime: int;
mtime: int;
btime: int; # last backup
modno: int; # modification number: set to zero
uidseed: int; # unique record ID seed (unused, set to zero)
# the following is used by the database access protocol
index: int;
new: fn(name: string, attr: int, dtype: string, version: int, creator: string): ref DBInfo;
};
# file attributes:
Fresource: con 1<<0; # file is .prc not .pdb
Fronly: con 1<<1; # read only
Fappinfodirty: con 1<<2;
Fbackup: con 1<<3; # no conduit exists
Foverwrite: con 1<<4; # overwrite older copy if present
Freset: con 1<<5; # reset after installation
Fprivate: con 1<<6; # don't allow copy of this to be beamed
Fstream: con 1<<7; # file is an array of bytes, not a database
# extended (misc) attributes for Desklink->ReadDBList
Fnosync: con (1<<7)<<16;
Frambased: con (1<<6)<<16;
Noindex: con 16rFFFF; # unknown index
Record: adt {
id: int; # unique record ID (24 bits)
attr: int; # record attributes
cat: int; # category
data: array of byte;
new: fn(id: int, attr: int, cat: int, size: int): ref Record;
};
# Record.attr values:
Rdelete: con 16r80; # delete next sync
Rdirty: con 16r40; # record modified
Rinuse: con 16r20; # record in use
Rsecret: con 16r10; # record is secret
Rarchive: con 16r08; # archive next sync
Rmcat: con 16r0F; # mask for category field in Palmdb->Entry.attrs
Resource: adt {
name: int; # byte[4]: resource name or type
id: int; # resource ID (16 bits)
data: array of byte;
new: fn(name: int, id: int, size: int): ref Resource;
};
# common form of category data in appinfo
Categories: adt {
renamed: int; # which categories have been renamed
labels: array of string; # 16 category names
uids: array of int; # corresponding unique IDs
lastuid: int; # last unique ID assigned
appdata: array of byte; # remaining data is application-specific
new: fn(labels: array of string): ref Categories;
unpack: fn(a: array of byte): ref Categories;
pack: fn(c: self ref Categories): array of byte;
mkidmap: fn(c: self ref Categories): array of int;
};
Doc: adt {
m: Palmdb;
file: ref Palmdb->PDB;
version: int;
length: int; # uncompressed
nrec: int; # text records only
recsize: int; # uncompressed
position: int;
sizes: array of int; # sizes of uncompressed records
open: fn(m: Palmdb, file: ref Palmdb->PDB): (ref Doc, string);
read: fn(nil: self ref Doc, i: int): (string, string);
iscompressed: fn(nil: self ref Doc): int;
unpacktext: fn(d: self ref Doc, a: array of byte): (string, string);
textlength: fn(d: self ref Doc, a: array of byte): int;
};
init: fn(): string;
# name mapping
filename: fn(s: string): string;
dbname: fn(s: string): string;
# convert between resource/application ID and string
id2s: fn(id: int): string;
s2id: fn(s: string): int;
# time conversion
pilot2epoch: fn(t: int): int;
epoch2pilot: fn(t: int): int;
# Latin-1 to string conversion
gets: fn(a: array of byte): string;
puts: fn(a: array of byte, s: string);
# big-endian conversion
get2: fn(a: array of byte): int;
get3: fn(a: array of byte): int;
get4: fn(a: array of byte): int;
put2: fn(a: array of byte, v: int);
put3: fn(a: array of byte, v: int);
put4: fn(a: array of byte, v: int);
# argument wrapping for Desklink and CMP 2.x
ArgIDbase: con 16r20; # first argument ID
argsize: fn(args: array of (int, array of byte)): int;
packargs: fn(out: array of byte, args: array of (int, array of byte)): array of byte;
unpackargs: fn(argc: int, reply: array of byte): (array of (int, array of byte), string);
};
Palmdb: module {
PATH: con "/dis/lib/palmdb.dis";
DB: adt {
x: int; # instance index, used internally
mode: int;
attr: int; # essential database attributes
open: fn(nil: string, mode: int): (ref DB, string);
create: fn(nil: string, mode: int, perm: int, nil: ref Palm->DBInfo): (ref DB, string);
close: fn(nil: self ref DB): string;
stat: fn(nil: self ref DB): ref Palm->DBInfo;
wstat: fn(nil: self ref DB, nil: ref Palm->DBInfo, flags: int);
rdappinfo: fn(nil: self ref DB): (array of byte, string);
wrappinfo: fn(nil: self ref DB, nil: array of byte): string;
rdsortinfo: fn(nil: self ref DB): (array of int, string);
wrsortinfo: fn(nil: self ref DB, nil: array of int): string;
readidlist: fn(nil: self ref DB, sort: int): array of int;
nentries: fn(nil: self ref DB): int;
resetsyncflags: fn(nil: self ref DB): string;
records: fn(nil: self ref DB): ref PDB;
resources: fn(nil: self ref DB): ref PRC;
};
# database files (.pdb, .doc, and most others)
PDB: adt {
db: ref DB;
read: fn(nil: self ref PDB, index: int): ref Palm->Record;
readid: fn(nil: self ref PDB, id: int): (ref Palm->Record, int);
resetnext: fn(nil: self ref PDB): int;
readnextmod: fn(nil: self ref PDB): (ref Palm->Record, int);
# DLP 1.1 functions:
# readnextincat(nil: self ref DB, cat: int): (ref Palm->Record, string);
# readnextmodincat(nil: self ref DB, cat: int): (ref Palm->Record, string);
write: fn(nil: self ref PDB, r: ref Palm->Record): string;
truncate: fn(nil: self ref PDB): string;
delete: fn(nil: self ref PDB, id: int): string;
deletecat: fn(nil: self ref PDB, cat: int): string;
purge: fn(nil: self ref PDB): string;
movecat: fn(nil: self ref PDB, old: int, new: int): string;
};
# resource files (.prc)
PRC: adt {
db: ref DB;
# read by index, or by type & id
read: fn(nil: self ref PRC, index: int): ref Palm->Resource;
readtype: fn(nil: self ref PRC, name: int, id: int): (ref Palm->Resource, int);
# write by type and id only (desklink)
write: fn(nil: self ref PRC, r: ref Palm->Resource): string;
truncate: fn(nil: self ref PRC): string;
delete: fn(nil: self ref PRC, name: int, id: int): string;
};
# open modes (not the same as Sys->)
OREAD: con 16r80;
OWRITE: con 16r40;
ORDWR: con OREAD|OWRITE;
OEXCL: con 16r20;
OSECRET: con 16r10;
init: fn(m: Palm): string;
};