void OrphanLocUpdateManager::addOrphanUpdate(const SpaceObjectReference& observed, const Sirikata::Protocol::Loc::LocationUpdate& update) {
    assert( ObjectReference(update.object()) == observed.object() );
    UpdateInfoList& info_list = mUpdates[observed];
    info_list.push_back(
        UpdateInfoPtr(new UpdateInfo(observed, new Sirikata::Protocol::Loc::LocationUpdate(update), mContext->simTime() + mTimeout))
    );
}
    void notifyLocUpdate() {
        // We don't really need the protocol version of the loc
        // update, but it's a convenient way to construct the update
        // we need.
        Sirikata::Protocol::Loc::LocationUpdate update;
        update.set_object(UUID((uint32)mContext->id()));
        update.set_seqno(mSeqnoSource++);

        // Bogus index ID (as used in prox update) so manual queries can route
        // updates to the right place
        update.add_index_id(1);

        Sirikata::Protocol::ITimedMotionVector motion = update.mutable_location();
        motion.set_t(mContext->simTime());
        motion.set_position(mRegion.center());
        motion.set_velocity(Vector3f(0,0,0));

        Sirikata::Protocol::ITimedMotionQuaternion msg_orient = update.mutable_orientation();
        msg_orient.set_t(Time::null());
        msg_orient.set_position(Quaternion::identity());
        msg_orient.set_velocity(Quaternion::identity());

        Sirikata::Protocol::IAggregateBoundingInfo msg_bounds = update.mutable_aggregate_bounds();
        msg_bounds.set_center_offset( Vector3f(0,0,0) );
        msg_bounds.set_center_bounds_radius( mRegion.toBoundingSphere().radius() );
        msg_bounds.set_max_object_size(mLargest);

        update.set_query_data(mQueryData);

        // notify wants to only pass through values and tries to copy the
        // LocProtocolLocUpdate by default -- we need to jump through hoops and
        // specify the exact template types explicitly to make this work
        NopTimeSynced nop_ts;
	LocProtocolLocUpdate tmp(update, nop_ts);//need to assign a temporary for llvm compilers
        notify<void(PintoServerQuerierListener::*)(const Sirikata::LocUpdate&), const LocProtocolLocUpdate&>(&PintoServerQuerierListener::onPintoServerLocUpdate, tmp);
    }
void StandardLocationService::receiveMessage(Message* msg) {
    assert(msg->dest_port() == SERVER_PORT_LOCATION);
    Sirikata::Protocol::Loc::BulkLocationUpdate contents;
    bool parsed = parsePBJMessage(&contents, msg->payload());

    if (parsed) {
        for(int32 idx = 0; idx < contents.update_size(); idx++) {
            Sirikata::Protocol::Loc::LocationUpdate update = contents.update(idx);

            // Its possible we'll get an out of date update. We only use this update
            // if (a) we have this object marked as a replica object and (b) we don't
            // have this object marked as a local object
            if (type(update.object()) != Replica)
                continue;

            LocationMap::iterator loc_it = mLocations.find( update.object() );
            // We can safely make this assertion right now because space server
            // to space server loc and prox are on the same reliable channel. If
            // this goes away then a) we can't make this assertion and b) we
            // need an OrphanLocUpdateManager to save updates where this
            // condition is false so they can be applied once the prox update
            // arrives.
            assert(loc_it != mLocations.end());

            if (update.has_location()) {
                TimedMotionVector3f newloc(
                    update.location().t(),
                    MotionVector3f( update.location().position(), update.location().velocity() )
                );
                loc_it->second.location = newloc;
                notifyReplicaLocationUpdated( update.object(), newloc );

                CONTEXT_SPACETRACE(serverLoc, msg->source_server(), mContext->id(), update.object(), newloc );
            }

            if (update.has_orientation()) {
                TimedMotionQuaternion neworient(
                    update.orientation().t(),
                    MotionQuaternion( update.orientation().position(), update.orientation().velocity() )
                );
                loc_it->second.orientation = neworient;
                notifyReplicaOrientationUpdated( update.object(), neworient );
            }

            if (update.has_bounds()) {
                BoundingSphere3f newbounds = update.bounds();
                loc_it->second.bounds = newbounds;
                notifyReplicaBoundsUpdated( update.object(), newbounds );
            }

            if (update.has_mesh()) {
                String newmesh = update.mesh();
                loc_it->second.mesh = newmesh;
                notifyReplicaMeshUpdated( update.object(), newmesh );
            }

            if (update.has_physics()) {
                String newphy = update.physics();
                loc_it->second.physics = newphy;
                notifyReplicaPhysicsUpdated( update.object(), newphy );
            }
        }
    }

    delete msg;
}