Fonction type_from_xmit
Les stubs appellent la fonction type_from_xmit pour convertir les données de son type transmis vers le type présenté à l’application. La fonction est définie comme suit :
void __RPC_USER <type>_from_xmit (
<xmit_type> __RPC_FAR *,
<type> __RPC_FAR *);
Le premier paramètre est un pointeur vers les données transmises. La fonction définit le deuxième paramètre pour qu’il pointe vers les données présentées.
La fonction type_from_xmit doit gérer la mémoire du type présenté. La fonction doit allouer de la mémoire pour l’ensemble de la structure de données qui commence à l’adresse indiquée par le deuxième paramètre, à l’exception du paramètre lui-même (le stub alloue de la mémoire pour le nœud racine et le transmet à la fonction). La valeur du deuxième paramètre ne peut pas changer pendant l’appel. La fonction peut modifier le contenu à cette adresse.
Dans cet exemple, la fonction DOUBLE_LINK_TYPE_from_xmit convertit le tableau dimensionné en liste double liée. La fonction conserve le pointeur valide au début de la liste, libère la mémoire associée au reste de la liste, puis crée une nouvelle liste qui commence au même pointeur. La fonction utilise une fonction utilitaire, InsertNewNode, pour ajouter un nœud de liste à la fin de la liste et affecter les pNext et pointeurs pPrevious aux valeurs appropriées.
void __RPC_USER DOUBLE_LINK_TYPE_from_xmit(
DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
DOUBLE_LINK_TYPE __RPC_FAR * pList)
{
DOUBLE_LINK_TYPE *pCurrent;
int i;
if (pArray->sSize <= 0)
{
// error checking
return;
}
if (pList == NULL) // if invalid, create the list head
pList = InsertNewNode(pArray->asNumber[0], NULL);
else
{
DOUBLE_LINK_TYPE_free_inst(pList); // free all other nodes
pList->sNumber = pArray->asNumber[0];
pList->pNext = NULL;
}
pCurrent = pList;
for (i = 1; i < pArray->sSize; i++)
pCurrent = InsertNewNode(pArray->asNumber[i], pCurrent);
return;
}