All types used in IPDL must be serializable. This is accomplished through type specialization of a C++ traits class.
Types are serialized and deserialized from an IPC::Message type declared in ipc_message.h. Each type specializes IPC::ParamTraits as follows:
namespace IPC {
template <>
struct ParamTraits<MyType>
{
typedef MyType paramType;
static void Write(Message* aMsg, const paramType& aParam) {
// implement serialization here
}
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
{
// implement deserialization here. return false if deserialization failed
}
};
} // namespace IPC
The standard IPDL types (integers, floats, and XPCOM strings) already have serializers. Other types need to have serializers written for them explicitly.
In many cases a serializer can be written by combining existing serializers. Most structures can be serialized in this manner:
struct ExampleStruct
{
int i;
nsCString j;
int k[4];
};
namespace IPC {
template <>
struct ParamTraits<ExampleStruct>
{
typedef ExampleStruct paramType;
static void Write(Message* aMsg, const paramType& aParam)
{
WriteParam(aMsg, aParam.i);
WriteParam(aMsg, aParam.j);
for (int i = 0; i < 4; ++i)
WriteParam(aMsg, aParam.k[i]);
}
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
{
if (!ReadParam(aMsg, aIter, &(aResult->i)) ||
!ReadParam(aMsg, aIter, &(aResult->j)))
return false;
for (int i = 0; i < 4; ++i)
if (!ReadParam(aMsg, aIter, &(aResult->k[i])))
return false;
return true;
}
};
} // namespace IPC
Once you have a serializer for a type, you can serialize a collection of it (ex: an nsTArray<ExampleStruct>) by simply declaring "using nsTArray<ExampleStruct>;' in your IPDL file, then using it in a IPC method.
Serializers and deserializers are security-sensitive and must always receive two reviews from module owners who understand IPC serialization well. If in doubt, please ask for help! It is never acceptable to serialize/deserialize raw pointer values; if you are tempted, you probably should create a subprotocol for that data, so that IPDL can check the values and lifetime.
