VirtualBox

Changeset 13356 in vbox for trunk/src


Ignore:
Timestamp:
Oct 16, 2008 6:44:34 PM (16 years ago)
Author:
vboxsync
Message:

Main (Guest Properties): take flag values into account when the machine is not running

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/MachineImpl.cpp

    r13346 r13356  
    27242724}
    27252725
    2726 STDMETHODIMP Machine::GetGuestProperty (INPTR BSTR aKey, BSTR *aValue, ULONG64 *aTimestamp, BSTR *aFlags)
     2726STDMETHODIMP Machine::GetGuestProperty (INPTR BSTR aName, BSTR *aValue, ULONG64 *aTimestamp, BSTR *aFlags)
    27272727{
    27282728#if !defined (VBOX_WITH_GUEST_PROPS)
    27292729    return E_NOTIMPL;
    27302730#else
    2731     if (!VALID_PTR (aKey))
     2731    if (!VALID_PTR (aName))
    27322732        return E_INVALIDARG;
    27332733    if (!VALID_PTR (aValue))
     
    27522752             (it != mHWData->mGuestProperties.end()) && !found; ++it)
    27532753        {
    2754             if (it->mName == aKey)
     2754            if (it->mName == aName)
    27552755            {
     2756                char szFlags[MAX_FLAGS_LEN + 1];
    27562757                it->mValue.cloneTo(aValue);
    27572758                *aTimestamp = it->mTimestamp;
    2758                 it->mFlags.cloneTo(aFlags);
     2759                writeFlags(it->mFlags, szFlags);
     2760                Bstr(szFlags).cloneTo(aFlags);
    27592761                found = true;
    27602762            }
     
    27702772        alock.unlock();
    27712773
    2772         rc = directControl->AccessGuestProperty (aKey, NULL, NULL,
     2774        rc = directControl->AccessGuestProperty (aName, NULL, NULL,
    27732775                                                 false /* isSetter */,
    27742776                                                 aValue, aTimestamp, aFlags);
     
    27782780}
    27792781
    2780 STDMETHODIMP Machine::GetGuestPropertyValue (INPTR BSTR aKey, BSTR *aValue)
     2782STDMETHODIMP Machine::GetGuestPropertyValue (INPTR BSTR aName, BSTR *aValue)
    27812783{
    27822784    ULONG64 dummyTimestamp;
    27832785    BSTR dummyFlags;
    2784     return GetGuestProperty(aKey, aValue, &dummyTimestamp, &dummyFlags);
    2785 }
    2786 
    2787 STDMETHODIMP Machine::GetGuestPropertyTimestamp (INPTR BSTR aKey, ULONG64 *aTimestamp)
     2786    return GetGuestProperty(aName, aValue, &dummyTimestamp, &dummyFlags);
     2787}
     2788
     2789STDMETHODIMP Machine::GetGuestPropertyTimestamp (INPTR BSTR aName, ULONG64 *aTimestamp)
    27882790{
    27892791    BSTR dummyValue;
    27902792    BSTR dummyFlags;
    2791     return GetGuestProperty(aKey, &dummyValue, aTimestamp, &dummyFlags);
     2793    return GetGuestProperty(aName, &dummyValue, aTimestamp, &dummyFlags);
    27922794}
    27932795
     
    27972799    return E_NOTIMPL;
    27982800#else
     2801    using namespace guestProp;
     2802
    27992803    if (!VALID_PTR (aName))
    28002804        return E_INVALIDARG;
     
    28032807    if ((aFlags != NULL) && !VALID_PTR (aFlags))
    28042808        return E_INVALIDARG;
     2809    uint32_t fFlags = NILFLAG;
     2810    if (RT_FAILURE (validateFlags (Utf8Str(aFlags).raw(), &fFlags)))
     2811        return setError (E_INVALIDARG, tr ("Invalid flag values: '%ls'"),
     2812                aFlags);
    28052813
    28062814    AutoCaller autoCaller (this);
     
    28122820    CheckComRCReturnRC (rc);
    28132821
    2814     using namespace guestProp;
    2815     rc = E_FAIL;
     2822    rc = S_OK;
    28162823
    28172824    if (!mHWData->mPropertyServiceActive)
     
    28192826        bool found = false;
    28202827        HWData::GuestProperty property;
    2821         for (HWData::GuestPropertyList::iterator it = mHWData->mGuestProperties.begin();
    2822              (it != mHWData->mGuestProperties.end()) && !found; ++it)
    2823             if (it->mName == aName)
    2824             {
    2825                 property = *it;
    2826                 mHWData.backup();
    2827                 /* The backup() operation invalidates our iterator, so get a
    2828                  * new one. */
    2829                 for (it = mHWData->mGuestProperties.begin();
    2830                      it->mName != aName; ++it)
    2831                     ;
    2832                 mHWData->mGuestProperties.erase(it);
    2833                 found = true;
    2834             }
    2835         if (found)
    2836         {
    2837             if (NULL != aValue)
     2828        property.mFlags = NILFLAG;
     2829        if (fFlags & TRANSIENT)
     2830            rc = setError (E_INVALIDARG, tr ("Cannot set a transient property when the machine is not running"));
     2831        if (SUCCEEDED (rc))
     2832        {
     2833            for (HWData::GuestPropertyList::iterator it = mHWData->mGuestProperties.begin();
     2834                (it != mHWData->mGuestProperties.end()) && !found; ++it)
     2835                if (it->mName == aName)
     2836                {
     2837                    property = *it;
     2838                    if (it->mFlags & (GUESTWRITE | READONLY))
     2839                        rc = setError (E_ACCESSDENIED, tr ("The property '%ls' cannot be changed by the host"), aName);
     2840                    else
     2841                    {
     2842                        mHWData.backup();
     2843                        /* The backup() operation invalidates our iterator, so get a
     2844                        * new one. */
     2845                        for (it = mHWData->mGuestProperties.begin();
     2846                            it->mName != aName; ++it)
     2847                            ;
     2848                        mHWData->mGuestProperties.erase(it);
     2849                    }
     2850                    found = true;
     2851                }
     2852        }
     2853        if (found && SUCCEEDED (rc))
     2854        {
     2855            if (aValue != NULL)
    28382856            {
    28392857                RTTIMESPEC time;
     
    28412859                property.mTimestamp = RTTimeSpecGetNano(RTTimeNow(&time));
    28422860                if (aFlags != NULL)
    2843                     property.mFlags = aFlags;
     2861                    property.mFlags = fFlags;
    28442862                mHWData->mGuestProperties.push_back(property);
    28452863            }
    28462864        }
    2847         else if (aValue != NULL)
     2865        else if (SUCCEEDED (rc) && (aValue != NULL))
    28482866        {
    28492867            RTTIMESPEC time;
     
    28522870            property.mValue = aValue;
    28532871            property.mTimestamp = RTTimeSpecGetNano(RTTimeNow(&time));
    2854             property.mFlags = (aFlags != NULL ? Bstr(aFlags) : Bstr(""));
     2872            property.mFlags = fFlags;
    28552873            mHWData->mGuestProperties.push_back(property);
    28562874        }
    2857         rc = S_OK;
    28582875    }
    28592876    else
     
    30343051             it != propList.end(); ++it)
    30353052        {
     3053             char szFlags[MAX_FLAGS_LEN + 1];
    30363054             it->mName.cloneTo(&names[iProp]);
    30373055             it->mValue.cloneTo(&values[iProp]);
    30383056             timestamps[iProp] = it->mTimestamp;
    3039              it->mFlags.cloneTo(&flags[iProp]);
     3057             writeFlags(it->mFlags, szFlags);
     3058             Bstr(szFlags).cloneTo(&flags[iProp]);
    30403059             ++iProp;
    30413060        }
     
    50205039    }
    50215040
     5041#ifdef VBOX_WITH_GUEST_PROPS
    50225042    /* Guest properties (optional) */
    50235043    {
     5044        using namespace guestProp;
     5045
    50245046        Key guestPropertiesNode = aNode.findKey ("GuestProperties");
    50255047        if (!guestPropertiesNode.isNull())
     
    50295051                 it != properties.end(); ++ it)
    50305052            {
     5053                uint32_t fFlags = NILFLAG;
     5054
    50315055                /* property name (required) */
    50325056                Bstr name = (*it).stringValue ("name");
     
    50375061                /* property flags (optional, defaults to empty) */
    50385062                Bstr flags = (*it).stringValue ("flags");
    5039 
    5040                 HWData::GuestProperty property = { name, value, timestamp, flags };
     5063                validateFlags (Utf8Str (flags).raw(), &fFlags);
     5064                HWData::GuestProperty property = { name, value, timestamp, fFlags };
    50415065                mHWData->mGuestProperties.push_back(property);
    50425066            }
     
    50445068        mHWData->mPropertyServiceActive = false;
    50455069    }
     5070#endif /* VBOX_WITH_GUEST_PROPS defined */
    50465071
    50475072    AssertComRC (rc);
     
    64056430    }
    64066431
     6432#ifdef VBOX_WITH_GUEST_PROPS
    64076433    /* Guest properties */
    64086434    {
     6435        using namespace guestProp;
     6436
    64096437        Key guestPropertiesNode = aNode.createKey ("GuestProperties");
    64106438
     
    64166444
    64176445            Key propertyNode = guestPropertiesNode.appendKey ("GuestProperty");
     6446            char szFlags[MAX_FLAGS_LEN + 1];
    64186447
    64196448            propertyNode.setValue <Bstr> ("name", property.mName);
    64206449            propertyNode.setValue <Bstr> ("value", property.mValue);
    64216450            propertyNode.setValue <ULONG64> ("timestamp", property.mTimestamp);
    6422             propertyNode.setValue <Bstr> ("flags", property.mFlags);
    6423         }
    6424     }
     6451            writeFlags(property.mFlags, szFlags);
     6452            propertyNode.setValue <Bstr> ("flags", Bstr(szFlags));
     6453        }
     6454    }
     6455#endif /* VBOX_WITH_GUEST_PROPS defined */
    64256456
    64266457    AssertComRC (rc);
     
    89769007
    89779008#ifdef VBOX_WITH_GUEST_PROPS
     9009    using namespace guestProp;
     9010
    89789011    AutoCaller autoCaller (this);
    89799012    AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
     
    89959028         it != mHWData->mGuestProperties.end(); ++it)
    89969029    {
     9030        char szFlags[MAX_FLAGS_LEN + 1];
    89979031        it->mName.cloneTo(&names[i]);
    89989032        it->mValue.cloneTo(&values[i]);
    89999033        timestamps[i] = it->mTimestamp;
    9000         it->mFlags.cloneTo(&flags[i]);
     9034        writeFlags(it->mFlags, szFlags);
     9035        Bstr(szFlags).cloneTo(&flags[i]);
    90019036        ++i;
    90029037    }
     
    90089043    return S_OK;
    90099044#else
    9010     return VERR_NOT_IMPLEMENTED;
     9045    return E_NOTIMPL;
    90119046#endif
    90129047}
     
    90209055
    90219056#ifdef VBOX_WITH_GUEST_PROPS
     9057    using namespace guestProp;
     9058
    90229059    AutoCaller autoCaller (this);
    90239060    AssertComRCReturn (autoCaller.rc(), autoCaller.rc());
     
    90529089    for (unsigned i = 0; i < names.size(); ++i)
    90539090    {
    9054         HWData::GuestProperty property = { names[i], values[i], timestamps[i], flags[i] };
     9091        uint32_t fFlags = NILFLAG;
     9092        validateFlags (Utf8Str(flags[i]).raw(), &fFlags);
     9093        HWData::GuestProperty property = { names[i], values[i], timestamps[i], fFlags };
    90559094        mHWData->mGuestProperties.push_back(property);
    90569095    }
     
    90629101    return S_OK;
    90639102#else
    9064     return VERR_NOT_IMPLEMENTED;
     9103    return E_NOTIMPL;
    90659104#endif
    90669105}
     
    90729111
    90739112#ifdef VBOX_WITH_GUEST_PROPS
     9113    using namespace guestProp;
     9114
    90749115    if (!VALID_PTR(aName))
     9116        return E_POINTER;
     9117    if ((aValue != NULL) && (!VALID_PTR(aValue) || !VALID_PTR(aFlags)))
     9118        return E_POINTER;  /* aValue can be NULL to indicate deletion */
     9119
     9120    uint32_t fFlags = NILFLAG;
     9121    if (RT_FAILURE (validateFlags (Utf8Str(aFlags).raw(), &fFlags)))
    90759122        return E_INVALIDARG;
    9076     if ((aValue != NULL) && (!VALID_PTR(aValue) || !VALID_PTR(aFlags)))
    9077         return E_INVALIDARG;  /* aValue can be NULL to indicate deletion */
    90789123
    90799124    AutoCaller autoCaller (this);
     
    90959140    if (aValue != NULL)
    90969141    {
    9097         HWData::GuestProperty property = { aName, aValue, aTimestamp, aFlags };
     9142        HWData::GuestProperty property = { aName, aValue, aTimestamp, fFlags };
    90989143        mHWData->mGuestProperties.push_back(property);
    90999144    }
     
    91059150    return S_OK;
    91069151#else
    9107     return VERR_NOT_IMPLEMENTED;
     9152    return E_NOTIMPL;
    91089153#endif
    91099154}
  • trunk/src/VBox/Main/include/MachineImpl.h

    r13221 r13356  
    240240            ULONG64 mTimestamp;
    241241            /** Property flags */
    242             Bstr mFlags;
     242            ULONG mFlags;
    243243        };
    244244
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