00001
00004
00005
00006 #include "stdafx.h"
00007 #include "ScreenPipe.h"
00008
00010 #define BUFFER_LIES_BYTE_FACTOR 23
00011
00014 #define BUFFER_SIZE sizeof(BYTE)*240*320+(sizeof(BYTE)*3*256)+sizeof(screenInfo) \
00015 * BUFFER_LIES_BYTE_FACTOR
00016
00018
00020
00025 ScreenPipe::ScreenPipe(const TString &name)
00026 :PServer(TString( TEXT("Screen") ) + name,
00027 false,
00028 BUFFER_SIZE)
00029 {}
00030
00032
00034
00040 DWORD ScreenPipe::readToDIB(DIBitmap &destination)
00041 {
00042 DWORD numBytesRead;
00043 bool isOk;
00044
00045 screenInfo header;
00046 isOk = ReadFile(
00047 hPipe,
00048 &header,
00049 sizeof(screenInfo),
00050 &numBytesRead,
00051 NULL);
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
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 }
00092
00096 DWORD ScreenPipe::readError()
00097 {
00098 switch(GetLastError()) {
00099 case ERROR_SECTOR_NOT_FOUND:
00100 disconnect();
00101 return SP_NOT_CONNECTED;
00102 case ERROR_SUCCESS:
00103 case ERROR_READ_FAULT:
00104 default:
00105 return SP_UNKNOWN_ERROR;
00106 }
00107 }