Figure 8: Locate interceptor forwards requests for the IProxy interface; all others are processed normally

IOP::IOR *LoadBalancingInterceptor::locate(    
            CORBA::ULong                /* req_id */,
            CORBA_OctetSequence *objKey /* object_key */,    
            VISClosure&                 /* closure */) 
{
    IOP::IOR        *retObjectIOR;
    char            *repId;
    char            *name;

    /*
     * Initialize the return value.
     */
    retObjectIOR = NULL;

    /*
     * Extract the repository id from the key
     */
    repId = NULL;
    if (VISUtil::is_persistent_key(*objKey))
        VISUtil::extract_persistent_key(*objKey, repId, name);

    /*
     * If this is a locate request for a proxy object interface
     * then respond with one of the load balancing objects.
     * Otherwise, the request is for some other interface type,
     * so let the orb handling dispatching the request.
     */
    if (repId != NULL && g_proxyObject->_is_a( repId ))
    {
        CORBA::Object_var    objVar;

        objVar = g_loadBalancingServer->pickObject();

        /*
         * If an object was successfully selected, convert
         * the object reference to an IOR.
         */
        if (objVar != NULL)
            retObjectIOR = VISUtil::to_ior(objVar);
    }

    return retObjectIOR;
}