summaryrefslogtreecommitdiff
path: root/indra/llmessage/llchainio.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llmessage/llchainio.h')
-rw-r--r--indra/llmessage/llchainio.h117
1 files changed, 117 insertions, 0 deletions
diff --git a/indra/llmessage/llchainio.h b/indra/llmessage/llchainio.h
new file mode 100644
index 0000000000..f07432da05
--- /dev/null
+++ b/indra/llmessage/llchainio.h
@@ -0,0 +1,117 @@
+/**
+ * @file llchainio.h
+ * @author Phoenix
+ * @date 2005-08-04
+ * @brief This class declares the interface for constructing io chains.
+ *
+ * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LL_LLCHAINIO_H
+#define LL_LLCHAINIO_H
+
+#include "llpumpio.h"
+
+/**
+ * @class LLDeferredChain
+ * @brief This class allows easy addition of a chain which will sleep
+ * and then process another chain.
+ */
+class LLDeferredChain
+{
+public:
+ /**
+ * @brief Add a chain to a pump in a finite # of seconds
+ *
+ * @prarm pump The pump to work on.
+ * @prarm in_seconds The number of seconds from now when chain should start.
+ * @prarm chain The chain to add in in_seconds seconds.
+ * @prarm chain_timeout timeout for chain on the pump.
+ * @return Returns true if the operation was queued.
+ */
+ static bool addToPump(
+ LLPumpIO* pump,
+ F32 in_seconds,
+ const LLPumpIO::chain_t& chain,
+ F32 chain_timeout);
+};
+
+/**
+ * @class LLChainIOFactory
+ * @brief This class is an abstract base class for building io chains.
+ *
+ * This declares an abstract base class for a chain factory. The
+ * factory is used to connect an input pipe to the first pipe in the
+ * chain, and an output pipe to the last pipe in the chain. This will
+ * allow easy construction for buffer based io like services to for
+ * API centered IO while abstracting the input and output to simple
+ * data passing.
+ * To use this class, you should derive a class which implements the
+ * <code>build</code> method.
+ */
+class LLChainIOFactory
+{
+public:
+ // Constructor
+ LLChainIOFactory();
+
+ // Destructor
+ virtual ~LLChainIOFactory();
+
+ /**
+ * @brief Build the chian with in as the first and end as the last
+ *
+ * The caller of the LLChainIOFactory is responsible for managing
+ * the memory of the in pipe. All of the chains generated by the
+ * factory will be ref counted as usual, so the caller will also
+ * need to break the links in the chain.
+ * @param chain The chain which will have new pipes appended
+ * @param context A context for use by this factory if you choose
+ * @retrun Returns true if the call was successful.
+ */
+ virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const = 0;
+
+protected:
+};
+
+/**
+ * @class LLSimpleIOFactory
+ * @brief Basic implementation for making a factory that returns a
+ * 'chain' of one object
+ */
+template<class Pipe>
+class LLSimpleIOFactory : public LLChainIOFactory
+{
+public:
+ virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
+ {
+ chain.push_back(LLIOPipe::ptr_t(new Pipe));
+ return true;
+ }
+};
+
+/**
+ * @class LLCloneIOFactory
+ * @brief Implementation for a facory which copies a particular pipe.
+ */
+template<class Pipe>
+class LLCloneIOFactory : public LLChainIOFactory
+{
+public:
+ LLCloneIOFactory(Pipe* original) :
+ mHandle(original),
+ mOriginal(original) {}
+
+ virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
+ {
+ chain.push_back(LLIOPipe::ptr_t(new Pipe(*mOriginal)));
+ return true;
+ }
+
+protected:
+ LLIOPipe::ptr_t mHandle;
+ Pipe* mOriginal;
+};
+
+#endif // LL_LLCHAINIO_H