Exemple #1
0
BOOL AeroSubClassChild(HWND hwnd, WNDPROC pWndProc, DWORD dwAddFlags, PAERO_SUBCLASS_WND_DATA pWndParentAeroData)
{
    if(!hwnd || !pWndProc || !pWndParentAeroData)
    {
        SetLastError(ERROR_INVALID_PARAMETER);        
        return FALSE;
    }


    PAERO_SUBCLASS_WND_DATA pControlSubclassWndData = (PAERO_SUBCLASS_WND_DATA)GetProp(hwnd, WINDOW_DATA_STRING);
    if(pControlSubclassWndData)
    {
        SetLastError(ERROR_ALREADY_INITIALIZED);
        return FALSE;
    }



    pControlSubclassWndData = (PAERO_SUBCLASS_WND_DATA)LocalAlloc(LPTR, sizeof(AERO_SUBCLASS_WND_DATA));
    if(!pControlSubclassWndData)
        return FALSE;   // use the LocalAlloc last error

    memcpy(pControlSubclassWndData, pWndParentAeroData, sizeof(AERO_SUBCLASS_WND_DATA));
    pControlSubclassWndData->m_dwFlags |= dwAddFlags;

    pControlSubclassWndData->m_dwSelFirst = pControlSubclassWndData->m_dwSelLast = (DWORD) -1;


    CLocalFreeData ctrlData(pControlSubclassWndData);

    if(!SetProp(hwnd, WINDOW_DATA_STRING, pControlSubclassWndData))
        return FALSE;   // use the SetProp last error

    pControlSubclassWndData->m_oldWndProc = (WNDPROC) SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) pWndProc);
    
    if(!pControlSubclassWndData->m_oldWndProc)
    {
        DWORD dwLastError = GetLastError();
        VERIFY(pControlSubclassWndData==RemoveProp(hwnd, WINDOW_DATA_STRING));
        SetLastError(dwLastError);
        return FALSE;
    }

    ctrlData.Clear();
    
    return TRUE;
}
Exemple #2
0
/* 01-0f    =   non-zero HRSLT  */
byte USB::ctrlReq( byte addr, byte ep, byte bmReqType, byte bRequest, byte wValLo, byte wValHi, unsigned int wInd, unsigned int nbytes, char* dataptr, unsigned int nak_limit )
{
    boolean direction = false;     //request direction, IN or OUT
    byte rcode;
    SETUP_PKT setup_pkt;

    regWr( rPERADDR, addr );                    //set peripheral address
    if( bmReqType & 0x80 ) {
        direction = true;                       //determine request direction
    }
    /* fill in setup packet */
    setup_pkt.ReqType_u.bmRequestType = bmReqType;
    setup_pkt.bRequest = bRequest;
    setup_pkt.wVal_u.wValueLo = wValLo;
    setup_pkt.wVal_u.wValueHi = wValHi;
    setup_pkt.wIndex = wInd;
    setup_pkt.wLength = nbytes;
    bytesWr( rSUDFIFO, 8, ( char *)&setup_pkt );    //transfer to setup packet FIFO
    rcode = dispatchPkt( tokSETUP, ep, nak_limit );            //dispatch packet
    //Serial.println("Setup packet");   //DEBUG
    if( rcode ) {                                   //return HRSLT if not zero
        Serial.print("Setup packet error: ");
        Serial.print( rcode, HEX );
        return( rcode );
    }
    //Serial.println( direction, HEX );
    if( dataptr != NULL ) {                         //data stage, if present
        rcode = ctrlData( addr, ep, nbytes, dataptr, direction );
    }
    if( rcode ) {   //return error
        Serial.print("Data packet error: ");
        Serial.print( rcode, HEX );
        return( rcode );
    }
    rcode = ctrlStatus( ep, direction );                //status stage
    return( rcode );
}