VirtualBox

Changeset 14220 in vbox for trunk


Ignore:
Timestamp:
Nov 14, 2008 3:05:30 PM (16 years ago)
Author:
vboxsync
Message:

Additions/VBoxControl: support guestproperty wait

Location:
trunk/src
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxControl/Makefile.kmk

    r12446 r14220  
    2222SUB_DEPTH = ../../../../..
    2323include $(KBUILD_PATH)/subheader.kmk
     24
     25# Include sub-makefile(s).
     26include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk
    2427
    2528#
  • trunk/src/VBox/Additions/common/VBoxControl/VBoxControl.cpp

    r13292 r14220  
    8989    RTPrintf("%s -nologo ...          suppress the logo\n\n", g_pszProgName);
    9090
    91 #ifdef RT_OS_WINDOWS
     91/* Exclude the Windows bits from the test version.  Anyone who needs to test
     92 * them can fix this. */
     93#if defined(RT_OS_WINDOWS) && !defined(VBOX_CONTROL_TEST)
    9294    if ((GET_VIDEO_ACCEL == eWhich) || (USAGE_ALL == eWhich))
    9395        doUsage("\n", g_pszProgName, "getvideoacceleration");
     
    109111        doUsage("set <property> [<value> [-flags <flags>]]\n", g_pszProgName, "guestproperty");
    110112        doUsage("enumerate [-patterns <patterns>]\n", g_pszProgName, "guestproperty");
     113        doUsage("wait <patterns> [-timestamp <last timestamp>]\n", g_pszProgName, "guestproperty");
     114        doUsage("[-timeout <timeout>\n");
    111115    }
    112116#endif
     
    130134}
    131135
    132 #ifdef RT_OS_WINDOWS
     136#if defined(RT_OS_WINDOWS) && !defined(VBOX_CONTROL_TEST)
    133137
    134138LONG (WINAPI * gpfnChangeDisplaySettingsEx)(LPCTSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam);
     
    10941098
    10951099/**
     1100 * Waits for notifications of changes to guest properties.
     1101 * This is accessed through the "VBoxGuestPropSvc" HGCM service.
     1102 *
     1103 * @returns 0 on success, 1 on failure
     1104 * @note see the command line API description for parameters
     1105 */
     1106int waitGuestProperty(int argc, char **argv)
     1107{
     1108    using namespace guestProp;
     1109
     1110    /*
     1111     * Handle arguments
     1112     */
     1113    const char *pszPatterns = NULL;
     1114    uint64_t u64TimestampIn = 0;
     1115    uint32_t u32Timeout = RT_INDEFINITE_WAIT;
     1116    bool usageOK = true;
     1117    if (argc < 1)
     1118        usageOK = false;
     1119    pszPatterns = argv[0];
     1120    for (int i = 1; usageOK && i < argc; ++i)
     1121    {
     1122        if (strcmp(argv[i], "-timeout") == 0)
     1123        {
     1124            if (   i + 1 >= argc
     1125                || RTStrToUInt32Full(argv[i + 1], 10, &u32Timeout)
     1126                       != VINF_SUCCESS
     1127               )
     1128                usageOK = false;
     1129            else
     1130                ++i;
     1131        }
     1132        else if (strcmp(argv[i], "-timestamp") == 0)
     1133        {
     1134            if (   i + 1 >= argc
     1135                || RTStrToUInt64Full(argv[i + 1], 10, &u64TimestampIn)
     1136                       != VINF_SUCCESS
     1137               )
     1138                usageOK = false;
     1139            else
     1140                ++i;
     1141        }
     1142        else
     1143            usageOK = false;
     1144    }
     1145    if (!usageOK)
     1146    {
     1147        usage(GUEST_PROP);
     1148        return 1;
     1149    }
     1150
     1151    /*
     1152     * Connect to the service
     1153     */
     1154    uint32_t u32ClientId = 0;
     1155    int rc = VINF_SUCCESS;
     1156
     1157    rc = VbglR3GuestPropConnect(&u32ClientId);
     1158    if (!RT_SUCCESS(rc))
     1159        VBoxControlError("Failed to connect to the guest property service, error %Rrc\n", rc);
     1160
     1161    /*
     1162     * Retrieve the notification from the host
     1163     */
     1164    char *pszName = NULL;
     1165    char *pszValue = NULL;
     1166    uint64_t u64TimestampOut = 0;
     1167    char *pszFlags = NULL;
     1168    /* The buffer for storing the data and its initial size.  We leave a bit
     1169     * of space here in case the maximum values are raised. */
     1170    void *pvBuf = NULL;
     1171    uint32_t cbBuf = MAX_NAME_LEN + MAX_VALUE_LEN + MAX_FLAGS_LEN + 1024;
     1172    /* Because there is a race condition between our reading the size of a
     1173     * property and the guest updating it, we loop a few times here and
     1174     * hope.  Actually this should never go wrong, as we are generous
     1175     * enough with buffer space. */
     1176    bool finish = false;
     1177    for (unsigned i = 0;
     1178         (RT_SUCCESS(rc) || rc == VERR_BUFFER_OVERFLOW) && !finish && (i < 10);
     1179         ++i)
     1180    {
     1181        void *pvTmpBuf = RTMemRealloc(pvBuf, cbBuf);
     1182        if (NULL == pvTmpBuf)
     1183        {
     1184            rc = VERR_NO_MEMORY;
     1185            VBoxControlError("Out of memory\n");
     1186        }
     1187        else
     1188        {
     1189            pvBuf = pvTmpBuf;
     1190            rc = VbglR3GuestPropWait(u32ClientId, pszPatterns, pvBuf, cbBuf,
     1191                                     u64TimestampIn, u32Timeout,
     1192                                     &pszName, &pszValue, &u64TimestampOut,
     1193                                     &pszFlags, &cbBuf);
     1194        }
     1195        if (VERR_BUFFER_OVERFLOW == rc)
     1196            /* Leave a bit of extra space to be safe */
     1197            cbBuf += 1024;
     1198        else
     1199            finish = true;
     1200        if (rc == VERR_TOO_MUCH_DATA)
     1201            VBoxControlError("Temporarily unable to get a notification\n");
     1202        else if (rc == VERR_INTERRUPTED)
     1203            VBoxControlError("The request timed out or was interrupted\n");
     1204#ifndef RT_OS_WINDOWS  /* Windows guests do not do this right */
     1205        else if (!RT_SUCCESS(rc) && (rc != VERR_NOT_FOUND))
     1206            VBoxControlError("Failed to get a notification, error %Rrc\n", rc);
     1207#endif
     1208    }
     1209/*
     1210 * And display it on the guest console.
     1211 */
     1212    if (VERR_NOT_FOUND == rc)
     1213        RTPrintf("No value set!\n");
     1214    else if (rc == VERR_BUFFER_OVERFLOW)
     1215        RTPrintf("Internal error: unable to determine the size of the data!\n");
     1216    else if (RT_SUCCESS(rc))
     1217    {
     1218        RTPrintf("Name: %s\n", pszName);
     1219        RTPrintf("Value: %s\n", pszValue);
     1220        RTPrintf("Timestamp: %lld ns\n", u64TimestampOut);
     1221        RTPrintf("Flags: %s\n", pszFlags);
     1222    }
     1223
     1224    if (u32ClientId != 0)
     1225        VbglR3GuestPropDisconnect(u32ClientId);
     1226    RTMemFree(pvBuf);
     1227    return RT_SUCCESS(rc) ? 0 : 1;
     1228}
     1229
     1230
     1231/**
    10961232 * Access the guest property store through the "VBoxGuestPropSvc" HGCM
    10971233 * service.
     
    11131249    else if (0 == strcmp(argv[0], "enumerate"))
    11141250        return enumGuestProperty(argc - 1, argv + 1);
     1251    else if (0 == strcmp(argv[0], "wait"))
     1252        return waitGuestProperty(argc - 1, argv + 1);
    11151253    /* else */
    11161254    usage(GUEST_PROP);
     
    11311269} g_commandHandlers[] =
    11321270{
    1133 #ifdef RT_OS_WINDOWS
     1271#if defined(RT_OS_WINDOWS) && !defined(VBOX_CONTROL_TEST)
    11341272    { "getvideoacceleration", handleGetVideoAcceleration },
    11351273    { "setvideoacceleration", handleSetVideoAcceleration },
  • trunk/src/testcase/tstRunTestcases.cpp

    r13836 r14220  
    7272    "testcase/tstTime-3",
    7373    "testcase/tstSeamlessX11",
     74    "testcase/tstVBoxControl",
    7475    "./tstRunTestcases",
    7576    "./tstAnimate",
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