2012-05-06 09:06:48 +02:00
|
|
|
package xgb
|
|
|
|
|
|
|
|
/*
|
2012-05-08 03:58:33 +02:00
|
|
|
This file was generated by record.xml on May 7 2012 9:17:57pm EDT.
|
2012-05-06 09:06:48 +02:00
|
|
|
This file is automatically generated. Edit at your peril!
|
|
|
|
*/
|
|
|
|
|
2012-05-07 07:00:45 +02:00
|
|
|
// RecordInit must be called before using the RECORD extension.
|
|
|
|
func (c *Conn) RecordInit() error {
|
|
|
|
reply, err := c.QueryExtension(6, "RECORD").Reply()
|
|
|
|
switch {
|
|
|
|
case err != nil:
|
|
|
|
return err
|
|
|
|
case !reply.Present:
|
2012-05-08 03:58:33 +02:00
|
|
|
return errorf("No extension named RECORD could be found on on the server.")
|
2012-05-07 07:00:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
c.extLock.Lock()
|
|
|
|
c.extensions["RECORD"] = reply.MajorOpcode
|
|
|
|
for evNum, fun := range newExtEventFuncs["RECORD"] {
|
|
|
|
newEventFuncs[int(reply.FirstEvent)+evNum] = fun
|
|
|
|
}
|
2012-05-08 03:58:33 +02:00
|
|
|
for errNum, fun := range newExtErrorFuncs["RECORD"] {
|
|
|
|
newErrorFuncs[int(reply.FirstError)+errNum] = fun
|
|
|
|
}
|
2012-05-07 07:00:45 +02:00
|
|
|
c.extLock.Unlock()
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
newExtEventFuncs["RECORD"] = make(map[int]newEventFun)
|
2012-05-08 03:58:33 +02:00
|
|
|
newExtErrorFuncs["RECORD"] = make(map[int]newErrorFun)
|
2012-05-07 07:00:45 +02:00
|
|
|
}
|
|
|
|
|
2012-05-08 03:58:33 +02:00
|
|
|
// Skipping definition for base type 'Card8'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Int16'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Int32'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Void'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Byte'
|
|
|
|
|
2012-05-07 07:00:45 +02:00
|
|
|
// Skipping definition for base type 'Int8'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Card16'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Char'
|
|
|
|
|
2012-05-06 09:06:48 +02:00
|
|
|
// Skipping definition for base type 'Card32'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Double'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Bool'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Float'
|
|
|
|
|
|
|
|
// Skipping definition for base type 'Id'
|
|
|
|
|
|
|
|
const (
|
|
|
|
RecordHTypeFromServerTime = 1
|
|
|
|
RecordHTypeFromClientTime = 2
|
|
|
|
RecordHTypeFromClientSequence = 4
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
RecordCsCurrentClients = 1
|
|
|
|
RecordCsFutureClients = 2
|
|
|
|
RecordCsAllClients = 3
|
|
|
|
)
|
|
|
|
|
|
|
|
// Skipping resource definition of 'Context'
|
|
|
|
|
|
|
|
type RecordElementHeader byte
|
|
|
|
|
|
|
|
type RecordClientSpec uint32
|
|
|
|
|
|
|
|
// 'RecordRange8' struct definition
|
|
|
|
// Size: 2
|
|
|
|
type RecordRange8 struct {
|
|
|
|
First byte
|
|
|
|
Last byte
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct read RecordRange8
|
|
|
|
func ReadRecordRange8(buf []byte, v *RecordRange8) int {
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
v.First = buf[b]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
v.Last = buf[b]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct list read RecordRange8
|
|
|
|
func ReadRecordRange8List(buf []byte, dest []RecordRange8) int {
|
|
|
|
b := 0
|
|
|
|
for i := 0; i < len(dest); i++ {
|
|
|
|
dest[i] = RecordRange8{}
|
|
|
|
b += ReadRecordRange8(buf[b:], &dest[i])
|
|
|
|
}
|
|
|
|
return pad(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct write RecordRange8
|
|
|
|
func (v RecordRange8) Bytes() []byte {
|
|
|
|
buf := make([]byte, 2)
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
buf[b] = v.First
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = v.Last
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write struct list RecordRange8
|
|
|
|
func RecordRange8ListBytes(buf []byte, list []RecordRange8) int {
|
|
|
|
b := 0
|
|
|
|
var structBytes []byte
|
|
|
|
for _, item := range list {
|
|
|
|
structBytes = item.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// 'RecordRange16' struct definition
|
|
|
|
// Size: 4
|
|
|
|
type RecordRange16 struct {
|
|
|
|
First uint16
|
|
|
|
Last uint16
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct read RecordRange16
|
|
|
|
func ReadRecordRange16(buf []byte, v *RecordRange16) int {
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
v.First = Get16(buf[b:])
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
v.Last = Get16(buf[b:])
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct list read RecordRange16
|
|
|
|
func ReadRecordRange16List(buf []byte, dest []RecordRange16) int {
|
|
|
|
b := 0
|
|
|
|
for i := 0; i < len(dest); i++ {
|
|
|
|
dest[i] = RecordRange16{}
|
|
|
|
b += ReadRecordRange16(buf[b:], &dest[i])
|
|
|
|
}
|
|
|
|
return pad(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct write RecordRange16
|
|
|
|
func (v RecordRange16) Bytes() []byte {
|
|
|
|
buf := make([]byte, 4)
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
Put16(buf[b:], v.First)
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put16(buf[b:], v.Last)
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write struct list RecordRange16
|
|
|
|
func RecordRange16ListBytes(buf []byte, list []RecordRange16) int {
|
|
|
|
b := 0
|
|
|
|
var structBytes []byte
|
|
|
|
for _, item := range list {
|
|
|
|
structBytes = item.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// 'RecordExtRange' struct definition
|
|
|
|
// Size: 6
|
|
|
|
type RecordExtRange struct {
|
|
|
|
Major RecordRange8
|
|
|
|
Minor RecordRange16
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct read RecordExtRange
|
|
|
|
func ReadRecordExtRange(buf []byte, v *RecordExtRange) int {
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
v.Major = RecordRange8{}
|
|
|
|
b += ReadRecordRange8(buf[b:], &v.Major)
|
|
|
|
|
|
|
|
v.Minor = RecordRange16{}
|
|
|
|
b += ReadRecordRange16(buf[b:], &v.Minor)
|
|
|
|
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct list read RecordExtRange
|
|
|
|
func ReadRecordExtRangeList(buf []byte, dest []RecordExtRange) int {
|
|
|
|
b := 0
|
|
|
|
for i := 0; i < len(dest); i++ {
|
|
|
|
dest[i] = RecordExtRange{}
|
|
|
|
b += ReadRecordExtRange(buf[b:], &dest[i])
|
|
|
|
}
|
|
|
|
return pad(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct write RecordExtRange
|
|
|
|
func (v RecordExtRange) Bytes() []byte {
|
|
|
|
buf := make([]byte, 6)
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.Major.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.Minor.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write struct list RecordExtRange
|
|
|
|
func RecordExtRangeListBytes(buf []byte, list []RecordExtRange) int {
|
|
|
|
b := 0
|
|
|
|
var structBytes []byte
|
|
|
|
for _, item := range list {
|
|
|
|
structBytes = item.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// 'RecordRange' struct definition
|
|
|
|
// Size: 24
|
|
|
|
type RecordRange struct {
|
|
|
|
CoreRequests RecordRange8
|
|
|
|
CoreReplies RecordRange8
|
|
|
|
ExtRequests RecordExtRange
|
|
|
|
ExtReplies RecordExtRange
|
|
|
|
DeliveredEvents RecordRange8
|
|
|
|
DeviceEvents RecordRange8
|
|
|
|
Errors RecordRange8
|
|
|
|
ClientStarted bool
|
|
|
|
ClientDied bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct read RecordRange
|
|
|
|
func ReadRecordRange(buf []byte, v *RecordRange) int {
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
v.CoreRequests = RecordRange8{}
|
|
|
|
b += ReadRecordRange8(buf[b:], &v.CoreRequests)
|
|
|
|
|
|
|
|
v.CoreReplies = RecordRange8{}
|
|
|
|
b += ReadRecordRange8(buf[b:], &v.CoreReplies)
|
|
|
|
|
|
|
|
v.ExtRequests = RecordExtRange{}
|
|
|
|
b += ReadRecordExtRange(buf[b:], &v.ExtRequests)
|
|
|
|
|
|
|
|
v.ExtReplies = RecordExtRange{}
|
|
|
|
b += ReadRecordExtRange(buf[b:], &v.ExtReplies)
|
|
|
|
|
|
|
|
v.DeliveredEvents = RecordRange8{}
|
|
|
|
b += ReadRecordRange8(buf[b:], &v.DeliveredEvents)
|
|
|
|
|
|
|
|
v.DeviceEvents = RecordRange8{}
|
|
|
|
b += ReadRecordRange8(buf[b:], &v.DeviceEvents)
|
|
|
|
|
|
|
|
v.Errors = RecordRange8{}
|
|
|
|
b += ReadRecordRange8(buf[b:], &v.Errors)
|
|
|
|
|
|
|
|
if buf[b] == 1 {
|
|
|
|
v.ClientStarted = true
|
|
|
|
} else {
|
|
|
|
v.ClientStarted = false
|
|
|
|
}
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
if buf[b] == 1 {
|
|
|
|
v.ClientDied = true
|
|
|
|
} else {
|
|
|
|
v.ClientDied = false
|
|
|
|
}
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct list read RecordRange
|
|
|
|
func ReadRecordRangeList(buf []byte, dest []RecordRange) int {
|
|
|
|
b := 0
|
|
|
|
for i := 0; i < len(dest); i++ {
|
|
|
|
dest[i] = RecordRange{}
|
|
|
|
b += ReadRecordRange(buf[b:], &dest[i])
|
|
|
|
}
|
|
|
|
return pad(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct write RecordRange
|
|
|
|
func (v RecordRange) Bytes() []byte {
|
|
|
|
buf := make([]byte, 24)
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.CoreRequests.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.CoreReplies.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.ExtRequests.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.ExtReplies.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.DeliveredEvents.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.DeviceEvents.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
structBytes := v.Errors.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
|
|
|
|
if v.ClientStarted {
|
|
|
|
buf[b] = 1
|
|
|
|
} else {
|
|
|
|
buf[b] = 0
|
|
|
|
}
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
if v.ClientDied {
|
|
|
|
buf[b] = 1
|
|
|
|
} else {
|
|
|
|
buf[b] = 0
|
|
|
|
}
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write struct list RecordRange
|
|
|
|
func RecordRangeListBytes(buf []byte, list []RecordRange) int {
|
|
|
|
b := 0
|
|
|
|
var structBytes []byte
|
|
|
|
for _, item := range list {
|
|
|
|
structBytes = item.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// 'RecordClientInfo' struct definition
|
|
|
|
// Size: (8 + pad((int(NumRanges) * 24)))
|
|
|
|
type RecordClientInfo struct {
|
|
|
|
ClientResource RecordClientSpec
|
|
|
|
NumRanges uint32
|
|
|
|
Ranges []RecordRange // size: pad((int(NumRanges) * 24))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct read RecordClientInfo
|
|
|
|
func ReadRecordClientInfo(buf []byte, v *RecordClientInfo) int {
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
v.ClientResource = RecordClientSpec(Get32(buf[b:]))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
v.NumRanges = Get32(buf[b:])
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
v.Ranges = make([]RecordRange, v.NumRanges)
|
|
|
|
b += ReadRecordRangeList(buf[b:], v.Ranges)
|
|
|
|
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct list read RecordClientInfo
|
|
|
|
func ReadRecordClientInfoList(buf []byte, dest []RecordClientInfo) int {
|
|
|
|
b := 0
|
|
|
|
for i := 0; i < len(dest); i++ {
|
|
|
|
dest[i] = RecordClientInfo{}
|
|
|
|
b += ReadRecordClientInfo(buf[b:], &dest[i])
|
|
|
|
}
|
|
|
|
return pad(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct write RecordClientInfo
|
|
|
|
func (v RecordClientInfo) Bytes() []byte {
|
|
|
|
buf := make([]byte, (8 + pad((int(v.NumRanges) * 24))))
|
|
|
|
b := 0
|
|
|
|
|
|
|
|
Put32(buf[b:], uint32(v.ClientResource))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
Put32(buf[b:], v.NumRanges)
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
b += RecordRangeListBytes(buf[b:], v.Ranges)
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write struct list RecordClientInfo
|
|
|
|
func RecordClientInfoListBytes(buf []byte, list []RecordClientInfo) int {
|
|
|
|
b := 0
|
|
|
|
var structBytes []byte
|
|
|
|
for _, item := range list {
|
|
|
|
structBytes = item.Bytes()
|
|
|
|
copy(buf[b:], structBytes)
|
|
|
|
b += pad(len(structBytes))
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// Struct list size RecordClientInfo
|
|
|
|
func RecordClientInfoListSize(list []RecordClientInfo) int {
|
|
|
|
size := 0
|
|
|
|
for _, item := range list {
|
|
|
|
size += (8 + pad((int(item.NumRanges) * 24)))
|
|
|
|
}
|
|
|
|
return size
|
|
|
|
}
|
|
|
|
|
|
|
|
// Error definition RecordBadContext (0)
|
|
|
|
// Size: 32
|
|
|
|
|
|
|
|
const BadRecordBadContext = 0
|
|
|
|
|
|
|
|
type RecordBadContextError struct {
|
|
|
|
Sequence uint16
|
|
|
|
NiceName string
|
|
|
|
InvalidRecord uint32
|
|
|
|
}
|
|
|
|
|
|
|
|
// Error read RecordBadContext
|
|
|
|
func NewRecordBadContextError(buf []byte) Error {
|
|
|
|
v := RecordBadContextError{}
|
|
|
|
v.NiceName = "RecordBadContext"
|
|
|
|
|
|
|
|
b := 1 // skip error determinant
|
|
|
|
b += 1 // don't read error number
|
|
|
|
|
|
|
|
v.Sequence = Get16(buf[b:])
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
v.InvalidRecord = Get32(buf[b:])
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
|
|
|
|
func (err RecordBadContextError) ImplementsError() {}
|
|
|
|
|
|
|
|
func (err RecordBadContextError) SequenceId() uint16 {
|
|
|
|
return err.Sequence
|
|
|
|
}
|
|
|
|
|
|
|
|
func (err RecordBadContextError) BadId() Id {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func (err RecordBadContextError) Error() string {
|
|
|
|
fieldVals := make([]string, 0, 1)
|
|
|
|
fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
|
|
|
|
fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
|
|
|
|
fieldVals = append(fieldVals, sprintf("InvalidRecord: %d", err.InvalidRecord))
|
|
|
|
return "BadRecordBadContext {" + stringsJoin(fieldVals, ", ") + "}"
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
2012-05-08 03:58:33 +02:00
|
|
|
newExtErrorFuncs["RECORD"][0] = NewRecordBadContextError
|
2012-05-06 09:06:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Request RecordQueryVersion
|
|
|
|
// size: 8
|
|
|
|
type RecordQueryVersionCookie struct {
|
|
|
|
*cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordQueryVersion(MajorVersion uint16, MinorVersion uint16) RecordQueryVersionCookie {
|
|
|
|
cookie := c.newCookie(true, true)
|
|
|
|
c.newRequest(c.recordQueryVersionRequest(MajorVersion, MinorVersion), cookie)
|
|
|
|
return RecordQueryVersionCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordQueryVersionUnchecked(MajorVersion uint16, MinorVersion uint16) RecordQueryVersionCookie {
|
|
|
|
cookie := c.newCookie(false, true)
|
|
|
|
c.newRequest(c.recordQueryVersionRequest(MajorVersion, MinorVersion), cookie)
|
|
|
|
return RecordQueryVersionCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request reply for RecordQueryVersion
|
|
|
|
// size: 12
|
|
|
|
type RecordQueryVersionReply struct {
|
|
|
|
Sequence uint16
|
|
|
|
Length uint32
|
|
|
|
// padding: 1 bytes
|
|
|
|
MajorVersion uint16
|
|
|
|
MinorVersion uint16
|
|
|
|
}
|
|
|
|
|
|
|
|
// Waits and reads reply data from request RecordQueryVersion
|
|
|
|
func (cook RecordQueryVersionCookie) Reply() (*RecordQueryVersionReply, error) {
|
|
|
|
buf, err := cook.reply()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if buf == nil {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
return recordQueryVersionReply(buf), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read reply into structure from buffer for RecordQueryVersion
|
|
|
|
func recordQueryVersionReply(buf []byte) *RecordQueryVersionReply {
|
|
|
|
v := new(RecordQueryVersionReply)
|
|
|
|
b := 1 // skip reply determinant
|
|
|
|
|
|
|
|
b += 1 // padding
|
|
|
|
|
|
|
|
v.Sequence = Get16(buf[b:])
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
v.Length = Get32(buf[b:]) // 4-byte units
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
v.MajorVersion = Get16(buf[b:])
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
v.MinorVersion = Get16(buf[b:])
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cook RecordQueryVersionCookie) Check() error {
|
|
|
|
return cook.check()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordQueryVersion
|
|
|
|
func (c *Conn) recordQueryVersionRequest(MajorVersion uint16, MinorVersion uint16) []byte {
|
|
|
|
size := 8
|
|
|
|
b := 0
|
|
|
|
buf := make([]byte, size)
|
|
|
|
|
|
|
|
buf[b] = c.extensions["RECORD"]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = 0 // request opcode
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put16(buf[b:], MajorVersion)
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put16(buf[b:], MinorVersion)
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request RecordCreateContext
|
|
|
|
// size: pad(((20 + pad((int(NumClientSpecs) * 4))) + pad((int(NumRanges) * 24))))
|
|
|
|
type RecordCreateContextCookie struct {
|
|
|
|
*cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordCreateContext
|
|
|
|
func (c *Conn) RecordCreateContext(Context Id, ElementHeader RecordElementHeader, NumClientSpecs uint32, NumRanges uint32, ClientSpecs []RecordClientSpec, Ranges []RecordRange) RecordCreateContextCookie {
|
|
|
|
cookie := c.newCookie(false, false)
|
|
|
|
c.newRequest(c.recordCreateContextRequest(Context, ElementHeader, NumClientSpecs, NumRanges, ClientSpecs, Ranges), cookie)
|
|
|
|
return RecordCreateContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordCreateContextChecked(Context Id, ElementHeader RecordElementHeader, NumClientSpecs uint32, NumRanges uint32, ClientSpecs []RecordClientSpec, Ranges []RecordRange) RecordCreateContextCookie {
|
|
|
|
cookie := c.newCookie(true, false)
|
|
|
|
c.newRequest(c.recordCreateContextRequest(Context, ElementHeader, NumClientSpecs, NumRanges, ClientSpecs, Ranges), cookie)
|
|
|
|
return RecordCreateContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cook RecordCreateContextCookie) Check() error {
|
|
|
|
return cook.check()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordCreateContext
|
|
|
|
func (c *Conn) recordCreateContextRequest(Context Id, ElementHeader RecordElementHeader, NumClientSpecs uint32, NumRanges uint32, ClientSpecs []RecordClientSpec, Ranges []RecordRange) []byte {
|
|
|
|
size := pad(((20 + pad((int(NumClientSpecs) * 4))) + pad((int(NumRanges) * 24))))
|
|
|
|
b := 0
|
|
|
|
buf := make([]byte, size)
|
|
|
|
|
|
|
|
buf[b] = c.extensions["RECORD"]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = 1 // request opcode
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put32(buf[b:], uint32(Context))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
buf[b] = byte(ElementHeader)
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
b += 3 // padding
|
|
|
|
|
|
|
|
Put32(buf[b:], NumClientSpecs)
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
Put32(buf[b:], NumRanges)
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
for i := 0; i < int(NumClientSpecs); i++ {
|
|
|
|
Put32(buf[b:], uint32(ClientSpecs[i]))
|
|
|
|
b += 4
|
|
|
|
}
|
|
|
|
b = pad(b)
|
|
|
|
|
|
|
|
b += RecordRangeListBytes(buf[b:], Ranges)
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request RecordRegisterClients
|
|
|
|
// size: pad(((20 + pad((int(NumClientSpecs) * 4))) + pad((int(NumRanges) * 24))))
|
|
|
|
type RecordRegisterClientsCookie struct {
|
|
|
|
*cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordRegisterClients
|
|
|
|
func (c *Conn) RecordRegisterClients(Context Id, ElementHeader RecordElementHeader, NumClientSpecs uint32, NumRanges uint32, ClientSpecs []RecordClientSpec, Ranges []RecordRange) RecordRegisterClientsCookie {
|
|
|
|
cookie := c.newCookie(false, false)
|
|
|
|
c.newRequest(c.recordRegisterClientsRequest(Context, ElementHeader, NumClientSpecs, NumRanges, ClientSpecs, Ranges), cookie)
|
|
|
|
return RecordRegisterClientsCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordRegisterClientsChecked(Context Id, ElementHeader RecordElementHeader, NumClientSpecs uint32, NumRanges uint32, ClientSpecs []RecordClientSpec, Ranges []RecordRange) RecordRegisterClientsCookie {
|
|
|
|
cookie := c.newCookie(true, false)
|
|
|
|
c.newRequest(c.recordRegisterClientsRequest(Context, ElementHeader, NumClientSpecs, NumRanges, ClientSpecs, Ranges), cookie)
|
|
|
|
return RecordRegisterClientsCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cook RecordRegisterClientsCookie) Check() error {
|
|
|
|
return cook.check()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordRegisterClients
|
|
|
|
func (c *Conn) recordRegisterClientsRequest(Context Id, ElementHeader RecordElementHeader, NumClientSpecs uint32, NumRanges uint32, ClientSpecs []RecordClientSpec, Ranges []RecordRange) []byte {
|
|
|
|
size := pad(((20 + pad((int(NumClientSpecs) * 4))) + pad((int(NumRanges) * 24))))
|
|
|
|
b := 0
|
|
|
|
buf := make([]byte, size)
|
|
|
|
|
|
|
|
buf[b] = c.extensions["RECORD"]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = 2 // request opcode
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put32(buf[b:], uint32(Context))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
buf[b] = byte(ElementHeader)
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
b += 3 // padding
|
|
|
|
|
|
|
|
Put32(buf[b:], NumClientSpecs)
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
Put32(buf[b:], NumRanges)
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
for i := 0; i < int(NumClientSpecs); i++ {
|
|
|
|
Put32(buf[b:], uint32(ClientSpecs[i]))
|
|
|
|
b += 4
|
|
|
|
}
|
|
|
|
b = pad(b)
|
|
|
|
|
|
|
|
b += RecordRangeListBytes(buf[b:], Ranges)
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request RecordUnregisterClients
|
|
|
|
// size: pad((12 + pad((int(NumClientSpecs) * 4))))
|
|
|
|
type RecordUnregisterClientsCookie struct {
|
|
|
|
*cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordUnregisterClients
|
|
|
|
func (c *Conn) RecordUnregisterClients(Context Id, NumClientSpecs uint32, ClientSpecs []RecordClientSpec) RecordUnregisterClientsCookie {
|
|
|
|
cookie := c.newCookie(false, false)
|
|
|
|
c.newRequest(c.recordUnregisterClientsRequest(Context, NumClientSpecs, ClientSpecs), cookie)
|
|
|
|
return RecordUnregisterClientsCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordUnregisterClientsChecked(Context Id, NumClientSpecs uint32, ClientSpecs []RecordClientSpec) RecordUnregisterClientsCookie {
|
|
|
|
cookie := c.newCookie(true, false)
|
|
|
|
c.newRequest(c.recordUnregisterClientsRequest(Context, NumClientSpecs, ClientSpecs), cookie)
|
|
|
|
return RecordUnregisterClientsCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cook RecordUnregisterClientsCookie) Check() error {
|
|
|
|
return cook.check()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordUnregisterClients
|
|
|
|
func (c *Conn) recordUnregisterClientsRequest(Context Id, NumClientSpecs uint32, ClientSpecs []RecordClientSpec) []byte {
|
|
|
|
size := pad((12 + pad((int(NumClientSpecs) * 4))))
|
|
|
|
b := 0
|
|
|
|
buf := make([]byte, size)
|
|
|
|
|
|
|
|
buf[b] = c.extensions["RECORD"]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = 3 // request opcode
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put32(buf[b:], uint32(Context))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
Put32(buf[b:], NumClientSpecs)
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
for i := 0; i < int(NumClientSpecs); i++ {
|
|
|
|
Put32(buf[b:], uint32(ClientSpecs[i]))
|
|
|
|
b += 4
|
|
|
|
}
|
|
|
|
b = pad(b)
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request RecordGetContext
|
|
|
|
// size: 8
|
|
|
|
type RecordGetContextCookie struct {
|
|
|
|
*cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordGetContext(Context Id) RecordGetContextCookie {
|
|
|
|
cookie := c.newCookie(true, true)
|
|
|
|
c.newRequest(c.recordGetContextRequest(Context), cookie)
|
|
|
|
return RecordGetContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordGetContextUnchecked(Context Id) RecordGetContextCookie {
|
|
|
|
cookie := c.newCookie(false, true)
|
|
|
|
c.newRequest(c.recordGetContextRequest(Context), cookie)
|
|
|
|
return RecordGetContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request reply for RecordGetContext
|
|
|
|
// size: (32 + RecordClientInfoListSize(InterceptedClients))
|
|
|
|
type RecordGetContextReply struct {
|
|
|
|
Sequence uint16
|
|
|
|
Length uint32
|
|
|
|
Enabled bool
|
|
|
|
ElementHeader RecordElementHeader
|
|
|
|
// padding: 3 bytes
|
|
|
|
NumInterceptedClients uint32
|
|
|
|
// padding: 16 bytes
|
|
|
|
InterceptedClients []RecordClientInfo // size: RecordClientInfoListSize(InterceptedClients)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Waits and reads reply data from request RecordGetContext
|
|
|
|
func (cook RecordGetContextCookie) Reply() (*RecordGetContextReply, error) {
|
|
|
|
buf, err := cook.reply()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if buf == nil {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
return recordGetContextReply(buf), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read reply into structure from buffer for RecordGetContext
|
|
|
|
func recordGetContextReply(buf []byte) *RecordGetContextReply {
|
|
|
|
v := new(RecordGetContextReply)
|
|
|
|
b := 1 // skip reply determinant
|
|
|
|
|
|
|
|
if buf[b] == 1 {
|
|
|
|
v.Enabled = true
|
|
|
|
} else {
|
|
|
|
v.Enabled = false
|
|
|
|
}
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
v.Sequence = Get16(buf[b:])
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
v.Length = Get32(buf[b:]) // 4-byte units
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
v.ElementHeader = RecordElementHeader(buf[b])
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
b += 3 // padding
|
|
|
|
|
|
|
|
v.NumInterceptedClients = Get32(buf[b:])
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
b += 16 // padding
|
|
|
|
|
|
|
|
v.InterceptedClients = make([]RecordClientInfo, v.NumInterceptedClients)
|
|
|
|
b += ReadRecordClientInfoList(buf[b:], v.InterceptedClients)
|
|
|
|
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cook RecordGetContextCookie) Check() error {
|
|
|
|
return cook.check()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordGetContext
|
|
|
|
func (c *Conn) recordGetContextRequest(Context Id) []byte {
|
|
|
|
size := 8
|
|
|
|
b := 0
|
|
|
|
buf := make([]byte, size)
|
|
|
|
|
|
|
|
buf[b] = c.extensions["RECORD"]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = 4 // request opcode
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put32(buf[b:], uint32(Context))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request RecordEnableContext
|
|
|
|
// size: 8
|
|
|
|
type RecordEnableContextCookie struct {
|
|
|
|
*cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordEnableContext(Context Id) RecordEnableContextCookie {
|
|
|
|
cookie := c.newCookie(true, true)
|
|
|
|
c.newRequest(c.recordEnableContextRequest(Context), cookie)
|
|
|
|
return RecordEnableContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordEnableContextUnchecked(Context Id) RecordEnableContextCookie {
|
|
|
|
cookie := c.newCookie(false, true)
|
|
|
|
c.newRequest(c.recordEnableContextRequest(Context), cookie)
|
|
|
|
return RecordEnableContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request reply for RecordEnableContext
|
|
|
|
// size: (32 + pad(((int(Length) * 4) * 1)))
|
|
|
|
type RecordEnableContextReply struct {
|
|
|
|
Sequence uint16
|
|
|
|
Length uint32
|
|
|
|
Category byte
|
|
|
|
ElementHeader RecordElementHeader
|
|
|
|
ClientSwapped bool
|
|
|
|
// padding: 2 bytes
|
|
|
|
XidBase uint32
|
|
|
|
ServerTime uint32
|
|
|
|
RecSequenceNum uint32
|
|
|
|
// padding: 8 bytes
|
|
|
|
Data []byte // size: pad(((int(Length) * 4) * 1))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Waits and reads reply data from request RecordEnableContext
|
|
|
|
func (cook RecordEnableContextCookie) Reply() (*RecordEnableContextReply, error) {
|
|
|
|
buf, err := cook.reply()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if buf == nil {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
return recordEnableContextReply(buf), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read reply into structure from buffer for RecordEnableContext
|
|
|
|
func recordEnableContextReply(buf []byte) *RecordEnableContextReply {
|
|
|
|
v := new(RecordEnableContextReply)
|
|
|
|
b := 1 // skip reply determinant
|
|
|
|
|
|
|
|
v.Category = buf[b]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
v.Sequence = Get16(buf[b:])
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
v.Length = Get32(buf[b:]) // 4-byte units
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
v.ElementHeader = RecordElementHeader(buf[b])
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
if buf[b] == 1 {
|
|
|
|
v.ClientSwapped = true
|
|
|
|
} else {
|
|
|
|
v.ClientSwapped = false
|
|
|
|
}
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
b += 2 // padding
|
|
|
|
|
|
|
|
v.XidBase = Get32(buf[b:])
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
v.ServerTime = Get32(buf[b:])
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
v.RecSequenceNum = Get32(buf[b:])
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
b += 8 // padding
|
|
|
|
|
|
|
|
v.Data = make([]byte, (int(v.Length) * 4))
|
|
|
|
copy(v.Data[:(int(v.Length)*4)], buf[b:])
|
|
|
|
b += pad(int((int(v.Length) * 4)))
|
|
|
|
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cook RecordEnableContextCookie) Check() error {
|
|
|
|
return cook.check()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordEnableContext
|
|
|
|
func (c *Conn) recordEnableContextRequest(Context Id) []byte {
|
|
|
|
size := 8
|
|
|
|
b := 0
|
|
|
|
buf := make([]byte, size)
|
|
|
|
|
|
|
|
buf[b] = c.extensions["RECORD"]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = 5 // request opcode
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put32(buf[b:], uint32(Context))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request RecordDisableContext
|
|
|
|
// size: 8
|
|
|
|
type RecordDisableContextCookie struct {
|
|
|
|
*cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordDisableContext
|
|
|
|
func (c *Conn) RecordDisableContext(Context Id) RecordDisableContextCookie {
|
|
|
|
cookie := c.newCookie(false, false)
|
|
|
|
c.newRequest(c.recordDisableContextRequest(Context), cookie)
|
|
|
|
return RecordDisableContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordDisableContextChecked(Context Id) RecordDisableContextCookie {
|
|
|
|
cookie := c.newCookie(true, false)
|
|
|
|
c.newRequest(c.recordDisableContextRequest(Context), cookie)
|
|
|
|
return RecordDisableContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cook RecordDisableContextCookie) Check() error {
|
|
|
|
return cook.check()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordDisableContext
|
|
|
|
func (c *Conn) recordDisableContextRequest(Context Id) []byte {
|
|
|
|
size := 8
|
|
|
|
b := 0
|
|
|
|
buf := make([]byte, size)
|
|
|
|
|
|
|
|
buf[b] = c.extensions["RECORD"]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = 6 // request opcode
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put32(buf[b:], uint32(Context))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request RecordFreeContext
|
|
|
|
// size: 8
|
|
|
|
type RecordFreeContextCookie struct {
|
|
|
|
*cookie
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordFreeContext
|
|
|
|
func (c *Conn) RecordFreeContext(Context Id) RecordFreeContextCookie {
|
|
|
|
cookie := c.newCookie(false, false)
|
|
|
|
c.newRequest(c.recordFreeContextRequest(Context), cookie)
|
|
|
|
return RecordFreeContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Conn) RecordFreeContextChecked(Context Id) RecordFreeContextCookie {
|
|
|
|
cookie := c.newCookie(true, false)
|
|
|
|
c.newRequest(c.recordFreeContextRequest(Context), cookie)
|
|
|
|
return RecordFreeContextCookie{cookie}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cook RecordFreeContextCookie) Check() error {
|
|
|
|
return cook.check()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write request to wire for RecordFreeContext
|
|
|
|
func (c *Conn) recordFreeContextRequest(Context Id) []byte {
|
|
|
|
size := 8
|
|
|
|
b := 0
|
|
|
|
buf := make([]byte, size)
|
|
|
|
|
|
|
|
buf[b] = c.extensions["RECORD"]
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
buf[b] = 7 // request opcode
|
|
|
|
b += 1
|
|
|
|
|
|
|
|
Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
|
|
|
|
b += 2
|
|
|
|
|
|
|
|
Put32(buf[b:], uint32(Context))
|
|
|
|
b += 4
|
|
|
|
|
|
|
|
return buf
|
|
|
|
}
|