Main Page   Modules   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

ScreenPipe Class Reference

A server for reading screen buffers from VCC. More...

#include <ScreenPipe.h>

Inherits PServer.

List of all members.

Public Methods

DWORD readToDIB (DIBitmap &)
 ScreenPipe (const TString &)

Private Types

typedef ScreenPipe::screenInfo screenInfo
 The structure of the header for each screen buffer. More...


Private Methods

DWORD readError ()


Detailed Description

This object is responsible for reading screen buffer data from the pipe and setting a DIBitmap.

Definition at line 26 of file ScreenPipe.h.


Member Typedef Documentation

typedef struct ScreenPipe::screenInfo ScreenPipe::screenInfo [private]
 

This is the first information on the pipe for each screen buffer. The size of the message is calculated from this information


Constructor & Destructor Documentation

ScreenPipe::ScreenPipe const TString   name
 

Parameters:
name  : A TString used to generate unique names for the various kernel objects

Definition at line 25 of file ScreenPipe.cpp.

References BUFFER_SIZE.

00026 :PServer(TString( TEXT("Screen") ) + name, 
00027     false, 
00028     BUFFER_SIZE)
00029 {}


Member Function Documentation

DWORD ScreenPipe::readError   [inline, private]
 

Error function for readToDIB()

Definition at line 96 of file ScreenPipe.cpp.

References PServer::disconnect(), SP_NOT_CONNECTED, and SP_UNKNOWN_ERROR.

Referenced by readToDIB().

00097 {
00098     switch(GetLastError()) {
00099         case ERROR_SECTOR_NOT_FOUND:
00100             disconnect();
00101             return SP_NOT_CONNECTED;
00102         case ERROR_SUCCESS:     // EOF?
00103         case ERROR_READ_FAULT:
00104         default:
00105             return SP_UNKNOWN_ERROR;
00106     }
00107 }

DWORD ScreenPipe::readToDIB DIBitmap   destination
 

A blocking function which reads data from the screen pipe and sets the given DIBitmap accordingly.

Parameters:
destination  : The DIBitmap which is set

Definition at line 40 of file ScreenPipe.cpp.

References ScreenPipe::screenInfo::bitCount, ScreenPipe::screenInfo::clrUsed, DIBitmap::createCompatible(), DIBitmap::getPBITMAPINFOHEADER(), DIBitmap::getPBytes(), DIBitmap::getPPalette(), ScreenPipe::screenInfo::hdrSize, ScreenPipe::screenInfo::height, Pipe::hPipe, readError(), SP_ERROR_CREATING_BITMAP, SP_INVALID_DATA, SP_SUCCESS, and ScreenPipe::screenInfo::width.

Referenced by UpdateHandler::update().

00041 {
00042     DWORD numBytesRead;
00043     bool isOk;
00044 
00045     screenInfo header;
00046     isOk = ReadFile( 
00047                 hPipe,                  // Read from
00048                 &header,                // data buffer
00049                 sizeof(screenInfo),     // number of bytes to read
00050                 &numBytesRead,          // number of bytes read
00051                 NULL);                  // not overlapped
00052     
00053     if( !isOk || (numBytesRead != sizeof(screenInfo)) )
00054         return readError();
00055 
00056     if( header.hdrSize != sizeof(screenInfo) ){
00057         return SP_INVALID_DATA;
00058     }
00059 
00061     if( !(destination.getPBITMAPINFOHEADER()->biBitCount == header.bitCount
00062             && destination.getPBITMAPINFOHEADER()->biHeight == header.height
00063             && destination.getPBITMAPINFOHEADER()->biWidth == header.width) ){
00064 
00065         if( !destination.createCompatible(header.width, header.height, header.bitCount))
00066             return SP_ERROR_CREATING_BITMAP;
00067     }
00068 
00069     LPRGBQUAD palette = destination.getPPalette();
00070     RGBTRIPLE entry;
00071     for(int i=0; i < header.clrUsed; i++, palette++){
00072 
00073         isOk = ReadFile(hPipe, &entry, sizeof(RGBTRIPLE), &numBytesRead, NULL);
00074         if( !isOk || (numBytesRead != sizeof(RGBTRIPLE)) )
00075             return readError();
00076 
00077         palette->rgbBlue = entry.rgbtBlue;
00078         palette->rgbGreen = entry.rgbtGreen;
00079         palette->rgbRed = entry.rgbtRed;
00080         palette->rgbReserved = 0;
00081     }
00082 
00083     // See DIBitmap documentation for explanation of this formula
00084     const DWORD size = (((( header.width * header.bitCount ) + 31) & ~31) >> 3) * header.height;
00085 
00086     isOk = ReadFile(hPipe, destination.getPBytes(), size, &numBytesRead, NULL);
00087     if( !isOk || (numBytesRead != size ) )
00088         return readError();
00089 
00090     return SP_SUCCESS;
00091 }


The documentation for this class was generated from the following files:
Generated on Mon Mar 25 06:30:00 2002 for Window Dressing by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001