summaryrefslogtreecommitdiff
path: root/TAO/examples/Content_Server/AMI_Iterator/Iterator_Factory_i.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/examples/Content_Server/AMI_Iterator/Iterator_Factory_i.cpp')
-rw-r--r--TAO/examples/Content_Server/AMI_Iterator/Iterator_Factory_i.cpp162
1 files changed, 162 insertions, 0 deletions
diff --git a/TAO/examples/Content_Server/AMI_Iterator/Iterator_Factory_i.cpp b/TAO/examples/Content_Server/AMI_Iterator/Iterator_Factory_i.cpp
new file mode 100644
index 00000000000..05e196fc903
--- /dev/null
+++ b/TAO/examples/Content_Server/AMI_Iterator/Iterator_Factory_i.cpp
@@ -0,0 +1,162 @@
+// -*- C++ -*-
+// $Id$
+
+// Ossama Othman <ossama@uci.edu>
+
+#include "Content_Iterator_i.h"
+#include "Iterator_Factory_i.h"
+#include "ace/OS_NS_time.h"
+#include "ace/OS_NS_strings.h"
+#include "ace/OS_NS_string.h"
+
+
+ACE_RCSID (AMI_Iterator,
+ Iterator_Factory_i,
+ "$Id$")
+
+
+void
+Iterator_Factory_i::get_iterator (const char *pathname,
+ Web_Server::Content_Iterator_out contents,
+ Web_Server::Metadata_Type_out metadata)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Received request for file: <%s>\n"),
+ pathname));
+
+ ACE_stat file_status;
+ if (ACE_OS::stat (pathname, &file_status) == -1)
+ // HTTP 1.1 "Internal Server Error".
+ throw Web_Server::Error_Result (500);
+
+ Content_Iterator_i *iterator_servant = 0;
+ ACE_NEW_THROW_EX (iterator_servant,
+ Content_Iterator_i (pathname,
+ file_status.st_size),
+ CORBA::NO_MEMORY ());
+
+ if (iterator_servant->init () != 0)
+ {
+ if (errno == EACCES)
+ // HTTP 1.1 "Forbidden".
+ throw Web_Server::Error_Result (403);
+ else
+ // HTTP 1.1 "Internal Server Error".
+ throw Web_Server::Error_Result (500);
+ }
+
+
+ // Activate the Content_Iterator object.
+ Web_Server::Content_Iterator_var iterator =
+ iterator_servant->_this ();
+
+ Web_Server::Metadata_Type *tmp = 0;
+ ACE_NEW_THROW_EX (tmp,
+ Web_Server::Metadata_Type,
+ CORBA::NO_MEMORY ());
+
+ metadata = tmp;
+
+ if (this->modification_date (&file_status,
+ metadata) != 0)
+ // HTTP 1.1 "Internal Server Error.
+ throw Web_Server::Error_Result (500);
+
+ if (this->content_type (pathname,
+ metadata) != 0)
+ // HTTP 1.1 "Internal Server Error.
+ throw Web_Server::Error_Result (500);
+
+ contents = iterator._retn (); // Make a copy
+}
+
+int
+Iterator_Factory_i::modification_date (ACE_stat * file_status,
+ Web_Server::Metadata_Type_out metadata)
+{
+ // Get the modification time from the file status structure/
+ struct tm *t_gmt = gmtime (&(file_status->st_mtime));
+
+ // A time string is probably never going to exceed 256 bytes.
+ const size_t buflen = 256;
+ char buf[buflen];
+
+ // Format the time to conform to RFC 1123.
+ if (ACE_OS::strftime (buf,
+ buflen,
+ "%a, %d %b %Y %H:%M:%S GMT",
+ t_gmt) == 0)
+ return -1;
+ else
+ metadata->modification_date = CORBA::string_dup (buf);
+
+ return 0;
+}
+
+int
+Iterator_Factory_i::content_type (const char *filename,
+ Web_Server::Metadata_Type_out metadata)
+{
+ if (filename == 0)
+ return -1;
+
+ // @@ There are a bunch of const_casts in this method. It's ugly.
+ // I know.
+ // -Ossama
+
+ size_t len = ACE_OS::strlen (filename);
+
+ // Search for extension
+ // Handle the case where multiple periods exists in the filename,
+ // e.g.: foo.bar.ps
+ char *extension = 0;
+ for (char * tmp = const_cast<char *> (filename);
+ tmp != 0 && tmp != tmp + len;
+ )
+ {
+ tmp = const_cast<char *> (ACE_OS::strchr (tmp, '.'));
+ if (tmp != 0)
+ extension = ++tmp; // Skip over the '.'
+ }
+
+ if (extension == 0)
+ extension = const_cast<char *> (filename); // No extension!
+
+ if (ACE_OS::strcasecmp (extension, "htm") == 0
+ || ACE_OS::strcasecmp (extension, "html") == 0)
+ metadata->content_type = CORBA::string_dup ("text/html");
+ else if (ACE_OS::strcasecmp (extension,
+ "txt") == 0)
+ metadata->content_type = CORBA::string_dup ("text/plain");
+ else if (ACE_OS::strcasecmp (extension,
+ "ps") == 0)
+ metadata->content_type =
+ CORBA::string_dup ("application/postscript");
+ else if (ACE_OS::strcasecmp (extension,
+ "pdf") == 0)
+ metadata->content_type = CORBA::string_dup ("application/pdf");
+ else if (ACE_OS::strcasecmp (extension,
+ "jpeg") == 0
+ || ACE_OS::strcasecmp (extension,
+ "jpg") == 0)
+ metadata->content_type = CORBA::string_dup ("image/jpeg");
+ else if (ACE_OS::strcasecmp (extension,
+ "tiff") == 0)
+ metadata->content_type = CORBA::string_dup ("image/tiff");
+ else if (ACE_OS::strcasecmp (extension,
+ "gif") == 0)
+ metadata->content_type = CORBA::string_dup ("image/gif");
+ else if (ACE_OS::strcasecmp (extension,
+ "png") == 0)
+ metadata->content_type = CORBA::string_dup ("image/png");
+ else
+ {
+ metadata->content_type = CORBA::string_dup ("text/html");
+ ACE_ERROR ((LM_WARNING,
+ ACE_TEXT ("\n ")
+ ACE_TEXT ("Unknown file type. ")
+ ACE_TEXT ("Using \"text/html\" content type.\n")));
+ }
+
+ return 0;
+}