// // $Id: ClientObject.java,v 1.7 2003/04/30 22:45:57 mdb Exp $ package com.threerings.presents.data; import com.threerings.presents.dobj.DObject; import com.threerings.presents.dobj.DSet; import com.threerings.presents.Log; /** * Every client in the system has an associated client object to which * only they subscribe. The client object can be used to deliver messages * solely to a particular client as well as to publish client-specific * data. */ public class ClientObject extends DObject { /** The field name of the receivers field. */ public static final String RECEIVERS = "receivers"; /** The name of a message event delivered to the client when they * switch usernames (and therefore user objects). */ public static final String CLOBJ_CHANGED = "!clobj_changed!"; /** Used to publish all invocation service receivers registered on * this client. */ public DSet receivers = new DSet(); /** * Returns a short string identifying this client. */ public String who () { return "(" + getOid() + ")"; } /** * Used for reference counting client objects, adds a reference to * this object. */ public synchronized void reference () { _references++; // Log.info("Incremented references [who=" + who() + // ", refs=" + _references + "]."); } /** * Used for reference counting client objects, releases a reference to * this object. * * @return true if the object has remaining references, false * otherwise. */ public synchronized boolean release () { // Log.info("Decremented references [who=" + who() + // ", refs=" + (_references-1) + "]."); return (--_references > 0); } /** Used to reference count resolved client objects. */ protected transient int _references; /** * Requests that the specified entry be added to the * receivers set. The set will not change until the event is * actually propagated through the system. */ public void addToReceivers (DSet.Entry elem) { requestEntryAdd(RECEIVERS, elem); } /** * Requests that the entry matching the supplied key be removed from * the receivers set. The set will not change until the * event is actually propagated through the system. */ public void removeFromReceivers (Comparable key) { requestEntryRemove(RECEIVERS, key); } /** * Requests that the specified entry be updated in the * receivers set. The set will not change until the event is * actually propagated through the system. */ public void updateReceivers (DSet.Entry elem) { requestEntryUpdate(RECEIVERS, elem); } /** * Requests that the receivers field be set to the * specified value. Generally one only adds, updates and removes * entries of a distributed set, but certain situations call for a * complete replacement of the set value. The local value will be * updated immediately and an event will be propagated through the * system to notify all listeners that the attribute did * change. Proxied copies of this object (on clients) will apply the * value change when they received the attribute changed notification. */ public void setReceivers (DSet receivers) { requestAttributeChange(RECEIVERS, receivers); this.receivers = receivers; } }