summaryrefslogtreecommitdiff
path: root/ACE/apps/drwho/PMC_Flo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/drwho/PMC_Flo.cpp')
-rw-r--r--ACE/apps/drwho/PMC_Flo.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/ACE/apps/drwho/PMC_Flo.cpp b/ACE/apps/drwho/PMC_Flo.cpp
new file mode 100644
index 00000000000..2723e715100
--- /dev/null
+++ b/ACE/apps/drwho/PMC_Flo.cpp
@@ -0,0 +1,126 @@
+// $Id$
+
+#include "Options.h"
+#include "BS_Client.h"
+#include "PMC_Flo.h"
+#include "ace/ACE.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_Memory.h"
+
+// This function "encodes" a list of friends by putting the userid's
+// in a contiguous block. This block can then be transmitted over to
+// the network to servers on other subnets. Several things are added
+// to make decoding easier on the other end:
+//
+// * A count of the number of friends is prepended (assumption: there
+// are no more than 9999999 friends... ;-))
+// * The login userids are separated by a single space. */
+
+int
+PMC_Flo::encode (char *packet, int &packet_length)
+{
+ if (Options::get_opt (Options::DEBUGGING) != 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "in PMC_Flo::encode"));
+
+ ACE_NEW_RETURN (this->ss,
+ BS_Client,
+ -1);
+
+ SET_PACKET_TYPE (packet, Options::PROTO_FLO);
+ char *buf_ptr = SKIP_PACKET_TYPE (packet);
+
+ ACE_OS::sprintf (buf_ptr,
+ "%d",
+ this->friend_count ());
+
+ buf_ptr += MAXUSERIDNAMELEN;
+
+ // Iterate through all the friends, copying them into the packet
+ // buffer.
+
+ for (Protocol_Record *prp; (prp = this->get_next_friend ()) != 0; )
+ buf_ptr = ACE_OS::strecpy (buf_ptr,
+ prp->get_login ());
+
+ packet_length = buf_ptr - packet;
+
+ if (Options::get_opt (Options::DEBUGGING) != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "packet_length = %d\n",
+ packet_length));
+ ACE_OS::write (ACE_STDERR, packet, packet_length);
+ ACE_DEBUG ((LM_DEBUG,
+ "\n"));
+ }
+
+ return 1;
+}
+
+// This method is responsible for transforming the msg from the server
+// back into a form usable by the client.
+
+int
+PMC_Flo::decode (char *packet, int &packet_length)
+{
+ if (Options::get_opt (Options::DEBUGGING) != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "in PMC_Flo::decode, packet_length = %d\n",
+ packet_length));
+ ACE_OS::write (ACE_STDERR, packet, packet_length);
+ ACE_DEBUG ((LM_DEBUG,
+ "\n"));
+ }
+
+ char *cp = packet;
+ int remote_users = 0;
+
+ sscanf (cp,
+ "Users %d",
+ &remote_users);
+
+ this->increment_total_users (remote_users);
+
+ for (cp = (char *) ACE::strend (cp);
+ *cp != '\n';
+ cp++)
+ {
+ char *login_name = cp;
+
+ for (cp = (char *) ACE::strend (cp);
+ *(cp = this->handle_protocol_entries (cp, login_name)) != '\t';
+ )
+ continue;
+ }
+
+ return 1;
+}
+
+Protocol_Record *
+PMC_Flo::insert_protocol_info (Protocol_Record &protocol_record)
+{
+ Protocol_Record *prp = PM_Client::insert_protocol_info (protocol_record);
+ int length = ACE_OS::strlen (prp->get_real ());
+
+ if (length > this->max_key_length)
+ this->max_key_length = length;
+
+ return prp;
+}
+
+void
+PMC_Flo::process (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "remote friends logged on\n"));
+ PM_Client::process ();
+}
+
+PMC_Flo::PMC_Flo (void)
+{
+}