summaryrefslogtreecommitdiffstats
path: root/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module')
-rw-r--r--src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/.cvsignore11
-rw-r--r--src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/Makefile.in100
-rw-r--r--src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmIPCModule.cpp137
-rw-r--r--src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmIPCModule.h109
-rw-r--r--src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmQueue.cpp223
-rw-r--r--src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmQueue.h186
-rw-r--r--src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmTransactionManager.cpp162
-rw-r--r--src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmTransactionManager.h147
8 files changed, 1075 insertions, 0 deletions
diff --git a/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/.cvsignore b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/.cvsignore
new file mode 100644
index 00000000..ccfb2bc3
--- /dev/null
+++ b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/.cvsignore
@@ -0,0 +1,11 @@
+Makefile
+module.rc
+module.res
+tmIPCModule.obj
+tmQueue.obj
+tmTransactionManager.obj
+transmgr.dll
+transmgr.exp
+transmgr.ilk
+transmgr.lib
+transmgr.pdb
diff --git a/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/Makefile.in b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/Makefile.in
new file mode 100644
index 00000000..b8baa225
--- /dev/null
+++ b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/Makefile.in
@@ -0,0 +1,100 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Mozilla Transaction Manager.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corp.
+# Portions created by the Initial Developer are Copyright (C) 2003
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+# John Gaunt <jgaunt@netscape.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH = ../../../../..
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MODULE = ipcd
+LIBRARY_NAME = transmgr
+MODULE_NAME = ipcd
+
+FORCE_SHARED_LIB = 1
+NO_DIST_INSTALL = 1
+NO_INSTALL = 1
+
+ifeq ($(OS_ARCH),Darwin)
+NO_COMPONENT_LINK_MAP = 1
+MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS =
+endif
+
+REQUIRES = nspr \
+ xpcom \
+ $(NULL)
+
+CPPSRCS = \
+ tmIPCModule.cpp \
+ tmQueue.cpp \
+ tmTransactionManager.cpp \
+ $(NULL)
+
+EXPORTS = \
+ tmIPCModule.h \
+ $(NULL)
+
+LOCAL_INCLUDES = \
+ -I$(srcdir)/../common \
+ $(NULL)
+
+include $(topsrcdir)/config/config.mk
+
+LIBS = \
+ $(EXTRA_DSO_LIBS) \
+ $(NSPR_LIBS) \
+ $(NULL)
+
+EXTRA_DSO_LDOPTS = \
+ $(LIBS_DIR) \
+ $(NSPR_LIBS) \
+ $(DIST)/lib/$(LIB_PREFIX)transmgrcom_s.$(LIB_SUFFIX) \
+ $(EXTRA_DSO_LIBS) \
+ $(NULL)
+
+include $(topsrcdir)/config/rules.mk
+
+_IPC_FILES = \
+ $(DLL_PREFIX)$(LIBRARY_NAME)$(DLL_SUFFIX) \
+ $(NULL)
+
+libs:: $(_IPC_FILES)
+ $(INSTALL) $^ $(DIST)/bin/ipc/modules
+
+install:: $(_IPC_FILES)
+ $(SYSINSTALL) $(IFLAGS1) $^ $(DESTDIR)$(mozappdir)/ipc/modules
diff --git a/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmIPCModule.cpp b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmIPCModule.cpp
new file mode 100644
index 00000000..3982c93c
--- /dev/null
+++ b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmIPCModule.cpp
@@ -0,0 +1,137 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Transaction Manager.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corp.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * John Gaunt <jgaunt@netscape.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "tmIPCModule.h"
+#include "tmTransaction.h"
+#include "tmTransactionManager.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// IPC Daemon hookup stuff
+
+// functionpointer array giving access to this module from the IPC daemon
+static ipcModuleMethods gTransMethods =
+{
+ IPC_MODULE_METHODS_VERSION,
+ tmIPCModule::Init,
+ tmIPCModule::Shutdown,
+ tmIPCModule::HandleMsg
+};
+
+static ipcModuleEntry gTransModuleEntry[] =
+{
+ { TRANSACTION_MODULE_ID, &gTransMethods }
+};
+
+IPC_IMPL_GETMODULES(TransactionModule, gTransModuleEntry)
+
+static const nsID kTransModuleID = TRANSACTION_MODULE_ID;
+
+///////////////////////////////////////////////////////////////////////////////
+// Define global variable
+
+tmTransactionManager *tmIPCModule::tm;
+
+///////////////////////////////////////////////////////////////////////////////
+// IPC Module API
+
+void
+tmIPCModule::Init() {
+ if (!tm)
+ InitInternal();
+}
+
+void
+tmIPCModule::Shutdown() {
+ if (tm) {
+ delete tm;
+ tm = nsnull;
+ }
+}
+
+// straight pass-through, don't check args, let the TM do it.
+void
+tmIPCModule::HandleMsg(ipcClientHandle client, const nsID &target,
+ const void *data, PRUint32 dataLen) {
+
+ // make sure the trans mngr is there
+ if (!tm && (InitInternal() < 0))
+ return;
+
+ // create the transaction
+ tmTransaction *trans = new tmTransaction();
+
+ // initialize it
+ if (trans) {
+ if(NS_SUCCEEDED(trans->Init(IPC_GetClientID(client), // who owns it
+ TM_INVALID_ID, // in data
+ TM_INVALID, // in data
+ TM_INVALID, // in data
+ (PRUint8 *)data, // raw message
+ dataLen))) { // length of message
+ // pass it on to the trans mngr
+ tm->HandleTransaction(trans);
+ }
+ else
+ delete trans;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// tmIPCModule API
+
+// straight pass-through, don't check args, let the TS & TM do it.
+void
+tmIPCModule::SendMsg(PRUint32 aDestClientIPCID, tmTransaction *aTransaction) {
+
+ IPC_SendMsg(aDestClientIPCID,
+ kTransModuleID,
+ (void *)aTransaction->GetRawMessage(),
+ aTransaction->GetRawMessageLength());
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Protected Methods
+
+PRInt32
+tmIPCModule::InitInternal() {
+
+ tm = new tmTransactionManager();
+ if (tm)
+ return tm->Init();
+ return -1;
+}
+
diff --git a/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmIPCModule.h b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmIPCModule.h
new file mode 100644
index 00000000..d4623b1e
--- /dev/null
+++ b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmIPCModule.h
@@ -0,0 +1,109 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Transaction Manager.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corp.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * John Gaunt <jgaunt@netscape.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef _tmIPCModule_H_
+#define _tmIPCModule_H_
+
+#include "ipcModuleUtil.h"
+#include "tmUtils.h"
+
+// forward declarations
+class tmTransaction;
+class tmTransactionManager;
+
+/**
+ * Basically an interface between the tmTransactionManager and the IPC
+ * daemon. Does little else than format the data from one party into
+ * a format understandable to the other.
+ *
+ * The reason for this class is to try and abstract the transportation
+ * layer the transaction service uses. By using this class the Transaction
+ * Manager itself only needs to know that clients are identified by
+ * PRUint32 IDs.
+ */
+class tmIPCModule
+{
+public:
+
+ ////////////////////////////////////////////////////////////////////////////
+ // ipcModule API - called from IPC daemon
+
+ /**
+ * Clean up the TM
+ */
+ static void Shutdown();
+
+ /**
+ * Check the TM, create it if neccessary.
+ */
+ static void Init();
+
+ /**
+ * Receives a message from the IPC daemon, creates a transaction and sends
+ * it to the TM to deal with.
+ */
+ static void HandleMsg(ipcClientHandle client,
+ const nsID &target,
+ const void *data,
+ PRUint32 dataLen);
+
+ ////////////////////////////////////////////////////////////////////////////
+ // tmIPCModule API - called from tmTransactionManager
+
+ /**
+ * Sends the message to the IPC daemon to be deliverd to the client arg.
+ */
+ static void SendMsg(PRUint32 aDestClientIPCID, tmTransaction *aTransaction);
+
+protected:
+
+ /**
+ * tm should be null coming into this method. This does NOT delete tm
+ * first.
+ *
+ * @returns NS_OK if everything succeeds
+ * @returns -1 if initialization fails
+ */
+ static PRInt32 InitInternal();
+
+ static tmTransactionManager *tm;
+
+};
+
+#endif
+
+
diff --git a/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmQueue.cpp b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmQueue.cpp
new file mode 100644
index 00000000..5164446f
--- /dev/null
+++ b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmQueue.cpp
@@ -0,0 +1,223 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Transaction Manager.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corp.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * John Gaunt <jgaunt@netscape.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "plstr.h"
+#include "tmQueue.h"
+#include "tmTransaction.h"
+#include "tmTransactionManager.h"
+#include "tmUtils.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// Constructors & Destructor
+
+tmQueue::~tmQueue() {
+
+ // empty the vectors
+ PRUint32 index = 0;
+ PRUint32 size = mTransactions.Size();
+ for ( ; index < size ; index++) {
+ if (mTransactions[index])
+ delete (tmTransaction *)mTransactions[index];
+ }
+
+ // don't need to delete the mListeners because
+ // we just insert PRUint32s, no allocation
+
+ mTM = nsnull;
+ mID = 0;
+ if (mName)
+ PL_strfree(mName);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Public Methods
+
+PRInt32
+tmQueue::Init(const char* aName, PRUint32 aID, tmTransactionManager *aTM) {
+ PR_ASSERT(mTM == nsnull);
+
+ if (NS_SUCCEEDED(mTransactions.Init()) &&
+ NS_SUCCEEDED(mListeners.Init()) &&
+ ((mName = PL_strdup(aName)) != nsnull) ) {
+ mTM = aTM;
+ mID = aID;
+ return NS_OK;
+ }
+ return -1;
+}
+
+PRInt32
+tmQueue::AttachClient(PRUint32 aClientID) {
+
+ PRInt32 status = NS_OK; // success of adding client
+
+ if (!IsAttached(aClientID)) {
+ // add the client to the listener list -- null safe call
+ status = mListeners.Append((void*) aClientID);
+ }
+ else
+ status = -2;
+
+ // create & init a reply transaction
+ tmTransaction trans;
+ if (NS_SUCCEEDED(trans.Init(aClientID, // owner's ipc ID
+ mID, // client gets our ID
+ TM_ATTACH_REPLY, // action
+ status, // success of the add
+ (PRUint8*)mName, // client matches name to ID
+ PL_strlen(mName)+1))) {
+ // send the reply
+ mTM->SendTransaction(aClientID, &trans);
+ }
+
+ // if we successfully added the client - send all current transactions
+ if (status >= 0) { // append returns the index of the added element
+
+ PRUint32 size = mTransactions.Size();
+ for (PRUint32 index = 0; index < size; index++) {
+ if (mTransactions[index])
+ mTM->SendTransaction(aClientID, (tmTransaction*) mTransactions[index]);
+ }
+ }
+ return status;
+}
+
+PRInt32
+tmQueue::DetachClient(PRUint32 aClientID) {
+
+ PRUint32 size = mListeners.Size();
+ PRUint32 id = 0;
+ PRInt32 status = -1;
+
+ for (PRUint32 index = 0; index < size; index++) {
+ id = (PRUint32)NS_PTR_TO_INT32(mListeners[index]);
+ if(id == aClientID) {
+ mListeners.RemoveAt(index);
+ status = NS_OK;
+ break;
+ }
+ }
+
+ tmTransaction trans;
+ if (NS_SUCCEEDED(trans.Init(aClientID,
+ mID,
+ TM_DETACH_REPLY,
+ status,
+ nsnull,
+ 0))) {
+ // send the reply
+ mTM->SendTransaction(aClientID, &trans);
+ }
+
+ // if we've removed all the listeners, remove the queue.
+ if (mListeners.Size() == 0)
+ return TM_SUCCESS_DELETE_QUEUE;
+ return status;
+}
+
+void
+tmQueue::FlushQueue(PRUint32 aClientID) {
+
+ if(!IsAttached(aClientID))
+ return;
+
+ PRUint32 size = mTransactions.Size();
+ for (PRUint32 index = 0; index < size; index++)
+ if (mTransactions[index])
+ delete (tmTransaction*)mTransactions[index];
+
+ mTransactions.Clear();
+
+ tmTransaction trans;
+ if (NS_SUCCEEDED(trans.Init(aClientID,
+ mID,
+ TM_FLUSH_REPLY,
+ NS_OK,
+ nsnull,
+ 0))) {
+ mTM->SendTransaction(aClientID, &trans);
+ }
+}
+
+PRInt32
+tmQueue::PostTransaction(tmTransaction *aTrans) {
+
+ PRInt32 status = -1;
+ PRUint32 ownerID = aTrans->GetOwnerID();
+
+ // if we are attached, have the right queue and have successfully
+ // appended the transaction to the queue, send the transaction
+ // to all the listeners.
+
+ if (IsAttached(ownerID) && aTrans->GetQueueID() == mID)
+ status = mTransactions.Append(aTrans);
+
+ if (status >= 0) {
+ // send the transaction to all members of mListeners except the owner
+ PRUint32 size = mListeners.Size();
+ PRUint32 id = 0;
+ for (PRUint32 index = 0; index < size; index++) {
+ id = (PRUint32)NS_PTR_TO_INT32(mListeners[index]);
+ if (ownerID != id)
+ mTM->SendTransaction(id, aTrans);
+ }
+ }
+
+ tmTransaction trans;
+ if (NS_SUCCEEDED(trans.Init(ownerID,
+ mID,
+ TM_POST_REPLY,
+ status,
+ nsnull,
+ 0))) {
+ // send the reply
+ mTM->SendTransaction(ownerID, &trans);
+ }
+ return status;
+}
+
+PRBool
+tmQueue::IsAttached(PRUint32 aClientID) {
+ // XXX could be an issue if the aClientID is 0 and there
+ // is a "hole" in the mListeners vector. - may NEED to store PRUint32*s
+ PRUint32 size = mListeners.Size();
+ for (PRUint32 index = 0; index < size; index++) {
+ if (aClientID == (PRUint32)NS_PTR_TO_INT32(mListeners[index]))
+ return PR_TRUE;
+ }
+ return PR_FALSE;
+}
diff --git a/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmQueue.h b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmQueue.h
new file mode 100644
index 00000000..1c680084
--- /dev/null
+++ b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmQueue.h
@@ -0,0 +1,186 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Transaction Manager.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corp.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * John Gaunt <jgaunt@netscape.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef _tmQueue_H_
+#define _tmQueue_H_
+
+#include "tmUtils.h"
+#include "tmVector.h"
+
+class tmClient;
+class tmTransaction;
+class tmTransactionManager;
+
+/**
+ * This class isn't so much a queue as it is storage for transactions. It
+ * is set up to recieve and store transactions in a growing collection
+ * (using tmVectors). Different messages can be recieved from the
+ * Transaction Manager(TM) the queue belongs to which can add and remove
+ * listeners, empty the queue (flush), and add messages to the queue.
+ *
+ * See the documentation in tmTransactionService.h for details on the
+ * messages you can send to and recieve from the queues in the TM
+ */
+class tmQueue
+{
+
+public:
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Constructor & Destructor
+
+ /**
+ * Set the internal state to default values. Init() must be called
+ * after construction to allocate the storage and set the name and ID.
+ */
+ tmQueue(): mID(0), mName(nsnull), mTM(nsnull) { }
+
+ /**
+ * Reclaim the memory allocated in Init(). Destroys the transactions in
+ * the transaction storage and the ids in the listener storage
+ */
+ virtual ~tmQueue();
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Public Member Functions
+
+ /**
+ * Initialize internal storage vectors and set the name of the queue
+ * and the pointer to the TM container.
+ *
+ * @returns NS_OK if everything succeeds
+ * @returns -1 if initialization fails
+ */
+ PRInt32 Init(const char* aName, PRUint32 aID, tmTransactionManager *aTM);
+
+ // Queue Operations
+
+ /**
+ * Adds the clientID to the list of queue listeners. A reply is created
+ * and sent to the client. The reply contains both the name of the
+ * queue and the id, so the client can match the id to the name and
+ * then use the id in all further communications to the queue. All
+ * current transactions in the queue are then sent to the client.
+ *
+ * If the client was already attached the reply is sent, but not the
+ * outstanding transactions, the assumption being made that all
+ * transactions have already been sent to the client.
+ *
+ * The reply is sent for all cases, with the return value in the status
+ * field.
+ *
+ * @returns >= 0 if the client was attached successfully
+ * @returns -1 if the client was not attached
+ * @returns -2 if the client was already attached
+ */
+ PRInt32 AttachClient(PRUint32 aClientID);
+
+ /**
+ * Removes the client from the list of queue listeners. A reply is created
+ * and sent to the client to indicate the success of the removal.
+ *
+ * The reply is sent for all cases, with the status field set to either
+ * -1 or NS_OK.
+ *
+ * @returns NS_OK on success
+ * @returns -1 if client is not attached to this queue
+ * @returns TM_SUCCESS_DELETE_QUEUE if there are no more listeners,
+ * instructing the Transaction Mangaer to delete the queue.
+ */
+ PRInt32 DetachClient(PRUint32 aClientID);
+
+ /**
+ * Removes all the transactions being held in the queue.
+ * A reply is created and sent to the client to indicate the
+ * completion of the operation.
+ */
+ void FlushQueue(PRUint32 aClientID);
+
+ /**
+ * Places the transaction passed in on the queue. Takes ownership of the
+ * transaction, deletes it in the destructor. A reply is created and
+ * sent to the client to indicate the success of the posting of the
+ * transaction.
+ *
+ * The reply is sent for all cases, with the status field containing the
+ * return value.
+ *
+ * @returns >= 0 if the message was posted properly.
+ * @returns -1 if the client posting is not attached to this queue,
+ * if the transaction has been posted to the wrong queue or
+ * if an error occured when trying to add the post to the
+ * internal storage.
+ */
+ PRInt32 PostTransaction(tmTransaction *aTrans);
+
+ // Accessors
+
+ /**
+ * @returns the ID of the queue
+ */
+ PRUint32 GetID() const { return mID; }
+
+ /**
+ * @returns the name of the queue
+ */
+ const char* GetName() const { return mName; }
+
+protected:
+
+ /**
+ * Helper method to determine if the client has already attached.
+ *
+ * @returns PR_TRUE if the client is attached to the queue.
+ * @returns PR_FALSE if the client is not attached to the queue.
+ */
+ PRBool IsAttached(PRUint32 aClientID);
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Protected Member Variables
+
+ // storage
+ tmVector mTransactions; // transactions that have been posted
+ tmVector mListeners; // programs listening to this queue
+
+ // bookkeeping
+ PRUint32 mID; // a number linked to the name in the mTM
+ char *mName; // format: [namespace][domainname(ie prefs)]
+ tmTransactionManager *mTM; // the container that holds the queue
+
+};
+
+#endif
diff --git a/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmTransactionManager.cpp b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmTransactionManager.cpp
new file mode 100644
index 00000000..9d6cc98e
--- /dev/null
+++ b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmTransactionManager.cpp
@@ -0,0 +1,162 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Transaction Manager.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corp.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * John Gaunt <jgaunt@netscape.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "plstr.h"
+#include <stdlib.h>
+#include "tmQueue.h"
+#include "tmTransactionManager.h"
+#include "tmTransaction.h"
+#include "tmUtils.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// Constructors & Destructor & Initializer
+
+tmTransactionManager::~tmTransactionManager() {
+
+ PRUint32 size = mQueues.Size();
+ tmQueue *queue = nsnull;
+ for (PRUint32 index = 0; index < size; index++) {
+ queue = (tmQueue *)mQueues[index];
+ if (queue) {
+ delete queue;
+ }
+ }
+}
+
+PRInt32
+tmTransactionManager::Init() {
+ return mQueues.Init();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// public transaction module methods
+
+void
+tmTransactionManager::HandleTransaction(tmTransaction *aTrans) {
+
+ PRUint32 action = aTrans->GetAction();
+ PRUint32 ownerID = aTrans->GetOwnerID();
+ tmQueue *queue = nsnull;
+
+ // get the right queue -- attaches do it differently
+ if (action == TM_ATTACH) {
+ const char *name = (char*) aTrans->GetMessage(); // is qName for Attaches
+ queue = GetQueue(name);
+ if (!queue) {
+ PRInt32 index = AddQueue(name);
+ if (index >= 0)
+ queue = GetQueue(index); // GetQueue may return nsnull
+ }
+ }
+ else // all other trans should have a valid queue ID already
+ queue = GetQueue(aTrans->GetQueueID());
+
+ if (queue) {
+ // All possible actions should have a case, default is not valid
+ // delete trans when done with them, let the queue own the trans
+ // that are posted to them.
+ PRInt32 result = 0;
+ switch (action) {
+ case TM_ATTACH:
+ queue->AttachClient(ownerID);
+ break;
+ case TM_POST:
+ result = queue->PostTransaction(aTrans);
+ if (result >= 0) // post failed, aTrans cached in a tmQueue
+ return;
+ break;
+ case TM_FLUSH:
+ queue->FlushQueue(ownerID);
+ break;
+ case TM_DETACH:
+ if (queue->DetachClient(ownerID) == TM_SUCCESS_DELETE_QUEUE) {
+ // the last client has been removed, remove the queue
+ RemoveQueue(aTrans->GetQueueID()); // this _could_ be out of bounds
+ }
+ break;
+ default:
+ PR_NOT_REACHED("bad action in the transaction");
+ }
+ }
+ delete aTrans;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Protected member functions
+
+//
+// Queue Handling
+//
+
+tmQueue*
+tmTransactionManager::GetQueue(const char *aQueueName) {
+
+ PRUint32 size = mQueues.Size();
+ tmQueue *queue = nsnull;
+ for (PRUint32 index = 0; index < size; index++) {
+ queue = (tmQueue*) mQueues[index];
+ if (queue && strcmp(queue->GetName(), aQueueName) == 0)
+ return queue;
+ }
+ return nsnull;
+}
+
+// if successful the nsresult contains the index of the added queue
+PRInt32
+tmTransactionManager::AddQueue(const char *aQueueName) {
+
+ tmQueue* queue = new tmQueue();
+ if (!queue)
+ return -1;
+ PRInt32 index = mQueues.Append(queue);
+ if (index < 0)
+ delete queue;
+ else
+ queue->Init(aQueueName, index, this);
+ return index;
+}
+
+void
+tmTransactionManager::RemoveQueue(PRUint32 aQueueID) {
+ PR_ASSERT(aQueueID <= mQueues.Size());
+
+ tmQueue *queue = (tmQueue*)mQueues[aQueueID];
+ if (queue) {
+ mQueues.RemoveAt(aQueueID);
+ delete queue;
+ }
+}
diff --git a/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmTransactionManager.h b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmTransactionManager.h
new file mode 100644
index 00000000..a03ba528
--- /dev/null
+++ b/src/libs/xpcom18a4/ipc/ipcd/extensions/transmngr/module/tmTransactionManager.h
@@ -0,0 +1,147 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Transaction Manager.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corp.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * John Gaunt <jgaunt@netscape.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef _tmTransactionManager_H_
+#define _tmTransactionManager_H_
+
+#include "plhash.h"
+#include "tmUtils.h"
+#include "tmVector.h"
+#include "tmIPCModule.h"
+
+// forward declarations
+class tmQueue;
+class tmClient;
+class tmTransaction;
+
+/**
+ * This class manages the flow of messages from the IPC daemon (coming to
+ * it through the tmIPCModule) that ultimately come from a Transaction
+ * Service (TS) in a mozilla based client somewhere. The message is
+ * delivered to the proper queue, where it is dealt with.
+ *
+ * New queues get created here as clients request them.
+ */
+class tmTransactionManager
+{
+
+public:
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Constructor(s) & Destructor & Initializer
+
+ /**
+ * reclaim the memory allcoated during initialization
+ */
+ virtual ~tmTransactionManager();
+
+ /**
+ * Set up the storage of the queues - initialize the vector
+ *
+ * @returns NS_OK if successful
+ * @returns -1 if initialization fails
+ */
+ PRInt32 Init();
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Public Member Functions
+
+ /**
+ * Called from the tmIPCModule. Decide where to send the message and
+ * dispatch it.
+ */
+ void HandleTransaction(tmTransaction *aTrans);
+
+ /**
+ * Called by the queues when they need to get a message back out to a
+ * client.
+ */
+ void SendTransaction(PRUint32 aDestClientIPCID, tmTransaction *aTrans) {
+ PR_ASSERT(aTrans);
+ tmIPCModule::SendMsg(aDestClientIPCID, aTrans);
+ }
+
+protected:
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Protected Member Functions
+
+ // Queue management
+
+ /**
+ * @returns the queue indexed by the ID passed in, which could be nsnull
+ */
+ tmQueue* GetQueue(PRUint32 aQueueID) {
+ return (tmQueue*) mQueues[aQueueID];
+ }
+
+ /**
+ * @returns the queue with the name passed in
+ * @returns nsnull if there is no queue with that name
+ */
+ tmQueue* GetQueue(const char *aQueueName);
+
+ /**
+ * If all is successful a new queue with the name provided will be created,
+ * and added to the collection of queues. It will be initialized and ready
+ * to have transactions added.
+ *
+ * This doesn't check for the existance of a queue with this name. IF
+ * there is already a queue with this name then you will
+ * get that when using GetQueue(qName) and never get the new queue
+ * created here. A call to GetQueue(qID) will be able to get at the new
+ * queue, however you had better cache the ID.
+ *
+ * @returns -1 if the queue can't be created, or is not added
+ * @returns >= 0 if the queue was added successfully
+ */
+ PRInt32 AddQueue(const char *aQueueType);
+
+ /**
+ */
+ void RemoveQueue(PRUint32 aQueueID);
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Protected Member Variables
+
+ tmVector mQueues;
+
+private:
+
+};
+
+#endif