diff tango/tango/net/cluster/NetworkClient.d @ 132:1700239cab2e trunk

[svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things.
author lindquist
date Fri, 11 Jan 2008 17:57:40 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tango/tango/net/cluster/NetworkClient.d	Fri Jan 11 17:57:40 2008 +0100
@@ -0,0 +1,162 @@
+/*******************************************************************************
+
+        copyright:      Copyright (c) 2004 Kris Bell. All rights reserved
+
+        license:        BSD style: $(LICENSE)
+        
+        version:        July 2004: Initial release      
+        
+        author:         Kris
+
+*******************************************************************************/
+
+module tango.net.cluster.NetworkClient;
+
+private import  tango.time.Clock;
+
+private import  tango.core.Exception;        
+
+public  import  tango.net.cluster.model.ICluster;        
+
+public  import  tango.net.cluster.NetworkMessage,        
+                tango.net.cluster.NetworkRegistry;        
+
+/*******************************************************************************
+
+        The base class for all cluster clients (such as CacheInvalidator)
+        which acts simply as a container for the operating IChannel and
+        the configured ICluster. The former specifies something akin to
+        a 'topic' in the pub/sub world, while the latter provides access
+        to the underlying functional substrate (the QOS implementation).
+
+*******************************************************************************/
+
+class NetworkClient
+{
+        private IChannel channel_;
+        private ICluster cluster_;
+
+        public static NetworkMessage EmptyMessage;
+
+        static this ()
+        {
+                NetworkRegistry.shared.enroll (EmptyMessage = new NetworkMessage);
+        }
+
+        /***********************************************************************
+
+                Construct this client with the specified channel and cluster. 
+                The former specifies something akin to a 'topic', whilst the 
+                latter provides access to the underlying functional substrate 
+                (the QOS implementation). A good way to think about channels
+                is to map them directly to a class name. That is, since you
+                send and recieve classes on a channel, you might utilize the 
+                class name as the channel name (this.classinfo.name).
+ 
+        ***********************************************************************/
+        
+        this (ICluster cluster, char[] channel)
+        {
+                assert (cluster);
+                assert (channel.length);
+                
+                cluster_ = cluster;
+                channel_ = cluster.createChannel (channel);
+        }
+
+        /***********************************************************************
+
+                Return the channel we're tuned to
+
+        ***********************************************************************/
+        
+        IChannel channel ()
+        {
+                return channel_;
+        }
+
+        /***********************************************************************
+
+                Return the cluster specified during construction
+
+        ***********************************************************************/
+        
+        ICluster cluster ()
+        {
+                return cluster_;
+        }
+
+        /***********************************************************************
+
+                Return the current time
+
+        ***********************************************************************/
+        
+        Time time ()
+        {
+                return Clock.now;
+        }
+
+        /***********************************************************************
+
+                Return the Log instance
+
+        ***********************************************************************/
+        
+        Logger log ()
+        {
+                return cluster_.log;
+        }
+
+        /***********************************************************************
+        
+                Create a channel with the specified name. A channel 
+                represents something akin to a publush/subscribe topic, 
+                or a radio station. These are used to segregate cluster 
+                operations into a set of groups, where each group is 
+                represented by a channel. Channel names are whatever you 
+                want then to be; use of dot notation has proved useful 
+                in the past. In fact, a good way to think about channels
+                is to map them directly to a class name. That is, since you
+                typically send and recieve classes on a channel, you might 
+                utilize the class name as the channel (this.classinfo.name).
+
+        ***********************************************************************/
+        
+        IChannel createChannel (char[] name)
+        {
+                return cluster_.createChannel (name);
+        }
+}
+
+/*******************************************************************************
+
+        This exception is thrown by the cluster subsystem when an attempt
+        is made to place additional content into a full queue
+
+*******************************************************************************/
+
+class ClusterFullException : ClusterException
+{
+        this (char[] msg)
+        {
+                super (msg);
+        }
+}
+
+/*******************************************************************************
+
+        This exception is thrown by the cluster subsystem when an attempt
+        is made to converse with a non-existant cluster, or one where all
+        cluster-servers have died.
+
+*******************************************************************************/
+
+class ClusterEmptyException : ClusterException
+{
+        this (char[] msg)
+        {
+                super (msg);
+        }
+}
+