Пример #1
0
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");
}
Пример #2
0
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");
}
Пример #3
0
/******************************************************************************
* 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;
        }
        }
    }
}