summaryrefslogtreecommitdiff
path: root/ACE/apps/JAWS/clients/Blobby/blobby.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/JAWS/clients/Blobby/blobby.cpp')
-rw-r--r--ACE/apps/JAWS/clients/Blobby/blobby.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/ACE/apps/JAWS/clients/Blobby/blobby.cpp b/ACE/apps/JAWS/clients/Blobby/blobby.cpp
new file mode 100644
index 00000000000..0ecc4c8b1ff
--- /dev/null
+++ b/ACE/apps/JAWS/clients/Blobby/blobby.cpp
@@ -0,0 +1,123 @@
+// $Id$
+
+//============================================================================
+//
+// = LIBRARY
+// JAWS
+//
+// = FILENAME
+// blobby.c
+//
+// = DESCRIPTION
+// Simple client application to illustrate the use of the ACE_Blob class
+//
+// It reads "length" number of bytes, after skipping offset "offset"
+// from hostname, port and filename as specified. (if -r specified)
+//
+// It writes "length" number of bytes, after skipping offset "offset"
+// to hostname, port and filename as specified (if -w specified)
+//
+// = AUTHOR
+// Prashant Jain and Sumedh Mungee
+//
+//============================================================================
+
+#include "Options.h"
+#include "ace/OS_main.h"
+#include "ace/OS_NS_fcntl.h"
+#include "ace/OS_NS_unistd.h"
+
+int
+ACE_TMAIN (int argc, ACE_TCHAR *argv[])
+{
+ // Options is a singleton
+ Options *options = Options::instance ();
+ options->parse_args (argc, argv);
+
+ // Explain what is going to happen
+ if (options->debug_)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("hostname = %C, port = %d, filename = %s, ")
+ ACE_TEXT ("length = %d, offset = %d, operation = %c\n"),
+ options->hostname_,
+ options->port_,
+ options->filename_,
+ options->length_,
+ options->offset_,
+ options->operation_));
+
+ // Create a blob
+ ACE_Blob blob;
+
+ // User requested a read
+ if (options->operation_ == 'r')
+ {
+ ACE_Message_Block mb (0, options->length_);
+
+ // Open the blob
+ if (blob.open (options->filename_,
+ options->hostname_,
+ options->port_) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("open error")),
+ -1);
+
+ // Read from it
+ if (blob.read (&mb, options->length_, options->offset_) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("read error")),
+ -1);
+
+ // Write to STDOUT
+ if (ACE_OS::write (ACE_STDOUT, mb.rd_ptr(), mb.length()) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("write error")),
+ -1);
+ }
+ else
+ {
+ int total = options->length_ + options->offset_;
+ ACE_Message_Block mb (total);
+
+ // Open the file to be sent
+ ACE_HANDLE h = ACE_OS::open (options->filename_, O_RDONLY);
+ if (h == ACE_INVALID_HANDLE)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("file open error")),
+ -1);
+
+ // Open the blob
+ if (blob.open (options->filename_, options->hostname_, options->port_) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("connection open error")),
+ -1);
+
+ // Read from the file
+ if (ACE_OS::read (h, mb.wr_ptr (), total) != total)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("file read error")),
+ -1);
+
+ // Close the file
+ ACE_OS::close (h);
+
+ // Adjust the offset
+ mb.wr_ptr (mb.size ());
+
+ // Write to the blob
+ if (blob.write (&mb, options->length_, options->offset_) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("network write error")),
+ -1);
+ }
+
+ blob.close ();
+ return 0;
+}