VirtualBox

Ticket #9039: control_clipboard.patch

File control_clipboard.patch, 7.1 KB (added by liucougar, 13 years ago)

proposed patch to add controlvm clipboard sub command

  • src/VBox/Main/include/GuestImpl.h

     
    8181    STDMETHOD(COMSETTER(MemoryBalloonSize)) (ULONG aMemoryBalloonSize);
    8282    STDMETHOD(COMGETTER(StatisticsUpdateInterval)) (ULONG *aUpdateInterval);
    8383    STDMETHOD(COMSETTER(StatisticsUpdateInterval)) (ULONG aUpdateInterval);
     84    STDMETHOD(COMGETTER(ClipboardMode)) (ClipboardMode_T *aClipboardMode);
     85    STDMETHOD(COMSETTER(ClipboardMode)) (ClipboardMode_T aClipboardMode);
    8486
    8587    // IGuest methods
    8688    STDMETHOD(GetFacilityStatus)(AdditionsFacilityType_T aType, LONG64 *aTimestamp, AdditionsFacilityStatus_T *aStatus);
     
    200202    ULONG mStatUpdateInterval;
    201203    ULONG mCurrentGuestStat[GUESTSTATTYPE_MAX];
    202204    BOOL  mfPageFusionEnabled;
     205    ClipboardMode_T mClipboardMode;
    203206
    204207    Console *mParent;
    205208    Data mData;
  • src/VBox/Main/src-client/GuestImpl.cpp

     
    2626#include "Logging.h"
    2727
    2828#include <VBox/VMMDev.h>
     29#include <VBox/HostServices/VBoxClipboardSvc.h>
    2930#ifdef VBOX_WITH_GUEST_CONTROL
    3031# include <VBox/com/array.h>
    3132# include <VBox/com/ErrorInfo.h>
     
    8081    else
    8182        mMemoryBalloonSize = 0;                     /* Default is no ballooning */
    8283
     84    ClipboardMode_T aClipboardMode;
     85    ret = mParent->machine()->COMGETTER(ClipboardMode)(&aClipboardMode);
     86    if (ret == S_OK)
     87        mClipboardMode = aClipboardMode;
     88    else
     89        mClipboardMode = ClipboardMode_Disabled;
     90
    8391    BOOL fPageFusionEnabled;
    8492    ret = mParent->machine()->COMGETTER(PageFusionEnabled)(&fPageFusionEnabled);
    8593    if (ret == S_OK)
     
    304312    return ret;
    305313}
    306314
     315STDMETHODIMP Guest::COMGETTER(ClipboardMode)(ClipboardMode_T *aClipboardMode)
     316{
     317    CheckComArgOutPointerValid(aClipboardMode);
     318
     319    AutoCaller autoCaller(this);
     320    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     321
     322    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     323
     324    *aClipboardMode = mClipboardMode;
     325
     326    return S_OK;
     327}
     328
     329STDMETHODIMP Guest::COMSETTER(ClipboardMode)(ClipboardMode_T aClipboardMode)
     330{
     331    AutoCaller autoCaller(this);
     332    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     333
     334    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     335
     336    /* We must be 100% sure that IMachine::COMSETTER(ClipboardMode)
     337     * does not call us back in any way! */
     338    HRESULT ret = mParent->machine()->COMSETTER(ClipboardMode)(aClipboardMode);
     339    if (ret == S_OK)
     340    {
     341        mClipboardMode = aClipboardMode;
     342        /* forward the information to the VMM device */
     343        VMMDev *pVMMDev = mParent->getVMMDev();
     344        /* MUST release all locks before calling VMM device as its critsect
     345         * has higher lock order than anything in Main. */
     346        alock.release();
     347        if (pVMMDev)
     348        {
     349            VBOXHGCMSVCPARM parm;
     350            parm.type = VBOX_HGCM_SVC_PARM_32BIT;
     351            parm.u.uint32 = mClipboardMode;
     352            pVMMDev->hgcmHostCall("VBoxSharedClipboard", VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE, 1, &parm);
     353        }
     354    }
     355
     356    return ret;
     357}
     358
    307359STDMETHODIMP Guest::COMGETTER(StatisticsUpdateInterval)(ULONG *aUpdateInterval)
    308360{
    309361    CheckComArgOutPointerValid(aUpdateInterval);
  • src/VBox/Main/idl/VirtualBox.xidl

     
    83058305      <desc>Guest system memory balloon size in megabytes (transient property).</desc>
    83068306    </attribute>
    83078307
     8308    <attribute name="clipboardMode" type="unsigned long">
     8309      <desc>
     8310        Synchronization mode between the host OS clipboard
     8311        and the guest OS clipboard
     8312      </desc>
     8313    </attribute>
     8314
    83088315    <attribute name="statisticsUpdateInterval" type="unsigned long">
    83098316      <desc>Interval to update guest statistics in seconds.</desc>
    83108317    </attribute>
  • src/VBox/Main/src-server/MachineImpl.cpp

     
    24382438    return S_OK;
    24392439}
    24402440
     2441/**
     2442 * Set the clipboard mode.
     2443 *
     2444 * This method is also called from IGuest::COMSETTER(ClipboardMode) so
     2445 * we have to make sure that we never call IGuest from here.
     2446 */
    24412447STDMETHODIMP
    24422448Machine::COMSETTER(ClipboardMode)(ClipboardMode_T aClipboardMode)
    24432449{
  • src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

     
    415415                     "                            plugcpu <id>\n"
    416416                     "                            unplugcpu <id>\n"
    417417                     "                            cpuexecutioncap <1-100>\n"
     418                     "                            clipboard disabled|hosttoguest|guesttohost|\n"
     419                     "                                         bidirectional\n"
    418420                     "\n");
    419421    }
    420422
  • src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp

     
    11491149            }
    11501150            RTFileClose(pngFile);
    11511151        }
     1152        else if (!strcmp(a->argv[1], "clipboard"))
     1153        {
     1154            if (a->argc != 3)
     1155            {
     1156                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     1157                rc = E_FAIL;
     1158                break;
     1159            }
     1160            ClipboardMode_T aClipboardMode;
     1161            const char* value = a->argv[2];
     1162            if (!strcmp(value, "disabled"))
     1163            {
     1164                aClipboardMode = ClipboardMode_Disabled;
     1165            }
     1166            else if (!strcmp(value, "hosttoguest"))
     1167            {
     1168                aClipboardMode = ClipboardMode_HostToGuest;
     1169            }
     1170            else if (!strcmp(value, "guesttohost"))
     1171            {
     1172                aClipboardMode = ClipboardMode_GuestToHost;
     1173            }
     1174            else if (!strcmp(value, "bidirectional"))
     1175            {
     1176                aClipboardMode = ClipboardMode_Bidirectional;
     1177            }
     1178            else
     1179            {
     1180                errorArgument("Invalid --clipboard argument '%s'", value);
     1181                rc = E_FAIL;
     1182                break;
     1183            }
     1184
     1185            ComPtr <IGuest> guest;
     1186            rc = console->COMGETTER(Guest)(guest.asOutParam());
     1187            if (SUCCEEDED(rc))
     1188                CHECK_ERROR(guest, COMSETTER(ClipboardMode)(aClipboardMode));
     1189        }
    11521190        else
    11531191        {
    11541192            errorSyntax(USAGE_CONTROLVM, "Invalid parameter '%s'", a->argv[1]);

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