[fidl][go] Set union-as-xunion flag in v1 mode

Simplifying header handling code a bit too.

Change-Id: I0745cad12a6525bd4a101a6e62d2d1faaba26326
diff --git a/src/syscall/zx/fidl/fidl_test/encoding_new_test.go b/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
index 3e428be..e00f7df 100644
--- a/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
+++ b/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
@@ -877,13 +877,8 @@
 func TestMarshalUnionToXUnionUsingHeaderFlag(t *testing.T) {
 	const expectedUnionTag = XUnion1AsUnionD
 	const expectedFieldValue = 1.2
-	inHeader := MessageHeader{
-		Flags: [3]byte{
-			1, // decode unions from xunion bytes flag
-			0,
-			0,
-		},
-	}
+	var inHeader MessageHeader
+	inHeader.SetUnionFromXunionBytes()
 	var respb [zx.ChannelMaxMessageBytes]byte
 	var resph [zx.ChannelMaxMessageHandles]zx.Handle
 	input := XUnion1Struct{Xu: XUnion1WithD(expectedFieldValue)}
diff --git a/src/syscall/zx/fidl/interface.go b/src/syscall/zx/fidl/interface.go
index 6329202..364767a 100644
--- a/src/syscall/zx/fidl/interface.go
+++ b/src/syscall/zx/fidl/interface.go
@@ -139,6 +139,9 @@
 		Ordinal: ordinal,
 		Magic:   FidlWireFormatMagicNumberInitial,
 	}
+	if newCtx().EncodeUnionsAsXUnionBytes {
+		header.SetUnionFromXunionBytes()
+	}
 	nb, nh, err := MarshalHeaderThenMessage(&header, req, respb[:], resph[:])
 	if err != nil {
 		return err
@@ -207,6 +210,9 @@
 		Ordinal: ordinal,
 		Magic:   FidlWireFormatMagicNumberInitial,
 	}
+	if newCtx().EncodeUnionsAsXUnionBytes {
+		header.SetUnionFromXunionBytes()
+	}
 	nb, nh, err := MarshalHeaderThenMessage(&header, req, respb[:], resph[:])
 	if err != nil {
 		return err
diff --git a/src/syscall/zx/fidl/message.go b/src/syscall/zx/fidl/message.go
index 79501eb..f8bffda 100644
--- a/src/syscall/zx/fidl/message.go
+++ b/src/syscall/zx/fidl/message.go
@@ -12,8 +12,6 @@
 	"syscall/zx"
 )
 
-const TransactionHeaderFlag_UnionFromXunionBytes = 1 << 0
-
 const FidlWireFormatMagicNumberInitial = 1
 
 // messageBytesPool is a pool of buffers that can fit the data part of any
@@ -41,10 +39,18 @@
 	Ordinal uint64   `fidl:"8" fidl_offset_v1:"8"`
 }
 
-func (msg MessageHeader) IsSupportedVersion() bool {
+func (msg *MessageHeader) IsSupportedVersion() bool {
 	return msg.Magic == FidlWireFormatMagicNumberInitial
 }
 
+func (msg *MessageHeader) HasUnionFromXunionBytes() bool {
+	return msg.Flags[0] & 0x01 != 0
+}
+
+func (msg *MessageHeader) SetUnionFromXunionBytes() {
+	msg.Flags[0] |= 0x01
+}
+
 var mMessageHeader = MustCreateMarshaler(MessageHeader{})
 
 var MessageHeaderSize = 16
@@ -83,18 +89,9 @@
 		return nil
 	}
 	ctx := newCtx()
-	ctx.DecodeUnionsFromXUnionBytes = shouldDecodeUnionsFromXUnionBytes(header)
+	ctx.DecodeUnionsFromXUnionBytes = header.HasUnionFromXunionBytes()
 	if _, _, err := UnmarshalWithContext(ctx, data[hnb:], handles, body); err != nil {
 		return err
 	}
 	return nil
 }
-
-func shouldDecodeUnionsFromXUnionBytes(header *MessageHeader) bool {
-	return headerHasFlag(header, TransactionHeaderFlag_UnionFromXunionBytes)
-}
-
-func headerHasFlag(header *MessageHeader, flag int) bool {
-	headerFlags := int(header.Flags[2])<<16 + int(header.Flags[1])<<8 + int(header.Flags[0])
-	return (headerFlags & flag) != 0
-}