VirtualBox

Changeset 14214

Show
Ignore:
Timestamp:
11/14/08 15:47:38 (2 months ago)
Author:
vboxsync
Message:

Additions/Guest Library: add R3 property wait API

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/include/VBox/HostServices/GuestPropertySvc.h

    r14105 r14214  
    448448typedef struct _GetNotification 
    449449{ 
    450     VBoxGuestHGCMCallInfo hdr; 
     450    VBoxGuestHGCMCallInfoTimeout hdr; 
    451451 
    452452    /** 
  • trunk/include/VBox/VBoxGuest.h

    r14207 r14214  
    759759        type                    = VMMDevHGCMParmType_LinAddr; 
    760760        u.Pointer.size          = cb; 
    761         u.Pointer.u.linearAddr  = (uintptr_t)pv; 
     761        u.Pointer.u.linearAddr  = (VMMDEVHYPPTR32)(uintptr_t)pv; 
    762762    } 
    763763#endif 
     
    16891689VBGLR3DECL(void)    VbglR3GuestPropReadValueFree(char *pszValue); 
    16901690VBGLR3DECL(int)     VbglR3GuestPropEnumRaw(uint32_t u32ClientId, const char *paszPatterns, char *pcBuf, uint32_t cbBuf, uint32_t *pcbBufActual); 
    1691 VBGLR3DECL(int)     VbglR3GuestPropEnum(uint32_t u32ClientId, char const * const *ppaszPatterns, size_t cPatterns, PVBGLR3GUESTPROPENUM *ppHandle, 
     1691VBGLR3DECL(int)     VbglR3GuestPropEnum(uint32_t u32ClientId, char const * const *ppaszPatterns, uint32_t cPatterns, PVBGLR3GUESTPROPENUM *ppHandle, 
    16921692                                        char const **ppszName, char const **ppszValue, uint64_t *pu64Timestamp, char const **ppszFlags); 
    16931693VBGLR3DECL(int)     VbglR3GuestPropEnumNext(PVBGLR3GUESTPROPENUM pHandle, char const **ppszName, char const **ppszValue, uint64_t *pu64Timestamp, 
    16941694                                            char const **ppszFlags); 
    16951695VBGLR3DECL(void)    VbglR3GuestPropEnumFree(PVBGLR3GUESTPROPENUM pHandle); 
    1696 VBGLR3DECL(int)     VbglR3GuestPropDelSet(uint32_t u32ClientId, char const * const *papszPatterns, size_t cPatterns); 
     1696VBGLR3DECL(int)     VbglR3GuestPropDelSet(uint32_t u32ClientId, char const * const *papszPatterns, uint32_t cPatterns); 
    16971697VBGLR3DECL(int)     VbglR3GuestPropWait(uint32_t u32ClientId, const char *pszPatterns, void *pvBuf, uint32_t cbBuf, uint64_t u64Timestamp, uint32_t u32Timeout, char ** ppszName, char **ppszValue, uint64_t *pu64Timestamp, char **ppszFlags, uint32_t *pcbBufActual); 
    16981698/** @}  */ 
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp

    r14209 r14214  
    253253 * @retval  VERR_NOT_FOUND if the key wasn't found. 
    254254 * 
    255  * @param   u32ClientId     The client id returned by VbglR3ClipboardConnect(). 
     255 * @param   u32ClientId     The client id returned by VbglR3GuestPropConnect(). 
    256256 * @param   pszName         The value to read.  Utf8 
    257257 * @param   pvBuf           A scratch buffer to store the data retrieved into. 
     
    349349 *          property value. 
    350350 * 
    351  * @param   u32ClientId     The client id returned by VbglR3ClipboardConnect(). 
     351 * @param   u32ClientId     The client id returned by VbglR3GuestPropConnect(). 
    352352 * @param   pszName         The value to read. Must be valid UTF-8. 
    353353 * @param   ppszValue       Where to store the pointer to the value returned. 
     
    431431 *          needed to hold the value and the value being updated. 
    432432 * 
    433  * @param   u32ClientId     The client id returned by VbglR3ClipboardConnect(). 
     433 * @param   u32ClientId     The client id returned by VbglR3GuestPropConnect(). 
    434434 * @param   pszName         The value to read.  Utf8 
    435435 * @param   pszValue        Where to store the value retrieved. 
     
    556556VBGLR3DECL(int) VbglR3GuestPropEnum(uint32_t u32ClientId, 
    557557                                    char const * const *papszPatterns, 
    558                                     size_t cPatterns, 
     558                                    uint32_t cPatterns, 
    559559                                    PVBGLR3GUESTPROPENUM *ppHandle, 
    560560                                    char const **ppszName, 
     
    577577    RTMemAutoPtr<char> Patterns; 
    578578    Patterns = (char *)RTMemAlloc(cchPatterns); 
    579     size_t iOffs = 0; 
    580     for (size_t i = 0; i < cPatterns; ++i) 
    581     { 
    582         size_t cb = strlen(papszPatterns[i]) + 1; 
     579    uint32_t iOffs = 0; 
     580    for (uint32_t i = 0; i < cPatterns; ++i) 
     581    { 
     582        uint32_t cb = strlen(papszPatterns[i]) + 1; 
    583583        memcpy(&Patterns[iOffs], papszPatterns[i], cb); 
    584584        iOffs += cb; 
     
    754754VBGLR3DECL(int) VbglR3GuestPropDelSet(uint32_t u32ClientId, 
    755755                                      const char * const *papszPatterns, 
    756                                       size_t cPatterns) 
     756                                      uint32_t cPatterns) 
    757757{ 
    758758    PVBGLR3GUESTPROPENUM pHandle; 
     
    785785} 
    786786 
     787 
     788/** 
     789 * Wait for notification of changes to a guest property.  If this is called in 
     790 * a loop, the timestamp of the last notification seen can be passed as a 
     791 * parameter to be sure that no notifications are missed. 
     792 * 
     793 * @returns VBox status code. 
     794 * @retval  VINF_SUCCESS on success, @a ppszName, @a ppszValue, 
     795 *          @a pu64Timestamp and @a ppszFlags containing valid data. 
     796 * @retval  VINF_NOT_FOUND if no previous notification could be found with the 
     797 *          timestamp supplied.  This will normally mean that a large number 
     798 *          of notifications occurred in between. 
     799 * @retval  VERR_BUFFER_OVERFLOW if the scratch buffer @a pvBuf is not large 
     800 *          enough.  In this case the size needed will be placed in 
     801 *          @a pcbBufActual if it is not NULL. 
     802 * @retval  VERR_TIMEOUT if a timeout occurred before a notification was seen. 
     803 * 
     804 * @param   u32ClientId     The client id returned by VbglR3GuestPropConnect(). 
     805 * @param   pszPatterns     The patterns that the property names must matchfor 
     806 *                          the change to be reported. 
     807 * @param   pvBuf           A scratch buffer to store the data retrieved into. 
     808 *                          The returned data is only valid for it's lifetime. 
     809 *                          @a ppszValue will point to the start of this buffer. 
     810 * @param   cbBuf           The size of @a pvBuf 
     811 * @param   u64Timestamp    The timestamp of the last event seen.  Pass zero 
     812 *                          to wait for the next event. 
     813 * @param   u32Timeout      Timeout in milliseconds.  Use RT_INDEFINITE_WAIT 
     814 *                          to wait indefinitely. 
     815 * @param   ppszName        Where to store the pointer to the name retrieved. 
     816 *                          Optional. 
     817 * @param   ppszValue       Where to store the pointer to the value retrieved. 
     818 *                          Optional. 
     819 * @param   pu64Timestamp   Where to store the timestamp.  Optional. 
     820 * @param   ppszFlags       Where to store the pointer to the flags.  Optional. 
     821 * @param   pcbBufActual    If @a pcBuf is not large enough, the size needed. 
     822 *                          Optional. 
     823 */ 
     824VBGLR3DECL(int) VbglR3GuestPropWait(uint32_t u32ClientId, 
     825                                    const char *pszPatterns, 
     826                                    void *pvBuf, uint32_t cbBuf, 
     827                                    uint64_t u64Timestamp, uint32_t u32Timeout, 
     828                                    char ** ppszName, char **ppszValue, 
     829                                    uint64_t *pu64Timestamp, char **ppszFlags, 
     830                                    uint32_t *pcbBufActual) 
     831{ 
     832    /* 
     833     * Create the GET_NOTIFICATION message and call the host. 
     834     */ 
     835    GetNotification Msg; 
     836 
     837    Msg.hdr.u32Timeout = u32Timeout; 
     838    Msg.hdr.info.result = (uint32_t)VERR_WRONG_ORDER;  /** @todo drop the cast when the result type has been fixed! */ 
     839    Msg.hdr.info.u32ClientID = u32ClientId; 
     840    Msg.hdr.info.u32Function = GET_NOTIFICATION; 
     841    Msg.hdr.info.cParms = 4; 
     842    Msg.patterns.SetPtr(const_cast<char *>(pszPatterns), 
     843                        strlen(pszPatterns) + 1); 
     844    Msg.buffer.SetPtr(pvBuf, cbBuf); 
     845    Msg.timestamp.SetUInt64(u64Timestamp); 
     846    Msg.size.SetUInt32(0); 
     847 
     848    int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL_TIMEOUT(sizeof(Msg)), &Msg, sizeof(Msg)); 
     849    if (RT_SUCCESS(rc)) 
     850        rc = Msg.hdr.info.result; 
     851 
     852    /* 
     853     * The cbBufActual parameter is also returned on overflow so the caller can 
     854     * adjust their buffer. 
     855     */ 
     856    if (    rc == VERR_BUFFER_OVERFLOW 
     857        ||  pcbBufActual != NULL) 
     858    { 
     859        int rc2 = Msg.size.GetUInt32(pcbBufActual); 
     860        AssertRCReturn(rc2, RT_FAILURE(rc) ? rc : rc2); 
     861    } 
     862    if (RT_FAILURE(rc)) 
     863        return rc; 
     864 
     865    /* 
     866     * Buffer layout: Name\0Value\0Flags\0. 
     867     * 
     868     * If the caller cares about any of these strings, make sure things are 
     869     * propertly terminated (paranoia). 
     870     */ 
     871    if (    RT_SUCCESS(rc) 
     872        &&  (ppszName != NULL || ppszValue != NULL || ppszFlags != NULL)) 
     873    { 
     874        /* Validate / skip 'Name'. */ 
     875        char *pszValue = (char *)memchr(pvBuf, '\0', cbBuf) + 1; 
     876        AssertPtrReturn(pszValue, VERR_TOO_MUCH_DATA); 
     877        if (ppszName) 
     878            *ppszName = (char *)pvBuf; 
     879 
     880        /* Validate / skip 'Value'. */ 
     881        char *pszFlags = (char *)memchr(pszValue, '\0', 
     882                                        cbBuf - (pszValue - (char *)pvBuf)) + 1; 
     883        AssertPtrReturn(pszFlags, VERR_TOO_MUCH_DATA); 
     884        if (ppszValue) 
     885            *ppszValue = pszValue; 
     886 
     887        if (ppszFlags) 
     888        { 
     889            /* Validate 'Flags'. */ 
     890            void *pvEos = memchr(pszFlags, '\0', cbBuf - (pszFlags - (char *)pvBuf)); 
     891            AssertPtrReturn(pvEos, VERR_TOO_MUCH_DATA); 
     892            *ppszFlags = pszFlags; 
     893        } 
     894    } 
     895 
     896    /* And the timestamp, if requested. */ 
     897    if (pu64Timestamp != NULL) 
     898    { 
     899        rc = Msg.timestamp.GetUInt64(pu64Timestamp); 
     900        AssertRCReturn(rc, rc); 
     901    } 
     902 
     903    return VINF_SUCCESS; 
     904} 
     905 

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy