"unsafe";
)
-var srpcEnabled = srpc.Enabled();
+var srpcEnabled = srpc.Enabled()
// native_client/src/trusted/service_runtime/include/sys/audio_video.h
// Subsystem values for Init.
const (
- SubsystemVideo = 1<<iota;
+ SubsystemVideo = 1<<iota;
SubsystemAudio;
SubsystemEmbed;
)
// Audio formats.
const (
- AudioFormatStereo44K = iota;
+ AudioFormatStereo44K = iota;
AudioFormatStereo48K;
)
// A Window represents a connection to the Native Client window.
// It implements draw.Context.
type Window struct {
- Embedded bool; // running as part of a web page?
- *Image; // screen image
+ Embedded bool; // running as part of a web page?
+ *Image; // screen image
- mousec chan draw.Mouse;
- kbdc chan int;
- quitc chan bool;
- resizec chan bool;
+ mousec chan draw.Mouse;
+ kbdc chan int;
+ quitc chan bool;
+ resizec chan bool;
}
// *Window implements draw.Context
xsubsys := subsys;
if srpcEnabled {
waitBridge();
- xsubsys &^= SubsystemVideo|SubsystemEmbed;
+ xsubsys &^= SubsystemVideo | SubsystemEmbed;
}
if xsubsys & SubsystemEmbed != 0 {
return nil, err;
}
- if subsys&SubsystemVideo != 0 {
+ if subsys & SubsystemVideo != 0 {
if dx, dy, err = videoInit(dx, dy); err != nil {
return nil, err;
}
w.quitc = make(chan bool);
}
- if subsys&SubsystemAudio != 0 {
+ if subsys & SubsystemAudio != 0 {
var n int;
if n, err = audioInit(AudioFormatStereo44K, 2048); err != nil {
return nil, err;
println("audio", n);
}
- if subsys&SubsystemVideo != 0 {
+ if subsys & SubsystemVideo != 0 {
go w.readEvents();
}
return os.NewSyscallError("video_update", syscall.VideoUpdate((*uint32)(&data[0])));
}
-var noEvents = os.NewError("no events");
+var noEvents = os.NewError("no events")
func videoPollEvent(ev []byte) (err os.Error) {
if srpcEnabled {
return noEvents;
}
bytes.Copy(ev, &bridge.share.eq.event[r]);
- bridge.share.eq.ri = (r+1) % eqsize;
+ bridge.share.eq.ri = (r+1)%eqsize;
return nil;
}
return os.NewSyscallError("video_poll_event", syscall.VideoPollEvent(&ev[0]));
// Synchronization structure to wait for bridge to become ready.
var bridge struct {
- c chan bool;
- displayFd int;
- rpcFd int;
- share *videoShare;
- pixel []Color;
- client *srpc.Client;
- flushRPC *srpc.RPC;
+ c chan bool;
+ displayFd int;
+ rpcFd int;
+ share *videoShare;
+ pixel []Color;
+ client *srpc.Client;
+ flushRPC *srpc.RPC;
}
// Wait for bridge to become ready.
bridge.c <- <-bridge.c;
}
-const eqsize = 64;
+const eqsize = 64
// Data structure shared with host via mmap.
type videoShare struct {
- revision int32; // definition below is rev 100 unless noted
- mapSize int32;
+ revision int32; // definition below is rev 100 unless noted
+ mapSize int32;
// event queue
- eq struct {
- ri uint32; // read index [0,eqsize)
- wi uint32; // write index [0,eqsize)
- eof int32;
- event [eqsize][64]byte;
+ eq struct {
+ ri uint32; // read index [0,eqsize)
+ wi uint32; // write index [0,eqsize)
+ eof int32;
+ event [eqsize][64]byte;
};
// now unused
- _, _, _, _ int32;
+ _, _, _, _ int32;
// video backing store information
- width, height, _, size int32;
- ready int32; // rev 0x101
+ width, height, _, size int32;
+ ready int32; // rev 0x101
}
// The frame buffer data is videoShareSize bytes after
addr, _, errno := syscall.Syscall6(syscall.SYS_MMAP,
0,
uintptr(st.Size),
- syscall.PROT_READ|syscall.PROT_WRITE,
+ syscall.PROT_READ | syscall.PROT_WRITE,
syscall.MAP_SHARED,
uintptr(bridge.displayFd),
0);
// Overestimate frame buffer size
// (must use a compile-time constant)
// and then reslice. 256 megapixels (1 GB) should be enough.
- fb := (*[256*1024*1024]Color)(unsafe.Pointer(addr+videoShareSize));
- bridge.pixel = fb[0:(st.Size - videoShareSize)/4];
+ fb := (*[256*1024*1024]Color)(unsafe.Pointer(addr + videoShareSize));
+ bridge.pixel = fb[0 : (st.Size - videoShareSize)/4];
// Configure RPC connection back to client.
var err os.Error;
srpc.Add("nacl_multimedia_bridge", "hh:", multimediaBridge{});
}
}
-
)
// An eventType identifies the type of a Native Client Event.
-type eventType uint8;
+type eventType uint8
+
const (
- eventActive = 1+iota;
+ eventActive = 1+iota;
eventExpose;
eventKeyDown;
eventKeyUp;
// A key represents a key on a keyboard.
type key uint16
+
const (
- keyUnknown = 0;
- keyFirst = 0;
- keyBackspace = 8;
- keyTab = 9;
- keyClear = 12;
- keyReturn = 13;
- keyPause = 19;
- keyEscape = 27;
- keySpace = 32;
- keyExclaim = 33;
- keyQuotedbl = 34;
- keyHash = 35;
- keyDollar = 36;
- keyAmpersand = 38;
- keyQuote = 39;
- keyLeftparen = 40;
- keyRightparen = 41;
- keyAsterisk = 42;
- keyPlus = 43;
- keyComma = 44;
- keyMinus = 45;
- keyPeriod = 46;
- keySlash = 47;
- key0 = 48;
- key1 = 49;
- key2 = 50;
- key3 = 51;
- key4 = 52;
- key5 = 53;
- key6 = 54;
- key7 = 55;
- key8 = 56;
- key9 = 57;
- keyColon = 58;
- keySemicolon = 59;
- keyLess = 60;
- keyEquals = 61;
- keyGreater = 62;
- keyQuestion = 63;
- keyAt = 64;
- keyLeftbracket = 91;
- keyBackslash = 92;
- keyRightbracket = 93;
- keyCaret = 94;
- keyUnderscore = 95;
- keyBackquote = 96;
- keyA = 97;
- keyB = 98;
- keyC = 99;
- keyD = 100;
- keyE = 101;
- keyF = 102;
- keyG = 103;
- keyH = 104;
- keyI = 105;
- keyJ = 106;
- keyK = 107;
- keyL = 108;
- keyM = 109;
- keyN = 110;
- keyO = 111;
- keyP = 112;
- keyQ = 113;
- keyR = 114;
- keyS = 115;
- keyT = 116;
- keyU = 117;
- keyV = 118;
- keyW = 119;
- keyX = 120;
- keyY = 121;
- keyZ = 122;
- keyDelete = 127;
- keyWorld0 = 160;
- keyWorld1 = 161;
- keyWorld2 = 162;
- keyWorld3 = 163;
- keyWorld4 = 164;
- keyWorld5 = 165;
- keyWorld6 = 166;
- keyWorld7 = 167;
- keyWorld8 = 168;
- keyWorld9 = 169;
- keyWorld10 = 170;
- keyWorld11 = 171;
- keyWorld12 = 172;
- keyWorld13 = 173;
- keyWorld14 = 174;
- keyWorld15 = 175;
- keyWorld16 = 176;
- keyWorld17 = 177;
- keyWorld18 = 178;
- keyWorld19 = 179;
- keyWorld20 = 180;
- keyWorld21 = 181;
- keyWorld22 = 182;
- keyWorld23 = 183;
- keyWorld24 = 184;
- keyWorld25 = 185;
- keyWorld26 = 186;
- keyWorld27 = 187;
- keyWorld28 = 188;
- keyWorld29 = 189;
- keyWorld30 = 190;
- keyWorld31 = 191;
- keyWorld32 = 192;
- keyWorld33 = 193;
- keyWorld34 = 194;
- keyWorld35 = 195;
- keyWorld36 = 196;
- keyWorld37 = 197;
- keyWorld38 = 198;
- keyWorld39 = 199;
- keyWorld40 = 200;
- keyWorld41 = 201;
- keyWorld42 = 202;
- keyWorld43 = 203;
- keyWorld44 = 204;
- keyWorld45 = 205;
- keyWorld46 = 206;
- keyWorld47 = 207;
- keyWorld48 = 208;
- keyWorld49 = 209;
- keyWorld50 = 210;
- keyWorld51 = 211;
- keyWorld52 = 212;
- keyWorld53 = 213;
- keyWorld54 = 214;
- keyWorld55 = 215;
- keyWorld56 = 216;
- keyWorld57 = 217;
- keyWorld58 = 218;
- keyWorld59 = 219;
- keyWorld60 = 220;
- keyWorld61 = 221;
- keyWorld62 = 222;
- keyWorld63 = 223;
- keyWorld64 = 224;
- keyWorld65 = 225;
- keyWorld66 = 226;
- keyWorld67 = 227;
- keyWorld68 = 228;
- keyWorld69 = 229;
- keyWorld70 = 230;
- keyWorld71 = 231;
- keyWorld72 = 232;
- keyWorld73 = 233;
- keyWorld74 = 234;
- keyWorld75 = 235;
- keyWorld76 = 236;
- keyWorld77 = 237;
- keyWorld78 = 238;
- keyWorld79 = 239;
- keyWorld80 = 240;
- keyWorld81 = 241;
- keyWorld82 = 242;
- keyWorld83 = 243;
- keyWorld84 = 244;
- keyWorld85 = 245;
- keyWorld86 = 246;
- keyWorld87 = 247;
- keyWorld88 = 248;
- keyWorld89 = 249;
- keyWorld90 = 250;
- keyWorld91 = 251;
- keyWorld92 = 252;
- keyWorld93 = 253;
- keyWorld94 = 254;
- keyWorld95 = 255;
+ keyUnknown = 0;
+ keyFirst = 0;
+ keyBackspace = 8;
+ keyTab = 9;
+ keyClear = 12;
+ keyReturn = 13;
+ keyPause = 19;
+ keyEscape = 27;
+ keySpace = 32;
+ keyExclaim = 33;
+ keyQuotedbl = 34;
+ keyHash = 35;
+ keyDollar = 36;
+ keyAmpersand = 38;
+ keyQuote = 39;
+ keyLeftparen = 40;
+ keyRightparen = 41;
+ keyAsterisk = 42;
+ keyPlus = 43;
+ keyComma = 44;
+ keyMinus = 45;
+ keyPeriod = 46;
+ keySlash = 47;
+ key0 = 48;
+ key1 = 49;
+ key2 = 50;
+ key3 = 51;
+ key4 = 52;
+ key5 = 53;
+ key6 = 54;
+ key7 = 55;
+ key8 = 56;
+ key9 = 57;
+ keyColon = 58;
+ keySemicolon = 59;
+ keyLess = 60;
+ keyEquals = 61;
+ keyGreater = 62;
+ keyQuestion = 63;
+ keyAt = 64;
+ keyLeftbracket = 91;
+ keyBackslash = 92;
+ keyRightbracket = 93;
+ keyCaret = 94;
+ keyUnderscore = 95;
+ keyBackquote = 96;
+ keyA = 97;
+ keyB = 98;
+ keyC = 99;
+ keyD = 100;
+ keyE = 101;
+ keyF = 102;
+ keyG = 103;
+ keyH = 104;
+ keyI = 105;
+ keyJ = 106;
+ keyK = 107;
+ keyL = 108;
+ keyM = 109;
+ keyN = 110;
+ keyO = 111;
+ keyP = 112;
+ keyQ = 113;
+ keyR = 114;
+ keyS = 115;
+ keyT = 116;
+ keyU = 117;
+ keyV = 118;
+ keyW = 119;
+ keyX = 120;
+ keyY = 121;
+ keyZ = 122;
+ keyDelete = 127;
+ keyWorld0 = 160;
+ keyWorld1 = 161;
+ keyWorld2 = 162;
+ keyWorld3 = 163;
+ keyWorld4 = 164;
+ keyWorld5 = 165;
+ keyWorld6 = 166;
+ keyWorld7 = 167;
+ keyWorld8 = 168;
+ keyWorld9 = 169;
+ keyWorld10 = 170;
+ keyWorld11 = 171;
+ keyWorld12 = 172;
+ keyWorld13 = 173;
+ keyWorld14 = 174;
+ keyWorld15 = 175;
+ keyWorld16 = 176;
+ keyWorld17 = 177;
+ keyWorld18 = 178;
+ keyWorld19 = 179;
+ keyWorld20 = 180;
+ keyWorld21 = 181;
+ keyWorld22 = 182;
+ keyWorld23 = 183;
+ keyWorld24 = 184;
+ keyWorld25 = 185;
+ keyWorld26 = 186;
+ keyWorld27 = 187;
+ keyWorld28 = 188;
+ keyWorld29 = 189;
+ keyWorld30 = 190;
+ keyWorld31 = 191;
+ keyWorld32 = 192;
+ keyWorld33 = 193;
+ keyWorld34 = 194;
+ keyWorld35 = 195;
+ keyWorld36 = 196;
+ keyWorld37 = 197;
+ keyWorld38 = 198;
+ keyWorld39 = 199;
+ keyWorld40 = 200;
+ keyWorld41 = 201;
+ keyWorld42 = 202;
+ keyWorld43 = 203;
+ keyWorld44 = 204;
+ keyWorld45 = 205;
+ keyWorld46 = 206;
+ keyWorld47 = 207;
+ keyWorld48 = 208;
+ keyWorld49 = 209;
+ keyWorld50 = 210;
+ keyWorld51 = 211;
+ keyWorld52 = 212;
+ keyWorld53 = 213;
+ keyWorld54 = 214;
+ keyWorld55 = 215;
+ keyWorld56 = 216;
+ keyWorld57 = 217;
+ keyWorld58 = 218;
+ keyWorld59 = 219;
+ keyWorld60 = 220;
+ keyWorld61 = 221;
+ keyWorld62 = 222;
+ keyWorld63 = 223;
+ keyWorld64 = 224;
+ keyWorld65 = 225;
+ keyWorld66 = 226;
+ keyWorld67 = 227;
+ keyWorld68 = 228;
+ keyWorld69 = 229;
+ keyWorld70 = 230;
+ keyWorld71 = 231;
+ keyWorld72 = 232;
+ keyWorld73 = 233;
+ keyWorld74 = 234;
+ keyWorld75 = 235;
+ keyWorld76 = 236;
+ keyWorld77 = 237;
+ keyWorld78 = 238;
+ keyWorld79 = 239;
+ keyWorld80 = 240;
+ keyWorld81 = 241;
+ keyWorld82 = 242;
+ keyWorld83 = 243;
+ keyWorld84 = 244;
+ keyWorld85 = 245;
+ keyWorld86 = 246;
+ keyWorld87 = 247;
+ keyWorld88 = 248;
+ keyWorld89 = 249;
+ keyWorld90 = 250;
+ keyWorld91 = 251;
+ keyWorld92 = 252;
+ keyWorld93 = 253;
+ keyWorld94 = 254;
+ keyWorld95 = 255;
// Numeric keypad
- keyKp0 = 256;
- keyKp1 = 257;
- keyKp2 = 258;
- keyKp3 = 259;
- keyKp4 = 260;
- keyKp5 = 261;
- keyKp6 = 262;
- keyKp7 = 263;
- keyKp8 = 264;
- keyKp9 = 265;
- keyKpPeriod = 266;
- keyKpDivide = 267;
- keyKpMultiply = 268;
- keyKpMinus = 269;
- keyKpPlus = 270;
- keyKpEnter = 271;
- keyKpEquals = 272;
+ keyKp0 = 256;
+ keyKp1 = 257;
+ keyKp2 = 258;
+ keyKp3 = 259;
+ keyKp4 = 260;
+ keyKp5 = 261;
+ keyKp6 = 262;
+ keyKp7 = 263;
+ keyKp8 = 264;
+ keyKp9 = 265;
+ keyKpPeriod = 266;
+ keyKpDivide = 267;
+ keyKpMultiply = 268;
+ keyKpMinus = 269;
+ keyKpPlus = 270;
+ keyKpEnter = 271;
+ keyKpEquals = 272;
// Arrow & insert/delete pad
- keyUp = 273;
- keyDown = 274;
- keyRight = 275;
- keyLeft = 276;
- keyInsert = 277;
- keyHome = 278;
- keyEnd = 279;
- keyPageup = 280;
- keyPagedown = 281;
+ keyUp = 273;
+ keyDown = 274;
+ keyRight = 275;
+ keyLeft = 276;
+ keyInsert = 277;
+ keyHome = 278;
+ keyEnd = 279;
+ keyPageup = 280;
+ keyPagedown = 281;
// Function keys
- keyF1 = 282;
- keyF2 = 283;
- keyF3 = 284;
- keyF4 = 285;
- keyF5 = 286;
- keyF6 = 287;
- keyF7 = 288;
- keyF8 = 289;
- keyF9 = 290;
- keyF10 = 291;
- keyF11 = 292;
- keyF12 = 293;
- keyF13 = 294;
- keyF14 = 295;
- keyF15 = 296;
+ keyF1 = 282;
+ keyF2 = 283;
+ keyF3 = 284;
+ keyF4 = 285;
+ keyF5 = 286;
+ keyF6 = 287;
+ keyF7 = 288;
+ keyF8 = 289;
+ keyF9 = 290;
+ keyF10 = 291;
+ keyF11 = 292;
+ keyF12 = 293;
+ keyF13 = 294;
+ keyF14 = 295;
+ keyF15 = 296;
// Modifier keys
- keyNumlock = 300;
- keyCapslock = 301;
- keyScrollock = 302;
- keyRshift = 303;
- keyLshift = 304;
- keyRctrl = 305;
- keyLctrl = 306;
- keyRalt = 307;
- keyLalt = 308;
- keyRmeta = 309;
- keyLmeta = 310;
- keyLsuper = 311;
- keyRsuper = 312;
- keyMode = 313;
- keyCompose = 314;
+ keyNumlock = 300;
+ keyCapslock = 301;
+ keyScrollock = 302;
+ keyRshift = 303;
+ keyLshift = 304;
+ keyRctrl = 305;
+ keyLctrl = 306;
+ keyRalt = 307;
+ keyLalt = 308;
+ keyRmeta = 309;
+ keyLmeta = 310;
+ keyLsuper = 311;
+ keyRsuper = 312;
+ keyMode = 313;
+ keyCompose = 314;
// Misc keys
- keyHelp = 315;
- keyPrint = 316;
- keySysreq = 317;
- keyBreak = 318;
- keyMenu = 319;
- keyPower = 320;
- keyEuro = 321;
- keyUndo = 322;
+ keyHelp = 315;
+ keyPrint = 316;
+ keySysreq = 317;
+ keyBreak = 318;
+ keyMenu = 319;
+ keyPower = 320;
+ keyEuro = 321;
+ keyUndo = 322;
// Add any other keys here
- keyLast
+ keyLast;
)
// A keymod is a set of bit flags
type keymod uint16
+
const (
- keymodNone = 0x0000;
- keymodLshift= 0x0001;
- keymodRshift= 0x0002;
- keymodLctrl = 0x0040;
- keymodRctrl = 0x0080;
- keymodLalt = 0x0100;
- keymodRalt = 0x0200;
- keymodLmeta = 0x0400;
- keymodRmeta = 0x0800;
- keymodNum = 0x1000;
- keymodCaps = 0x2000;
- keymodMode = 0x4000;
- keymodReserved = 0x8000
+ keymodNone = 0x0000;
+ keymodLshift = 0x0001;
+ keymodRshift = 0x0002;
+ keymodLctrl = 0x0040;
+ keymodRctrl = 0x0080;
+ keymodLalt = 0x0100;
+ keymodRalt = 0x0200;
+ keymodLmeta = 0x0400;
+ keymodRmeta = 0x0800;
+ keymodNum = 0x1000;
+ keymodCaps = 0x2000;
+ keymodMode = 0x4000;
+ keymodReserved = 0x8000;
)
const (
- mouseButtonLeft = 1;
- mouseButtonMiddle = 2;
- mouseButtonRight = 3;
- mouseScrollUp = 4;
- mouseScrollDown = 5
+ mouseButtonLeft = 1;
+ mouseButtonMiddle = 2;
+ mouseButtonRight = 3;
+ mouseScrollUp = 4;
+ mouseScrollDown = 5;
)
const (
- mouseStateLeftButtonPressed = 1;
- mouseStateMiddleButtonPressed = 2;
- mouseStateRightButtonPressed = 4
+ mouseStateLeftButtonPressed = 1;
+ mouseStateMiddleButtonPressed = 2;
+ mouseStateRightButtonPressed = 4;
)
const (
- activeMouse = 1; // mouse leaving/entering
- activeInputFocus = 2; // input focus lost/restored
- activeApplication = 4 // application minimized/restored
+ activeMouse = 1; // mouse leaving/entering
+ activeInputFocus = 2; // input focus lost/restored
+ activeApplication = 4; // application minimized/restored
)
const maxEventBytes = 64
type activeEvent struct {
- EventType eventType;
- Gain uint8;
- State uint8;
+ EventType eventType;
+ Gain uint8;
+ State uint8;
}
type exposeEvent struct {
}
type keyboardEvent struct {
- EventType eventType;
- Device uint8;
- State uint8;
- Pad uint8;
- ScanCode uint8;
- Pad1 uint8;
- Key key;
- Mod keymod;
- Unicode uint16;
+ EventType eventType;
+ Device uint8;
+ State uint8;
+ Pad uint8;
+ ScanCode uint8;
+ Pad1 uint8;
+ Key key;
+ Mod keymod;
+ Unicode uint16;
}
type mouseMotionEvent struct {
- EventType eventType;
- Device uint8;
- Buttons uint8;
- Pad uint8;
- X uint16;
- Y uint16;
- Xrel int16;
- Yrel int16;
+ EventType eventType;
+ Device uint8;
+ Buttons uint8;
+ Pad uint8;
+ X uint16;
+ Y uint16;
+ Xrel int16;
+ Yrel int16;
}
type mouseButtonEvent struct {
- EventType eventType;
- Device uint8;
- Button uint8;
- State uint8;
- X uint16;
- Y uint16;
+ EventType eventType;
+ Device uint8;
+ Button uint8;
+ State uint8;
+ X uint16;
+ Y uint16;
}
type quitEvent struct {
EventType eventType;
}
-type syncEvent struct {
-}
+type syncEvent struct{}
-type event interface {
-}
+type event interface{}
type reader []byte
+
func (r *reader) Read(p []byte) (n int, err os.Error) {
b := *r;
if len(b) == 0 && len(p) > 0 {
buf := make([]byte, maxEventBytes);
clean := false;
var (
- ea *activeEvent;
- ee *exposeEvent;
- ke *keyboardEvent;
- mme *mouseMotionEvent;
- mbe *mouseButtonEvent;
- qe *quitEvent;
+ ea *activeEvent;
+ ee *exposeEvent;
+ ke *keyboardEvent;
+ mme *mouseMotionEvent;
+ mbe *mouseButtonEvent;
+ qe *quitEvent;
)
var m draw.Mouse;
for {
// log.Stdoutf("%#v\n", e);
switch buf[0] {
case eventExpose:
- w.resizec <- true
+ w.resizec <- true;
case eventKeyDown:
w.kbdc <- int(ke.Key);
case eventKeyUp:
m.X = int(mbe.X);
m.Y = int(mbe.Y);
// TODO(rsc): Remove uint cast once 8g bug is fixed.
- m.Buttons |= 1<<uint(mbe.Button-1);
+ m.Buttons |= 1<<uint(mbe.Button - 1);
m.Nsec = time.Nanoseconds();
_ = w.mousec <- m;
case eventMouseButtonUp:
m.X = int(mbe.X);
m.Y = int(mbe.Y);
// TODO(rsc): Remove uint cast once 8g bug is fixed.
- m.Buttons &^= 1<<uint(mbe.Button-1);
+ m.Buttons &^= 1<<uint(mbe.Button - 1);
m.Nsec = time.Nanoseconds();
_ = w.mousec <- m;
case eventQuit:
// linear slice or as a two-dimensional slice of slices.
// Image implements image.Image.
type Image struct {
- Linear []Color;
- Pixel [][]Color;
+ Linear []Color;
+ Pixel [][]Color;
}
-var _ image.Image = (*Image)(nil);
+var _ image.Image = (*Image)(nil)
func (m *Image) ColorModel() image.ColorModel {
return ColorModel;
// A Color represents a Native Client color value,
// a 32-bit R, G, B, A value packed as 0xAARRGGBB.
type Color uint32
+
func (p Color) RGBA() (r, g, b, a uint32) {
x := uint32(p);
a = x>>24;
a |= a<<8;
a |= a<<16;
- r = (x>>16) & 0xFF;
+ r = (x>>16)&0xFF;
r |= r<<8;
r |= r<<16;
- g = (x>>8) & 0xFF;
+ g = (x>>8)&0xFF;
g |= g<<8;
g |= g<<16;
- b = x & 0xFF;
+ b = x&0xFF;
b |= b<<8;
b |= b<<16;
return;
}
// ColorModel is the color model corresponding to the Native Client Color.
-var ColorModel = image.ColorModelFunc(toColor);
-
+var ColorModel = image.ColorModelFunc(toColor)
// A Client represents the client side of an SRPC connection.
type Client struct {
- fd int; // fd to server
- r msgReceiver;
- s msgSender;
- service map[string]srv; // services by name
- out chan *msg; // send to out to write to connection
-
- mu sync.Mutex; // protects pending, idGen
- pending map[uint64]*RPC;
- idGen uint64; // generator for request IDs
+ fd int; // fd to server
+ r msgReceiver;
+ s msgSender;
+ service map[string]srv; // services by name
+ out chan *msg; // send to out to write to connection
+
+ mu sync.Mutex; // protects pending, idGen
+ pending map[uint64]*RPC;
+ idGen uint64; // generator for request IDs
}
// A srv is a single method that the server offers.
type srv struct {
- num uint32; // method number
- fmt string; // argument format
+ num uint32; // method number
+ fmt string; // argument format
}
// An RPC represents a single RPC issued by a client.
type RPC struct {
- Ret []interface{}; // Return values
- Done chan *RPC; // Channel where notification of done arrives
- Errno Errno; // Status code
- c *Client;
- id uint64; // request id
+ Ret []interface{}; // Return values
+ Done chan *RPC; // Channel where notification of done arrives
+ Errno Errno; // Status code
+ c *Client;
+ id uint64; // request id
}
// NewClient allocates a new client using the file descriptor fd.
m := &msg{
protocol: protocol,
isReq: true,
- Ret: []interface{}{ []byte(nil) },
- Size: []int{ 4000 },
+ Ret: []interface{}{[]byte(nil)},
+ Size: []int{4000},
};
m.packRequest();
c.s.send(m);
if i < 0 {
continue;
}
- c.service[string(line[0:i])] = srv{uint32(n), string(line[i+1:len(line)])};
+ c.service[string(line[0:i])] = srv{uint32(n), string(line[i+1 : len(line)])};
}
c.out = make(chan *msg);
for srv.fmt[i] != ':' {
i++;
}
- fmt := srv.fmt[i+1:len(srv.fmt)];
+ fmt := srv.fmt[i+1 : len(srv.fmt)];
// Now the return prototypes.
- m.Ret = make([]interface{}, len(fmt) - i);
- m.Size = make([]int, len(fmt) - i);
+ m.Ret = make([]interface{}, len(fmt)-i);
+ m.Size = make([]int, len(fmt)-i);
for i := 0; i < len(fmt); i++ {
switch fmt[i] {
default:
// An Errno is an SRPC status code.
type Errno uint32
+
const (
- OK Errno = 256 + iota;
+ OK Errno = 256+iota;
ErrBreak;
ErrMessageTruncated;
ErrNoMemory;
ErrAppError;
)
-var errstr = [...]string {
+var errstr = [...]string{
OK-OK: "ok",
ErrBreak-OK: "break",
- ErrMessageTruncated-OK: "message truncated",
- ErrNoMemory-OK: "out of memory",
- ErrProtocolMismatch-OK: "protocol mismatch",
- ErrBadRPCNumber-OK: "invalid RPC method number",
- ErrBadArgType-OK: "unexpected argument type",
- ErrTooFewArgs-OK: "too few arguments",
- ErrTooManyArgs-OK: "too many arguments",
- ErrInArgTypeMismatch-OK: "input argument type mismatch",
- ErrOutArgTypeMismatch-OK: "output argument type mismatch",
- ErrInternalError-OK: "internal error",
- ErrAppError-OK: "application error",
+ ErrMessageTruncated - OK: "message truncated",
+ ErrNoMemory - OK: "out of memory",
+ ErrProtocolMismatch - OK: "protocol mismatch",
+ ErrBadRPCNumber - OK: "invalid RPC method number",
+ ErrBadArgType - OK: "unexpected argument type",
+ ErrTooFewArgs - OK: "too few arguments",
+ ErrTooManyArgs - OK: "too many arguments",
+ ErrInArgTypeMismatch - OK: "input argument type mismatch",
+ ErrOutArgTypeMismatch - OK: "output argument type mismatch",
+ ErrInternalError - OK: "internal error",
+ ErrAppError - OK: "application error",
}
func (e Errno) String() string {
if e < OK || int(e-OK) >= len(errstr) {
- return "Errno(" + strconv.Itoa64(int64(e)) + ")"
+ return "Errno(" + strconv.Itoa64(int64(e)) + ")";
}
- return errstr[e - OK];
+ return errstr[e-OK];
}
// A *msgHdr is the data argument to the imc_recvmsg
// counts trusted by the system calls, the data structure is unsafe
// to expose to package clients.
type msgHdr struct {
- iov *iov;
- niov int32;
- desc *int32;
- ndesc int32;
- flags uint32;
+ iov *iov;
+ niov int32;
+ desc *int32;
+ ndesc int32;
+ flags uint32;
}
// A single region for I/O. Just as unsafe as msgHdr.
type iov struct {
- base *byte;
- len int32;
+ base *byte;
+ len int32;
}
// A msg is the Go representation of a message.
type msg struct {
- rdata []byte; // data being consumed during message parsing
- rdesc []int32; // file descriptors being consumed during message parsing
- wdata []byte; // data being generated when replying
+ rdata []byte; // data being consumed during message parsing
+ rdesc []int32; // file descriptors being consumed during message parsing
+ wdata []byte; // data being generated when replying
// parsed version of message
- protocol uint32;
- requestId uint64;
- isReq bool;
- rpcNumber uint32;
- gotHeader bool;
- status Errno; // error code sent in response
- Arg []interface{}; // method arguments
- Ret []interface{}; // method results
- Size []int; // max sizes for arrays in method results
- fmt string; // accumulated format string of arg+":"+ret
+ protocol uint32;
+ requestId uint64;
+ isReq bool;
+ rpcNumber uint32;
+ gotHeader bool;
+ status Errno; // error code sent in response
+ Arg []interface{}; // method arguments
+ Ret []interface{}; // method results
+ Size []int; // max sizes for arrays in method results
+ fmt string; // accumulated format string of arg+":"+ret
}
// A msgReceiver receives messages from a file descriptor.
type msgReceiver struct {
- fd int;
- data [128*1024]byte;
- desc [8]int32;
- hdr msgHdr;
- iov iov;
+ fd int;
+ data [128*1024]byte;
+ desc [8]int32;
+ hdr msgHdr;
+ iov iov;
}
func (r *msgReceiver) recv() (*msg, os.Error) {
// A msgSender sends messages on a file descriptor.
type msgSender struct {
- fd int;
- hdr msgHdr;
- iov iov;
-
+ fd int;
+ hdr msgHdr;
+ iov iov;
}
func (s *msgSender) send(m *msg) os.Error {
bytes.Copy(a, m.wdata);
m.wdata = a;
}
- m.wdata = m.wdata[0:i+n];
- return m.wdata[i:i+n];
+ m.wdata = m.wdata[0 : i+n];
+ return m.wdata[i : i+n];
}
func (m *msg) wuint8(x uint8) {
m.wuint32(uint32(len(m.Ret)));
m.packValues(m.Ret);
}
-
// It reads arguments from arg, checks size for array limits,
// writes return values to ret, and returns an Errno status code.
type Handler interface {
- Run(arg, ret []interface{}, size []int) Errno
+ Run(arg, ret []interface{}, size []int) Errno;
}
type method struct {
- name string;
- fmt string;
- handler Handler;
+ name string;
+ fmt string;
+ handler Handler;
}
var rpcMethod []method
}
rpcMethod = a;
}
- rpcMethod = rpcMethod[0:n+1];
+ rpcMethod = rpcMethod[0 : n+1];
rpcMethod[n] = method{name, fmt, handler};
}
// Enabled returns true if SRPC is enabled in the Native Client runtime.
func Enabled() bool {
- _, err:= getFd();
+ _, err := getFd();
return err == nil;
}
func init() {
Add("service_discovery", ":C", serviceDiscovery{});
}
-