static void pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_uint_32 check; png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */ png_FILE_p io_ptr; /* Check if data really is near. If so, use usual code. */ near_data = (png_byte *)CVT_PTR_NOCHECK(data); io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); if ((png_bytep)near_data == data) WRITEFILE(io_ptr, near_data, length, check); else { png_byte buf[NEAR_BUF_SIZE]; png_size_t written, remaining, err; check = 0; remaining = length; do { written = MIN(NEAR_BUF_SIZE, remaining); png_memcpy(buf, data, written); /* Copy far buffer to near buffer */ WRITEFILE(io_ptr, buf, written, err); if (err != written) break; else check += err; data += written; remaining -= written; } while (remaining != 0); } if (check != length) png_error(png_ptr, "Write Error"); }
static void pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_uint_32 check; WRITEFILE((png_FILE_p)png_ptr->io_ptr, data, length, check); if (check != length) png_error(png_ptr, "Write Error"); }
/****************************************************************************** * Name: ProcessCommRequests * * Purpose: worker thread function that communicates with the com port ******************************************************************************/ UINT AFX_CDECL ProcessCommRequests( LPVOID lParam) { if( !lParam) return 2; DWORD dwWait; // loop ends by returning on error or when the terminate flag is set while( TRUE) { dwWait = WaitForSingleObject( COMMEVENT, TIMEOUT); while( dwWait!=WAIT_OBJECT_0) { // check for error if( dwWait==WAIT_ABANDONED_0 || dwWait == WAIT_FAILED) { ResetEvent( COMMEVENT); PurgeComm( HPORT, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); return 1; } // check for termination if( TERMINATE_FLAG) { ResetEvent( COMMEVENT); PurgeComm( HPORT, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); return 0; } dwWait = WaitForSingleObject( COMMEVENT, TIMEOUT); } CCommRequest* pRequest = (((CCommDevice*)lParam)->m_pRequest); switch( pRequest->m_dwRequestType) { case REQUEST_READ: { // clear request error field pRequest->m_dwRequestError = ERR_NOERROR; DWORD dwBytesRead = READFILE( pRequest->m_lpszResult, pRequest->m_dwResultLength, pRequest->m_dwMaxTries, pRequest->m_dwTimeout); pRequest->m_dwResultLength = dwBytesRead; pRequest->m_dwRequestError = COMMSTATE; COMMSTATE = ERR_NOERROR; ((CCommDevice*)lParam)->m_pRequest = NULL; ResetEvent( COMMEVENT); if( !dwBytesRead) { switch( pRequest->m_dwRequestError) { case ERR_PORTERROR: case ERR_NOPORTLOCK: case ERR_NODATALOCK: { if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); return 1; } case ERR_TERMINATED: { if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); return 0; } } } if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); break; } case REQUEST_WRITE: { // clear request error field pRequest->m_dwRequestError = ERR_NOERROR; DWORD dwBytesWritten = WRITEFILE( pRequest->m_lpszData, pRequest->m_dwDataLength); pRequest->m_dwDataLength = dwBytesWritten; pRequest->m_dwRequestError = COMMSTATE; COMMSTATE = ERR_NOERROR; ((CCommDevice*)lParam)->m_pRequest = NULL; ResetEvent( COMMEVENT); if( !dwBytesWritten) { switch( pRequest->m_dwRequestError) { case ERR_PORTERROR: case ERR_NOPORTLOCK: { if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); return 1; } case ERR_TERMINATED: { if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); return 0; } } } if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); break; } case REQUEST_COMMAND: { // clear request error field pRequest->m_dwRequestError = ERR_NOERROR; DWORD dwBytesRead = COMMAND( pRequest->m_lpszData, pRequest->m_dwDataLength, pRequest->m_lpszResult, pRequest->m_dwResultLength, pRequest->m_dwMaxTries, pRequest->m_dwTimeout); pRequest->m_dwResultLength = dwBytesRead; pRequest->m_dwRequestError = COMMSTATE; COMMSTATE = ERR_NOERROR; ((CCommDevice*)lParam)->m_pRequest = NULL; ResetEvent( COMMEVENT); if( !dwBytesRead) { switch( pRequest->m_dwRequestError) { case ERR_PORTERROR: case ERR_NOPORTLOCK: case ERR_NODATALOCK: { if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); return 1; } case ERR_TERMINATED: { if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); return 0; } } } if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); break; } case REQUEST_SPECIAL: { // clear request error field pRequest->m_dwRequestError = ERR_NOERROR; HANDLESPECIALREQUEST( pRequest); COMMSTATE = ERR_NOERROR; ((CCommDevice*)lParam)->m_pRequest = NULL; ResetEvent( COMMEVENT); switch( pRequest->m_dwRequestError) { case ERR_PORTERROR: case ERR_NOPORTLOCK: case ERR_NODATALOCK: { if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); return 1; } case ERR_TERMINATED: { if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); return 0; } } if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); break; } case REQUEST_CALLBACK: default: { // clear any previous request errors pRequest->m_dwRequestError = ERR_NOERROR; ((CCommDevice*)lParam)->m_pRequest = NULL; ResetEvent( COMMEVENT); if( pRequest->m_pWindow && ::IsWindow( pRequest->m_pWindow->m_hWnd)) pRequest->m_pWindow->PostMessage( WM_COMM_REQUEST_COMPLETE, 0, (long)pRequest); else if( pRequest->m_pCompleteFunction) (*pRequest->m_pCompleteFunction)( pRequest); break; } } } }