diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-12-07 13:54:11 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-12-07 13:54:11 +0900 |
| commit | b9b9705b520cd3effaba3dc5e94c83e36f655bc4 (patch) | |
| tree | da70316f6ac5971746d526031592cd2bfcd11143 /internal/pipewire/pipewire.go | |
| parent | 246e04214a3554826be1f4285f56044b0850102d (diff) | |
internal/pipewire: specify opcode and file count with message
This adds checking of FileCount while writing a message. Message encoding is relocated to an exported method to be used externally, probably for test stubbing.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pipewire/pipewire.go')
| -rw-r--r-- | internal/pipewire/pipewire.go | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/internal/pipewire/pipewire.go b/internal/pipewire/pipewire.go index 65178bf6..d17edf90 100644 --- a/internal/pipewire/pipewire.go +++ b/internal/pipewire/pipewire.go @@ -191,36 +191,30 @@ func (ctx *Context) queueFiles(fds ...int) (offset Fd) { return } +// InconsistentFilesError describes an implementation error where an incorrect amount +// of files is queued between two messages. +type InconsistentFilesError [2]Int + +func (e *InconsistentFilesError) Error() string { + return "queued " + strconv.Itoa(int(e[0])) + " files instead of the expected " + strconv.Itoa(int(e[1])) +} + // writeMessage appends the POD representation of v and an optional footer to buf. -func (ctx *Context) writeMessage( - Id Int, opcode byte, - v KnownSize, -) (err error) { - if ctx.pendingFooter == nil && ctx.deferredPendingFooter != nil { - ctx.pendingFooter, ctx.deferredPendingFooter = ctx.deferredPendingFooter, nil +func (ctx *Context) writeMessage(Id Int, v Message) (err error) { + if fileCount := Int(len(ctx.pendingFiles) - ctx.headerFiles); fileCount != v.FileCount() { + return &InconsistentFilesError{fileCount, v.FileCount()} } - size := v.Size() - if ctx.pendingFooter != nil { - size += ctx.pendingFooter.Size() - } - if size&^SizeMax != 0 { - return ErrSizeRange + if ctx.pendingFooter == nil && ctx.deferredPendingFooter != nil { + ctx.pendingFooter, ctx.deferredPendingFooter = ctx.deferredPendingFooter, nil } - ctx.buf = slices.Grow(ctx.buf, int(SizeHeader+size)) - ctx.buf = (&Header{ - ID: Id, Opcode: opcode, Size: size, - Sequence: ctx.sequence, - FileCount: Int(len(ctx.pendingFiles) - ctx.headerFiles), - }).append(ctx.buf) - ctx.headerFiles = len(ctx.pendingFiles) - ctx.buf, err = MarshalAppend(ctx.buf, v) - if err == nil && ctx.pendingFooter != nil { - ctx.buf, err = MarshalAppend(ctx.buf, ctx.pendingFooter) + ctx.buf, err = MessageEncoder{v}.AppendMessage(ctx.buf, Id, ctx.sequence, ctx.pendingFooter) + if err == nil { + ctx.headerFiles = len(ctx.pendingFiles) ctx.pendingFooter = nil + ctx.sequence++ } - ctx.sequence++ return } |
