===============================
Basic Streaming for an HSF File
===============================

Streaming of 3D data typically refers to a process whereby graphical information is retrieved from a remote location such as a website or server and is displayed as soon as it is received by the client application. It allows the end-user to quickly obtain some visual feedback, as well as interact with the scene as it is still being displayed. 

The following steps are necessary to add support for streaming an HSF into an application:

#. Create an instance of a ``BStreamFileToolkit`` object. 
#. Open a file. For a local file, this could be done manually using fopen, or the toolkit's wrapper function ``BStreamFileToolkit::OpenFile`` could be used. 
#. Read, process and incrementally draw chunks of the file to the screen by calling the sequence of ``BStreamFileToolkit::ReadBuffer``, ``BStreamFileToolkit::ParseBuffer`` and your application-specific scene-graph drawing function within a loop until the entire file has been read. For a local file, reading could be done manually using fread. If the toolkit's ``BStreamFileToolkit::OpenFile`` wrapper function was used to previously open the file, than ``BStreamFileToolkit::ReadBuffer`` may be used to read from the file. 

In review, it is up to the developer to map the data to their custom data-structures within the ``Execute`` method of their custom opcode handlers when using the base classes. 

The following code demonstrates how an HSF file called *factory.hsf* ould be streamed into the HOOPS/3dGS database and incrementally drawn, using the base classes::

	void Stream_HSF_File (char const * filename)  
	{ 
		auto	char		block[BUFFER_SIZE]; 
		auto	TK_Status	status = TK_Normal; 
		auto	int			amount;  

		BStreamFileToolkit * tk = new BStreamFileToolkit;  

		// our sample custom toolkit only cares about segment and shells 
		tk->SetOpcodeHandler (TKE_Open_Segment, new TK_My_Open_Segment);    
		tk->SetOpcodeHandler (TKE_Close_Segment, new TK_My_Close_Segment);    
		tk->SetOpcodeHandler (TKE_Shell, new TK_My_Shell);  

		if ((status = tk->OpenFile (filename)) != TK_Normal)    
			   return status;  
		do 
		{ 
			if (tk->ReadBuffer (block, BUFFER_SIZE, amount) != TK_Normal) 
				break;
				  
			status = tk->ParseBuffer (block, amount);  
			MyGraphicsUpdateFunction();    
		  
			if (status == TK_Error)    
			{ 
				// whatever...    
				break; 
			} 
		} while (status != TK_Complete);  
		
		tk->CloseFile ();  
		
		delete tk; 
	} 
