Process a Response

There are two ways to execute the request, depending on how you want to process the response.

Obtain and Process an Unparsed Response

The aciObjectExecuteToString function returns the server response as an unparsed data buffer:

char *szResponse = NULL;
int nResponseLen = 0;
char *szContentType = NULL;

aciObjectExecuteToString(pConnection, pCommand, &szResponse, &nResponseLen, &szContentType);

// For most actions, szResponse now holds the raw xml and szContentType will be "application/xml"
// Process the xml in whatever way you wish now (e.g. third-party XML processing API)
// Remember to tidy up afterwards
free(szResponse);
free(szContentType);

Obtain and Process a Parsed Response

The aciObjectExecute function returns a t_aciObject that holds a parsed representation of the XML, which you can manipulate by using the acio set of functions in the C IDOL SDK. For example if the XML returned was from the UserReadAgentList action and the following response was retrieved:

<?xml version="1.0" encoding="UTF-8" ?> 
<autnresponse>
  <action>USERREADAGENTLIST</action> 
  <response>SUCCESS</response> 
  <responsedata>
  <maxagents>5</maxagents>
  <numagents>2</numagents>
  <agent>Housing</agent>
  <agent>Rock climbing</agent>
  </responsedata>
</autnresponse>  

Then you can obtain the list of agent names for the user as follows:

// Always need to call aciInit at start of any program using ACI client lib
aciInit();

t_aciObject *pResult = NULL;
char **szAgentNames = NULL;
aciObjectExecute(pConnection, pCommand, &pResult);

if (aciObjectCheckforSuccess(pResult))
{
  // Successful request so find out how many agents this user has
  t_aciObject* pNumAgent = NULL;
  pNumAgent = acioFindFirstOccurrence(pResult, "numagents");
  if(pNumAgent)
  {
    int nNumAgents = 0;
    acioParamGetInt(pNumAgent, ACI_DATA_NODE_VALUE, &nNumAgents);
    if(nNumAgents > 0)
    {
      // This user has agents, construct array to hold names and
      // retrieve agent names from response
      t_aciObject* pAgentName = NULL;
      int nAgent = 0;

      saAgentNames = (char**)malloc(sizeof(char*)*nNumAgents);

      // Find first agent entry
      pAgentName = acioFindFirstOccurrence(pResult, "agent");
      while(pAgentName)
      {
        acioParamGetString(pAgentName, ACI_DATA_NODE_VALUE, 
        &saAgentNames[nAgent]);
        // Move to next agent entry
        pAgentName = aciObjectNextEntry(pAgentName);
        nAgent++
      }
    }
  }
}

// Remember to tidy up afterwards
aciObjectDestroy(&pResult);

NOTE: Although it is imperative to free the memory that is associated with an ACI structure in C, you must not free the structure returned by the acioFindFirstOccurrence function.