public bool Write(BinaryWriter bw) { byte[] name_encoded = EncodeString(name); byte[] value_encoded = EncodeString(value); EncodedInt encName = new EncodedInt((u32)name_encoded.Length); EncodedInt encValue = new EncodedInt((u32)value_encoded.Length); u32 total_size = 0; EncodedInt encItem = null; if (item_id != 0) { encItem = new EncodedInt(item_id); total_size += 1 + encItem.Length(); } if (encName.Value > 0) { total_size += 1 + encName.Length() + encName.Value; } if (encValue.Value > 0) { total_size += 1 + encValue.Length() + encValue.Value; } // write total size EncodedInt encTotal = new EncodedInt(total_size); bw.Write(PREFIX_SIZE); encTotal.Write(bw); if (encItem != null) { // write item_id bw.Write(PREFIX_ITEM_ID); encItem.Write(bw); // write name if (encName.Value > 0) { bw.Write(PREFIX_ITEM_NAME); encName.Write(bw); bw.Write(name_encoded, 0, name_encoded.Length); } // write value if (encValue.Value > 0) { bw.Write(PREFIX_ITEM_VALUE); encValue.Write(bw); bw.Write(value_encoded, 0, value_encoded.Length); } } else { // write name if (encName.Value > 0) { bw.Write(PREFIX_CLIENT_KEY); encName.Write(bw); bw.Write(name_encoded, 0, name_encoded.Length); } // write value if (encValue.Value > 0) { bw.Write(PREFIX_CLIENT_VAL); encValue.Write(bw); bw.Write(value_encoded, 0, value_encoded.Length); } } return(true); }