// -*- C++ -*- // $Id$ // ============================================================================ // // = LIBRARY // AMI_Observer // // = FILENAME // Callback_i.h // // = DESCRIPTION // Header file for the Web_Server::Callback implementation. // // = AUTHOR // Ossama Othman // // ============================================================================ #ifndef CALLBACK_I_H #define CALLBACK_I_H #include "ace/FILE_Addr.h" #include "ace/FILE_IO.h" #include "Push_Web_ServerS.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ // This is to remove "inherits via dominance" warnings from MSVC. // MSVC is being a little too paranoid. #if defined(_MSC_VER) #if (_MSC_VER >= 1200) #pragma warning(push) #endif /* _MSC_VER >= 1200 */ #pragma warning(disable:4250) #endif /* _MSC_VER */ // Implement the Web_Server::Callback interface. class Callback_i : public virtual POA_Web_Server::Callback, public virtual PortableServer::RefCountServantBase { // = TITLE // Implement the Web_Server::Callback interface. // // = DESCRIPTION // A object implements the Observer pattern. It // simply "watches" while the Content Server pushes chunks of // data to itself. Once the Content Server pushes the last chunk // of data, the object spawns an external viewer to // display the pushed data based on the data content type // returned by the Iterator_Factory::register_callback() method. // // Since the server pushes data to the object // asynchronously, and since instances of this class // are registered with the Content Server asynchronously, there // is no guarantee that the metadata containing the content type // will arrive before the content of the file. As such, this // class atomically sets and checks the flags that provide the // current condition of the metadata and content, in case two // concurrently running threads attempt to update the state // contained within a given object. friend class Callback_i_Friend; // Dummy friend class declaration to quiet down a warning. public: Callback_i (int *request_count); // Constructor virtual void next_chunk (const Web_Server::Chunk_Type &chunk, CORBA::Boolean last_chunk, CORBA::Environment &ACE_TRY_ENV) ACE_THROW_SPEC ((CORBA::SystemException)); // This operation returns the next of the file starting at // . If there are no more bindings, false is returned. void metadata (const Web_Server::Metadata_Type &metadata); // Set metadata associated with received data. private: ~Callback_i (void); // Destructor must be private to ensure that this object is // allocated on the heap. int metadata_received (void); // Returns one if the metadata was received, and zero otherwise. int content_received (void); // Returns one if the entire content was received, and zero // otherwise. int get_viewer (char *viewer, size_t length); // Get the name of the viewer associated with the file being // retrieved. int spawn_viewer (void); // Spawn an external view to display the retrieved file. private: void deactivate (CORBA::Environment &ACE_TRY_ENV); // Deactivate this Callback servant. private: ACE_FILE_Addr file_; // The Addr corresponding to the retrieved file. ACE_FILE_IO file_io_; // The object that provides all file related IO operations // (e.g. read, write, etc). Web_Server::AMI_CallbackHandler_var ami_handler_; // Reference to this Reply Handler's self. Web_Server::Metadata_Type metadata_; // The metadata associated with the file being retrieved from the // web server. int last_chunk_; // Flag that indicates entire data content has been received. TAO_SYNCH_MUTEX lock_; // Lock used to prevent race conditions when checking to see if // metadata or entire content has been received. int *request_count_; // Pointer to external status monitoring variable. The contents (not // the pointer itself) of the parameter will be // decremented when file retrieval has completed. }; #if defined(_MSC_VER) && (_MSC_VER >= 1200) #pragma warning(pop) #endif /* _MSC_VER */ #endif /* CALLBACK_I_H */