VirtualBox

Changeset 11661 in vbox


Ignore:
Timestamp:
Aug 26, 2008 1:49:29 PM (16 years ago)
Author:
vboxsync
Message:

Modified IKeyboard::PutScancodes to use SafeArray (including webservice)

Location:
trunk/src/VBox
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxBFE/COMDefs.h

    r11659 r11661  
    7474#endif /* !RT_OS_WINDOWS */
    7575
     76#define ComSafeArrayIn(aType, aArg)         unsigned aArg##Size, aType *aArg
     77#define ComSafeArrayInIsNull(aArg)          (aArg == NULL)
     78#define ComSafeArrayInArg(aArg)             aArg##Size, aArg
     79#define ComSafeArrayAsInParam(aArray)   \
     80    (aArray).size(), aArray.raw()
     81
     82
     83namespace com
     84{
     85    template<class T> class SafeArray {
     86        T t;
     87    public:
     88        SafeArray (size_t aSize) {}
     89        SafeArray (ComSafeArrayIn (T, aArg)) {}
     90        T &operator[] (size_t aIdx) { return t; }
     91        size_t size() const { return 0; }
     92        T *raw() { return &t; }
     93    };
     94}
    7695#endif
  • trunk/src/VBox/Frontends/VBoxBFE/KeyboardImpl.cpp

    r11659 r11661  
    2525#else
    2626# include <VBox/com/defs.h>
     27//# include <VBox/com/array.h>
    2728#endif
    2829#include <VBox/pdm.h>
     
    99100 *
    100101 * @returns COM status code
    101  * @param scancodes   Pointer to the first scancode
    102  * @param count       Number of scancodes
     102 * @param scancodes   Safe array of scancodes
    103103 * @param codesStored Address of variable to store the number
    104104 *                    of scancodes that were sent to the keyboard.
    105105                      This value can be NULL.
    106106 */
    107 STDMETHODIMP Keyboard::PutScancodes(LONG *scancodes,
    108                                     ULONG count,
     107STDMETHODIMP Keyboard::PutScancodes(ComSafeArrayIn (LONG, scancodes),
    109108                                    ULONG *codesStored)
    110109{
    111     if (!scancodes)
     110    if (ComSafeArrayInIsNull(scancodes))
    112111        return E_INVALIDARG;
    113112    if (!mpDrv)
    114113        return S_OK;
    115114
    116     LONG *currentScancode = scancodes;
     115    com::SafeArray <LONG> keys(ComSafeArrayInArg(scancodes));
    117116    int rcVBox = VINF_SUCCESS;
    118117
    119     for (uint32_t i = 0; (i < count) && VBOX_SUCCESS(rcVBox); i++, currentScancode++)
    120     {
    121         rcVBox = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, *(uint8_t*)currentScancode);
     118    for (uint32_t i = 0; (i < keys.size()) && VBOX_SUCCESS(rcVBox); i++)
     119    {
     120        rcVBox = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, (uint8_t)keys[i]);
    122121    }
    123122
     
    127126    /// @todo is it actually possible that not all scancodes can be transmitted?
    128127    if (codesStored)
    129         *codesStored = count;
     128        *codesStored = keys.size();
    130129
    131130    return S_OK;
     
    141140STDMETHODIMP Keyboard::PutCAD()
    142141{
    143     static LONG cadSequence[] = {
    144         0x1d, // Ctrl down
    145         0x38, // Alt down
    146         0x53, // Del down
    147         0xd3, // Del up
    148         0xb8, // Alt up
    149         0x9d  // Ctrl up
    150     };
    151 
    152     return PutScancodes (cadSequence, ELEMENTS (cadSequence), NULL);
     142    static com::SafeArray<LONG> cadSequence(6);
     143   
     144    cadSequence[0] = 0x1d; // Ctrl down
     145    cadSequence[1] = 0x38; // Alt down
     146    cadSequence[2] = 0x53; // Del down
     147    cadSequence[3] = 0xd3; // Del up
     148    cadSequence[4] = 0xb8; // Alt up
     149    cadSequence[5] = 0x9d; // Ctrl up
     150
     151    return PutScancodes (ComSafeArrayAsInParam(cadSequence), NULL);
    153152}
    154153
  • trunk/src/VBox/Frontends/VBoxBFE/KeyboardImpl.h

    r11659 r11661  
    4848
    4949    STDMETHOD(PutScancode)(LONG scancode);
    50     STDMETHOD(PutScancodes)(LONG *scancodes,
    51                             ULONG count,
     50    STDMETHOD(PutScancodes)(ComSafeArrayIn (LONG, scancodes),
    5251                            ULONG *codesStored);
    5352    STDMETHOD(PutCAD)();
  • trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp

    r11659 r11661  
    47424742        case SDLK_F10: case SDLK_F11: case SDLK_F12:
    47434743        {
    4744             /* send Ctrl-Alt-Fx to guest */
    4745             static LONG keySequence[] = {
    4746                 0x1d, // Ctrl down
    4747                 0x38, // Alt down
    4748                 0x00, // Fx down (placeholder)
    4749                 0x00, // Fx up (placeholder)
    4750                 0xb8, // Alt up
    4751                 0x9d  // Ctrl up
    4752             };
    4753 
    4754             /* put in the right Fx key */
    4755             keySequence[2] = Keyevent2Keycode(pEv);
    4756             keySequence[3] = keySequence[2] + 0x80;
    4757 
    4758             gKeyboard->PutScancodes(keySequence, ELEMENTS(keySequence), NULL);
     4744            // /* send Ctrl-Alt-Fx to guest */
     4745            com::SafeArray<LONG> keys(6);
     4746           
     4747            keys[0] = 0x1d; // Ctrl down
     4748            keys[1] = 0x38; // Alt down
     4749            keys[2] = Keyevent2Keycode(pEv); // Fx down
     4750            keys[3] = keys[2] + 0x80; // Fx up
     4751            keys[4] = 0xb8; // Alt up
     4752            keys[5] = 0x9d;  // Ctrl up
     4753
     4754            gKeyboard->PutScancodes(ComSafeArrayAsInParam(keys), NULL);
    47594755            return VINF_SUCCESS;
    47604756        }
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleView.cpp

    r11659 r11661  
    13881388                    if (ke->key() >= Key_F1 && ke->key() <= Key_F12)
    13891389                    {
    1390                         LONG combo [6];
     1390                        QValueVector <LONG> combo (6);
    13911391                        combo [0] = 0x1d; /* Ctrl down */
    13921392                        combo [1] = 0x38; /* Alt  down */
     
    14081408
    14091409                        CKeyboard keyboard = mConsole.GetKeyboard();
    1410                         keyboard.PutScancodes (combo, 6);
     1410                        keyboard.PutScancodes (combo);
    14111411                    }
    14121412                    else if (ke->key() == Key_Home)
     
    26152615#endif
    26162616
    2617     keyboard.PutScancodes (codes, count);
     2617    std::vector <LONG> tmp(codes, &codes[count]);
     2618    QValueVector <LONG> scancodes (tmp);
     2619    keyboard.PutScancodes (scancodes);
    26182620
    26192621    /* grab the key from Qt */
     
    31853187                fSentRESEND = true;
    31863188            }
    3187             LONG codes [2];
     3189            QValueVector <LONG> codes (2);
    31883190            codes[0] = 0xE0;
    31893191            codes[1] = i | 0x80;
    3190             keyboard.PutScancodes (codes, 2);
     3192            keyboard.PutScancodes (codes);
    31913193        }
    31923194        mPressedKeys [i] = 0;
     
    32153217    AssertMsg (mAttached, ("Console must be attached"));
    32163218
    3217     LONG codes [2];
     3219    QValueVector <LONG> codes (2);
    32183220    CKeyboard keyboard = mConsole.GetKeyboard();
    32193221    for (uint i = 0; i < SIZEOF_ARRAY (mPressedKeys); ++ i)
     
    32343236            if (!(ns & IsExtKeyPressed))
    32353237                codes [1] |= 0x80;
    3236             keyboard.PutScancodes (codes, 2);
     3238            keyboard.PutScancodes (codes);
    32373239        }
    32383240    }
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxConsoleView.cpp

    r11659 r11661  
    14261426                    if (ke->key() >= Qt::Key_F1 && ke->key() <= Qt::Key_F12)
    14271427                    {
    1428                         LONG combo [6];
     1428                        QVector <LONG> combo (6);
    14291429                        combo [0] = 0x1d; /* Ctrl down */
    14301430                        combo [1] = 0x38; /* Alt  down */
     
    14461446
    14471447                        CKeyboard keyboard = mConsole.GetKeyboard();
    1448                         keyboard.PutScancodes (combo, 6);
     1448                        keyboard.PutScancodes (combo);
    14491449                    }
    14501450                    else if (ke->key() == Qt::Key_Home)
     
    26572657#endif
    26582658
    2659     keyboard.PutScancodes (codes, count);
     2659    std::vector <LONG> scancodes(codes, &codes[count]);
     2660    keyboard.PutScancodes (QVector<LONG>::fromStdVector(scancodes));
    26602661
    26612662    /* grab the key from Qt */
     
    32263227                fSentRESEND = true;
    32273228            }
    3228             LONG codes [2];
     3229            QVector <LONG> codes (2);
    32293230            codes[0] = 0xE0;
    32303231            codes[1] = i | 0x80;
    3231             keyboard.PutScancodes (codes, 2);
     3232            keyboard.PutScancodes (codes);
    32323233        }
    32333234        mPressedKeys [i] = 0;
     
    32563257    AssertMsg (mAttached, ("Console must be attached"));
    32573258
    3258     LONG codes [2];
     3259    QVector <LONG> codes (2);
    32593260    CKeyboard keyboard = mConsole.GetKeyboard();
    32603261    for (uint i = 0; i < SIZEOF_ARRAY (mPressedKeys); ++ i)
     
    32753276            if (!(ns & IsExtKeyPressed))
    32763277                codes [1] |= 0x80;
    3277             keyboard.PutScancodes (codes, 2);
     3278            keyboard.PutScancodes (codes);
    32783279        }
    32793280    }
  • trunk/src/VBox/Main/KeyboardImpl.cpp

    r11659 r11661  
    2525#include "Logging.h"
    2626
     27#include <VBox/com/array.h>
    2728#include <VBox/pdmdrv.h>
    2829#include <iprt/asm.h>
     
    148149                      This value can be NULL.
    149150 */
    150 STDMETHODIMP Keyboard::PutScancodes(LONG *scancodes,
    151                                     ULONG count,
     151STDMETHODIMP Keyboard::PutScancodes(ComSafeArrayIn (LONG, scancodes),
    152152                                    ULONG *codesStored)
    153153{
    154     if (!scancodes)
     154    if (ComSafeArrayInIsNull(scancodes))
    155155        return E_INVALIDARG;
    156156
     
    160160    CHECK_CONSOLE_DRV (mpDrv);
    161161
    162     LONG *currentScancode = scancodes;
     162    com::SafeArray <LONG> keys(ComSafeArrayInArg(scancodes));
    163163    int rcVBox = VINF_SUCCESS;
    164164
    165     for (uint32_t i = 0; (i < count) && VBOX_SUCCESS(rcVBox); i++, currentScancode++)
    166     {
    167         rcVBox = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, *(uint8_t*)currentScancode);
     165    for (uint32_t i = 0; (i < keys.size()) && VBOX_SUCCESS(rcVBox); i++)
     166    {
     167        rcVBox = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, (uint8_t)keys[i]);
    168168    }
    169169
     
    174174    /// @todo is it actually possible that not all scancodes can be transmitted?
    175175    if (codesStored)
    176         *codesStored = count;
     176        *codesStored = keys.size();
    177177
    178178    return S_OK;
     
    188188STDMETHODIMP Keyboard::PutCAD()
    189189{
    190     static LONG cadSequence[] = {
    191         0x1d, // Ctrl down
    192         0x38, // Alt down
    193         0x53, // Del down
    194         0xd3, // Del up
    195         0xb8, // Alt up
    196         0x9d  // Ctrl up
    197     };
    198 
    199     return PutScancodes (cadSequence, ELEMENTS (cadSequence), NULL);
     190    static com::SafeArray<LONG> cadSequence(6);
     191   
     192    cadSequence[0] = 0x1d; // Ctrl down
     193    cadSequence[1] = 0x38; // Alt down
     194    cadSequence[2] = 0x53; // Del down
     195    cadSequence[3] = 0xd3; // Del up
     196    cadSequence[4] = 0xb8; // Alt up
     197    cadSequence[5] = 0x9d; // Ctrl up
     198
     199    return PutScancodes (ComSafeArrayAsInParam(cadSequence), NULL);
    200200}
    201201
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r11659 r11661  
    77077707  <interface
    77087708     name="IKeyboard" extends="$unknown"
    7709      uuid="FD443EC1-000A-4F5B-9282-D72760A66916"
     7709     uuid="2d1a531b-4c6e-49cc-8af6-5c857b78b5d7"
    77107710     wsmap="managed"
    77117711     >
     
    77247724    <method name="putScancodes">
    77257725      <desc>Sends an array of scancode to the keyboard.</desc>
    7726       <param name="scancodes" type="long" dir="in" array="count"/>
    7727       <param name="count" type="unsigned long" dir="in"/>
     7726      <param name="scancodes" type="long" dir="in" safearray="yes"/>
    77287727      <param name="codesStored" type="unsigned long" dir="return"/>
    77297728    </method>
  • trunk/src/VBox/Main/include/KeyboardImpl.h

    r11659 r11661  
    7272
    7373    STDMETHOD(PutScancode)(LONG scancode);
    74     STDMETHOD(PutScancodes)(LONG *scancodes,
    75                             ULONG count,
     74    STDMETHOD(PutScancodes)(ComSafeArrayIn (LONG, scancodes),
    7675                            ULONG *codesStored);
    7776    STDMETHOD(PutCAD)();
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette