About the actual problem: when I changed the client code to use iostreams,
I added XML escaping where there was none before. For example, in the
message contents when replying to a <get_messages/> GUIRPC. There used to
be no escaping there, so a reply would look like this:
<msg>
<project>World Community Grid</project>
<pri>1</pri>
<seqno>644</seqno>
<body>
[scrsave_debug] ACTIVE_TASK::check_graphics_mode_ack(): got graphics ack
<mode_hide_graphics/> for
CMD2_0114-UBC9.clustersOccur-2F1Z_B.clustersOccur_4_41214_43539_1, previous
mode <mode_unsupported/>
</body>
<time>1255965570</time>
</msg>
Which means there would be actual empty self-closed XML tags inside <body>.
Now the tags are escaped, but the manager doesn't unescape them.
I'm not sure what to do about it. If we make the manager (well, the rpc
library) unescape it, we still have a compatibility problem with third
party GUIs. If I make the client not escape it anymore (as it was before),
the client may generate invalid XML.
I think I'll just make the client output the message body unescaped. We can
worry about invalid XML when we make a new and decent protocol from
scratch...