blob: ad2f0d1b7187d13cffc6f1af32cc392f5d18f2be [file] [log] [blame] [raw]
package li.cil.oc.api.network;
/**
* Components are nodes that can be addressed computers via drivers.
* <p/>
* Components therefore form a sub-network in the overall network, and some
* special rules apply to them. For one, components specify an additional
* kind of visibility. Component visibility may have to differ from real
* network reachability in some cases, such as network cards (which have to
* be able to communicate across the whole network, but computers should only
* "see" the cards installed directly in them).
* <p/>
* Unlike the {@link Node}'s network reachability, this is a dynamic value and
* can be changed at any time. For example, this is used to hide multi-block
* screen parts that are not the origin from computers in the network.
* <p/>
* The method responsible for dispatching network messages from computers also
* only allows sending messages to components that the computer can see,
* according to the component's visibility. Therefore nodes won't receive
* messages from computer's that should not be able to see them.
*/
public interface Component extends Node {
/**
* The name of the node.
* <p/>
* This should be the type name of the component represented by the node,
* since this is what is returned from <tt>component.type</tt>. As such it
* is to be expected that there be multiple nodes with the same name, but
* that those nodes all have the same underlying type (i.e. there can be
* multiple "filesystem" nodes, but they should all behave the same way).
*/
String name();
/**
* Get the visibility of this component.
*/
Visibility visibility();
/**
* Set the visibility of this component.
* <p/>
* Note that this cannot be higher / more visible than the reachability of
* the node. Trying to set it to a higher value will generate an exception.
*
* @throws java.lang.IllegalArgumentException if the specified value is
* more visible than the node's
* reachability.
*/
void setVisibility(Visibility value);
/**
* Tests whether this component can be seen by the specified node,
* usually representing a computer in the network.
* <p/>
* <em>Important</em>: this will always return <tt>true</tt> if the node is
* not currently in a network.
*
* @param other the computer node to check for.
* @return true if the computer can see this node; false otherwise.
*/
boolean canBeSeenFrom(Node other);
// ----------------------------------------------------------------------- //
/**
* The list of names of methods exposed by this component.
*/
Iterable<String> methods();
/**
* Tries to call a function with the specified name on this component.
* <p/>
* The name of the method must be one of the names in {@link #methods()}.
* The returned array may be <tt>null</tt> if there is no return value.
*
* @param method the name of the method to call.
* @param context the context from which the method is called, usually the
* instance of the computer running the Lua script that made
* the call.
* @param arguments the arguments passed to the method.
* @return the list of results, or <tt>null</tt> if there is no result.
* @throws NoSuchMethodException if there is no method with that name.
*/
Object[] invoke(String method, Context context, Object... arguments)
throws NoSuchMethodException;
}