diff options
Diffstat (limited to 'examples/Web_Crawler/URL_Visitor.cpp')
-rw-r--r-- | examples/Web_Crawler/URL_Visitor.cpp | 604 |
1 files changed, 604 insertions, 0 deletions
diff --git a/examples/Web_Crawler/URL_Visitor.cpp b/examples/Web_Crawler/URL_Visitor.cpp new file mode 100644 index 00000000000..e1943d75782 --- /dev/null +++ b/examples/Web_Crawler/URL_Visitor.cpp @@ -0,0 +1,604 @@ +// $Id$ + +#include "URL_Visitor.h" +#include "Command_Processor.h" + +ACE_RCSID(HTTP_1.1_Client, URL_Visitor, "$Id$") + +URL_Processing_Strategy::URL_Processing_Strategy (URL &url, + URL_Iterator &iterator) + : url_ (url), + iterator_ (iterator) +{ +} + +int +URL_Processing_Strategy::destroy (void) +{ + // Commit suicide. + delete this; + return 0; +} + +URL_Download_Strategy::URL_Download_Strategy (URL &url, + URL_Iterator &iterator) + : URL_Processing_Strategy (url, iterator) +{ +} + +int +URL_Download_Strategy::execute (void) +{ + ACE_CString buffer; + + // Extract all the contents of the Stream and print them to the + // file. + while (this->iterator_.next (buffer) != 0) + ACE_DEBUG ((LM_DEBUG, + "%s", + buffer.c_str ())); + + return 0; +} + +HTTP_Header_Processing_Strategy::HTTP_Header_Processing_Strategy (URL &url, + URL_Iterator &iterator) + : URL_Processing_Strategy (url, iterator) +{ +} + +int +HTTP_Header_Processing_Strategy::execute (void) +{ + ACE_DEBUG ((LM_DEBUG, "HEADER\n")); + // Set the get() position.Necessary since later a peek is done. + if (this->url_.stream ().get_char () == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n","Header Not Found"), + -1); + char line_buf[BUFSIZ + 1]; + ACE_CString line (line_buf); + // Get the lines in the header iteratively and check for status info. + int result = 1, i = 0; + for (i = 0, result = this->iterator_.next (line); + result > 0; + ++i, result = this->iterator_.next (line)) + { + if (i == 0) + { + ACE_DEBUG ((LM_DEBUG, "LINE:%s", line.c_str ())); + // Assuming that the status-no is a space away. + int status_index = line.find ("HTTP", 0); + ACE_CString status = line.substring (status_index + 9, //HTTP/1.1 200 + 3); + // DONE ONLY FOR TEMP USE AS OF NOW THE HTTP_SERVER DOESNT SEND AN HEADER. + // ACE_CString status_buf ("200"); + // status.set (status_buf.c_str (), 1); + + ACE_DEBUG ((LM_DEBUG, "STATUS %s\n", status.c_str ())); + URL_Status *url_status = 0; + ACE_NEW_RETURN (url_status, + URL_Status, + 0); + Auto_Destroyer<URL_Status> url_status_ptr (url_status); + url_status_ptr->status (ACE_OS::atoi (status.c_str ())); + this->url_.reply_status (**url_status_ptr); + // Invalid url. + if (url_status_ptr->status () != 200) + return -1; + } + else + { + + if (line.find ("text/html") >= 0) + { + ACE_CString url_content_type("text/html"); + this->url_.content_type (url_content_type); + } + } + } + return 0; + +} + +HTML_Body_Validation_Strategy::HTML_Body_Validation_Strategy (URL &url, + URL_Iterator &iterator, + URL_Validation_Visitor &context) + : URL_Processing_Strategy (url, iterator), + visitor_context_ (context) +{ +} + +int +HTML_Body_Validation_Strategy::execute (void) +{ + char host_name_buf[BUFSIZ + 1]; + ACE_CString host_name (host_name_buf); + host_name.set (url_.url_addr ().get_host_name (),1); + + // All to facilitate relative paths + char temp[BUFSIZ + 1]; + ACE_CString prev_location (temp); + + prev_location.set (this->url_.url_addr ().get_path_name (), + ACE_OS::strlen (this->url_.url_addr ().get_path_name ()), + 1); + int index = prev_location.rfind ('/', prev_location.length ()); + ACE_CString str = prev_location.substring (0, index + 1); + prev_location.set (str.c_str (), 1); + + // Note: prev_location always ends with '/' + if (prev_location[0] != '/') + prev_location = "/" + prev_location; + + // Build the url portion which can be attached to teh relative paths. + prev_location = host_name + prev_location; + + char url_string[BUFSIZ + 1]; + ACE_CString url (url_string); + + while (this->iterator_.next (url) > 0) + { + // Check for relative urls.Strip out "http://" if its there. + if (url.find ("http") < 0) + { + if (url[0] == '.' && url[1] == '.') + { + url.set (&url[3], 1); + int i = prev_location.rfind ('/', prev_location.length () - 1); + prev_location = prev_location.substring (0, i+1); + } + if (url[0] == '.' && url[1] == '/') + url.set (&url[2], 1); + + url = prev_location + url; + } + else + url.set (&url[7], 1); + // Double slash at the end works!e.g seista.cs.wustl.edu/~kirthika// + if (url.find (".html") < 0) + url = url + "/"; + + // Create the new URL address. + ACE_URL_Addr *url_addr; + ACE_NEW_RETURN (url_addr, + ACE_URL_Addr, + 0); + Auto_Destroyer<ACE_URL_Addr> url_addr_ptr (url_addr); + if (url_addr_ptr->string_to_addr (url.c_str ()) == 0) + { + HTTP_URL *http_url; + ACE_NEW_RETURN (http_url, + HTTP_URL (**url_addr_ptr, + ACE_dynamic_cast (HTTP_URL *, + &this->url_)), + 0); + URL_Command *url_command; + ACE_NEW_RETURN (url_command, + URL_Command (http_url), + 0); + + OPTIONS::instance ()->command_processor ()->insert (url_command); + } + } + return 0; +} + +URL_Iterator * +URL_Validation_Visitation_Strategy_Factory::make_header_iterator (void) +{ + URL_Iterator *i; + ACE_NEW_RETURN (i, + HTTP_Header_Iterator (*this->url_), + 0); + return i; +} + +URL_Iterator * +URL_Validation_Visitation_Strategy_Factory::make_body_iterator (void) +{ + URL_Iterator *i; + ACE_NEW_RETURN (i, + HTML_Body_Iterator (*this->url_), + 0); + return i; +} + +URL_Processing_Strategy * +URL_Validation_Visitation_Strategy_Factory::make_header_strategy (URL_Iterator &iterator) +{ + URL_Processing_Strategy *ps; + ACE_NEW_RETURN (ps, + HTTP_Header_Processing_Strategy (*this->url_, + iterator), + 0); + return ps; +} + +URL_Processing_Strategy * +URL_Validation_Visitation_Strategy_Factory::make_body_strategy (URL_Iterator &iterator) +{ + URL_Processing_Strategy *ps; + ACE_NEW_RETURN (ps, + HTML_Body_Validation_Strategy (*this->url_, + iterator, + this->visitor_context_), + 0); + return ps; +} + +int +URL_Validation_Visitation_Strategy_Factory::destroy (void) +{ + // Commit suicide. + delete this; + return 0; +} + +URL_Validation_Visitor::URL_Validation_Visitor (void) +{ + ACE_DEBUG ((LM_DEBUG, "URL_Validation_Visitor_Factory::Strategy Con created\n")); + ACE_NEW (this->strat_connector_, + STRAT_CONNECTOR(0, + &creation_strategy_, + &caching_connect_strategy_, + &activation_strategy_)); + if (strat_connector_ == 0) + ACE_ERROR ((LM_ERROR, + "%p %s\n" + "strategy connector creation failed")); + + +} + +URL_Validation_Visitor::~URL_Validation_Visitor (void) +{ +} + +URL_Validation_Visitor::URL_CACHE & +URL_Validation_Visitor::url_cache (void) +{ + return this->url_cache_; +} + +int +URL_Validation_Visitor::in_cache (const ACE_URL_Addr &url_addr) +{ + URL_Status reply_status (URL_Status::STATUS_CODE (1)); + + if (this->url_cache_.find (url_addr, reply_status) == 0) + { + ACE_DEBUG ((LM_DEBUG, + "status %d for URL %s (cached)\n", + reply_status.status (), + url_addr.addr_to_string (0))); + + // Invalid status. + if (reply_status.status () != 200) + return -1; + + return 1; + } + else + return 0; +} + +URL_Visitation_Strategy_Factory * +URL_Validation_Visitor::make_visitation_strategy_factory (URL &url) +{ + // Since this is HTTP 1.1 we'll need to establish a connection + // only once. Trying for relative paths. + // if (this->url_addr ().get_hostname () != url_hostname) + // { + if (url.stream ().open (this->strat_connector_, + url.url_addr ()) == -1) + return 0; + // } + // See if we can get connected and send the GET request via the + // <HTTP_URL>. + int result = url.send_request (); + if (result == -1) + { + ACE_ERROR ((LM_ERROR, + "%p\n", + "send_request")); + if (this->url_cache_.bind (url.url_addr (), + URL_Status (URL_Status::STATUS_SERVICE_UNAVAILABLE)) == -1) + ACE_ERROR ((LM_ERROR, + "%p\n", + "bind")); + return 0; + } + // @@ Here's where we could check to see if the <url> was HTTP or + // FTP, etc. But for now we'll just assume that everything is an + // HTTP URL. + else + { + + URL_Visitation_Strategy_Factory *vs; + ACE_NEW_RETURN (vs, + URL_Validation_Visitation_Strategy_Factory (&url, + *this), + 0); + return vs; + } +} + +int +URL_Validation_Visitor::destroy (void) +{ + delete this->strat_connector_; + // Commit suicide. + delete this; + return 0; +} + +int +URL_Validation_Visitor::visit (HTTP_URL &http_url) +{ + int result = this->in_cache (http_url.url_addr ()); + /* if (result == -1) + { + ACE_DEBUG ((LM_DEBUG, + "Invalid URL:%s (cached)\n", + http_url.url_addr().addr_to_string (0))); + return 0; + }*/ + if (result == 0) + { + Auto_Destroyer <URL_Visitation_Strategy_Factory> vs (this->make_visitation_strategy_factory (http_url)); + + if (*vs == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "make_visitation_strategy_factory"), + -1); + + Auto_Destroyer <URL_Iterator> ihs (vs->make_header_iterator ()); + if (*ihs == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "make_header_iterator"), + -1); + Auto_Destroyer <URL_Processing_Strategy> phs (vs->make_header_strategy (**ihs)); + if (*phs == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "make_header_strategy"), + -1); + int phs_result = phs->execute (); + if (phs_result == -1) + ACE_DEBUG ((LM_DEBUG, + "Invalid ")); + + ACE_DEBUG ((LM_DEBUG, + "URL with status %d %s\n", + http_url.reply_status ().status (), + http_url.url_addr().addr_to_string (0))); + + // Store the http url in the cache. + if (this->url_cache ().bind (http_url.url_addr (), + http_url.reply_status ()) != 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n","url_cache.bind"), + -1); + + // ACE_DEBUG ((LM_DEBUG, "header_processing result %d\n", phs_result)); + // Since it is invalid dont go further. + if (phs_result == -1) + return 0; + + // Get back if the recurse option isnt set. + if (OPTIONS::instance ()->recurse () != 1) + return 0; + + Auto_Destroyer <URL_Iterator> is (vs->make_body_iterator ()); + if (*is == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "make_body_iterator"), + -1); + + Auto_Destroyer <URL_Processing_Strategy> ps (vs->make_body_strategy (**is)); + if (*ps == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "make_body_strategy"), + -1); + + if (ps->execute () == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "body execute"), + -1); + // http_url.stream().svc_handler ()->idle ();//KIRTHIKA + } + return 0; +} + +int +URL_Download_Visitation_Strategy_Factory::destroy (void) +{ + // Commit suicide. + delete this; + return 0; +} + +URL_Iterator * +URL_Download_Visitation_Strategy_Factory::make_header_iterator (void) +{ + return 0; +} + +URL_Iterator * +URL_Download_Visitation_Strategy_Factory::make_body_iterator (void) +{ + URL_Iterator *i; + ACE_NEW_RETURN (i, + URL_Download_Iterator (*this->url_), + 0); + return i; +} + +URL_Processing_Strategy * +URL_Download_Visitation_Strategy_Factory::make_header_strategy (URL_Iterator &iterator) +{ + // You fill in here. + return 0; +} + +URL_Processing_Strategy * +URL_Download_Visitation_Strategy_Factory::make_body_strategy (URL_Iterator &iterator) +{ + URL_Processing_Strategy *ps; + ACE_NEW_RETURN (ps, + URL_Download_Strategy (*this->url_, + iterator), + 0); + return ps; +} + +URL_Visitation_Strategy_Factory::URL_Visitation_Strategy_Factory (URL *url) + : url_ (url) +{ +} + +URL_Download_Visitation_Strategy_Factory::URL_Download_Visitation_Strategy_Factory (URL *url) + : URL_Visitation_Strategy_Factory (url) +{ +} + +URL_Validation_Visitation_Strategy_Factory::URL_Validation_Visitation_Strategy_Factory (URL *url, + URL_Validation_Visitor &visitor_context) + : URL_Visitation_Strategy_Factory (url), + visitor_context_ (visitor_context) +{ +} + +URL_Visitation_Strategy_Factory * +URL_Download_Visitor::make_visitation_strategy_factory (URL &url) +{ + // See if we can get connected and send the GET request via the + // <HTTP_URL>. + while (1) //KIRTHIKA + { + int retval = url.send_request (); + if (retval != -1) + break; + + /* ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "send_request"), + 0);*/ + } + // @@ Here's where we could check to see if the <url> was HTTP or + // FTP, etc. But for now we'll just assume that everything is an + // HTTP URL. + // else + // { + URL_Visitation_Strategy_Factory *vs; + ACE_NEW_RETURN (vs, + URL_Download_Visitation_Strategy_Factory (&url), + 0); + return vs; + // } +} + +int +URL_Download_Visitor::destroy (void) +{ + // Commit suicide. + delete this; + return 0; +} + +int +URL_Download_Visitor::visit (HTTP_URL &http_url) +{ + Auto_Destroyer <URL_Visitation_Strategy_Factory> vs (this->make_visitation_strategy_factory (http_url)); + + if (*vs == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "make_visitation_strategy_factory"), + -1); + + Auto_Destroyer <URL_Iterator> is (vs->make_body_iterator ()); + if (*is == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "make_body_iterator"), + -1); + + Auto_Destroyer <URL_Processing_Strategy> ps (vs->make_body_strategy (**is)); + if (*ps == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "make_body_strategy"), + -1); + + if (ps->execute () == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "body execute"), + -1); + return 0; +} + +#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) +template class ACE_Hash_Map_Manager<ACE_URL_Addr, URL_Status, ACE_Null_Mutex>; +template class ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>; +template class ACE_Strategy_Connector<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>, ACE_SOCK_CONNECTOR>; +template class ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>; +template class ACE_NOOP_Creation_Strategy<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> >; +template class ACE_NOOP_Concurrency_Strategy<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> >; +template class ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex>; +template class ACE_Hash_Map_Iterator_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex>; +template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex>; +template class ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> >; +template class ACE_Cached_Connect_Strategy_Ex<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>,ACE_SOCK_CONNECTOR, ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> >, ACE_SYNCH_NULL_MUTEX >; +template class ACE_Creation_Strategy<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> >; +template class ACE_Concurrency_Strategy<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> >; +template class ACE_Hash_Map_Manager_Ex<ACE_URL_Addr, URL_Status, ACE_Hash<ACE_URL_Addr>, ACE_Equal_To<ACE_URL_Addr>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Entry<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>, ACE_Pair<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> *, int> >; +template class ACE_Connect_Strategy<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH>, ACE_SOCK_Connector>; +template class ACE_Hash_Map_Iterator_Base_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>, ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> *, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex>; +template class ACE_Optimal_Cache_Map_Manager<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> > >; +template class ACE_Optimal_Cache_Map_Reverse_Iterator<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> > >; +template class ACE_Optimal_Cache_Map_Iterator<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> > >; +template class ACE_Hash_Map_Entry<ACE_URL_Addr, URL_Status>; +template class ACE_Hash_Map_Iterator_Base_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>, ACE_Pair<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex>; +template class ACE_Recycling_Strategy<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> > ; +template class ACE_Connector<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH>, ACE_SOCK_Connector>; +template class ACE_Map_Manager<int, ACE_Svc_Tuple<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> > *, ACE_RW_Thread_Mutex>; +template class ACE_Svc_Tuple<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> >; +template class ACE_Hash_Map_Iterator_Base_Ex<ACE_URL_Addr, URL_Status, ACE_Hash<ACE_URL_Addr>, ACE_Equal_To<ACE_URL_Addr>, ACE_Null_Mutex>; +#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) +#pragma instantiate ACE_Hash_Map_Manager<ACE_URL_Addr, URL_Status, ACE_Null_Mutex> +#pragma instantiate ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> +#pragma instantiate ACE_Strategy_Connector<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>, ACE_SOCK_CONNECTOR> +#pragma instantiate ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> +#pragma instantiate ACE_NOOP_Creation_Strategy<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> > +#pragma instantiate ACE_NOOP_Concurrency_Strategy<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> > +#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *,int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> +#pragma instantiate ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> > +#pragma instantiate ACE_Cached_Connect_Strategy_Ex<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>,ACE_SOCK_CONNECTOR, ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> >, ACE_SYNCH_NULL_MUTEX > +#pragma instantiate ACE_Creation_Strategy<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> >; +#pragma instantiate ACE_Concurrency_Strategy<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> >; +#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_URL_Addr, URL_Status, ACE_Hash<ACE_URL_Addr>, ACE_Equal_To<ACE_URL_Addr>, ACE_Null_Mutex>; +#pragma instantiate ACE_Hash_Map_Entry<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>, ACE_Pair<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> *, int> >; +#pragma instantiate ACE_Connect_Strategy<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH>, ACE_SOCK_Connector>; +#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>, ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> *, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex>; +#pragma instantiate ACE_Optimal_Cache_Map_Manager<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> > > +#pragma instantiate ACE_Optimal_Cache_Map_Reverse_Iterator<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> > > +#pragma instantiate ACE_Optimal_Cache_Map_Iterator<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_LRU_Caching_Strategy<ACE_Hash_Map_Manager_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>,ACE_Pair<ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> > > +#pragma instantiate ACE_Hash_Map_Entry<ACE_URL_Addr, URL_Status> +#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr>, ACE_Pair<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> *, int>, ACE_Hash<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Equal_To<ACE_Refcounted_Hash_Recyclable<ACE_INET_Addr> >, ACE_Null_Mutex> +#pragma instantiate ACE_Recycling_Strategy<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> > +#pragma instantiate ACE_Connector<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH>, ACE_SOCK_Connector> +#pragma instantiate ACE_Map_Manager<int, ACE_Svc_Tuple<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> > *, ACE_RW_Thread_Mutex> +#pragma instantiate ACE_Svc_Tuple<ACE_Svc_Handler<ACE_SOCK_Stream, ACE_NULL_SYNCH> > +#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_URL_Addr, URL_Status, ACE_Hash<ACE_URL_Addr>, ACE_Equal_To<ACE_URL_Addr>, ACE_Null_Mutex> +#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |