STDMETHODIMP VRDEServer::COMGETTER(AuthLibrary) (BSTR *aLibrary) { CheckComArgOutPointerValid(aLibrary); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); Bstr bstrLibrary; AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); bstrLibrary = mData->mAuthLibrary; alock.release(); if (bstrLibrary.isEmpty()) { /* Get the global setting. */ ComPtr<ISystemProperties> systemProperties; HRESULT hrc = mParent->getVirtualBox()->COMGETTER(SystemProperties)(systemProperties.asOutParam()); if (SUCCEEDED(hrc)) hrc = systemProperties->COMGETTER(VRDEAuthLibrary)(bstrLibrary.asOutParam()); if (FAILED(hrc)) return setError(hrc, "failed to query the library setting\n"); } bstrLibrary.cloneTo(aLibrary); return S_OK; }
HRESULT MachineDebugger::logStringProps(PRTLOGGER pLogger, PFNLOGGETSTR pfnLogGetStr, const char *pszLogGetStr, BSTR *a_pbstrSettings) { /* Make sure the VM is powered up. */ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); Console::SafeVMPtr ptrVM(mParent); HRESULT hrc = ptrVM.rc(); if (FAILED(hrc)) return hrc; /* Make sure we've got a logger. */ if (!pLogger) { Bstr bstrEmpty; bstrEmpty.cloneTo(a_pbstrSettings); return S_OK; } /* Do the job. */ size_t cbBuf = _1K; for (;;) { char *pszBuf = (char *)RTMemTmpAlloc(cbBuf); AssertReturn(pszBuf, E_OUTOFMEMORY); int rc = pfnLogGetStr(pLogger, pszBuf, cbBuf); if (RT_SUCCESS(rc)) { try { Bstr bstrRet(pszBuf); bstrRet.detachTo(a_pbstrSettings); hrc = S_OK; } catch (std::bad_alloc) { hrc = E_OUTOFMEMORY; } RTMemTmpFree(pszBuf); return hrc; } RTMemTmpFree(pszBuf); AssertReturn(rc == VERR_BUFFER_OVERFLOW, setError(VBOX_E_IPRT_ERROR, tr("%s returned %Rrc"), pszLogGetStr, rc)); /* try again with a bigger buffer. */ cbBuf *= 2; AssertReturn(cbBuf <= _256K, setError(E_FAIL, tr("%s returns too much data"), pszLogGetStr)); } }
STDMETHODIMP NetworkAdapter::GetProperty(IN_BSTR aKey, BSTR *aValue) { CheckComArgOutPointerValid(aValue); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); Bstr key = aKey; Bstr value; AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); Utf8Str strKey(key); settings::StringsMap::const_iterator it = mData->mGenericProperties.find(strKey); if (it != mData->mGenericProperties.end()) { value = it->second; // source is a Utf8Str value.cloneTo(aValue); } return S_OK; }
STDMETHODIMP VRDEServer::GetVRDEProperty (IN_BSTR aKey, BSTR *aValue) { CheckComArgOutPointerValid(aValue); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); Bstr key = aKey; Bstr value; AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); Utf8Str strKey(key); settings::StringsMap::const_iterator it = mData->mProperties.find(strKey); if (it != mData->mProperties.end()) value = it->second; // source is a Utf8Str else if (strKey == "TCP/Ports") value = VRDP_DEFAULT_PORT_STR; value.cloneTo(aValue); return S_OK; }
STDMETHODIMP Guest::COMGETTER(AdditionsVersion) (BSTR *aAdditionsVersion) { CheckComArgOutPointerValid(aAdditionsVersion); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); HRESULT hr = S_OK; if ( mData.mAdditionsVersion.isEmpty() /* Only try alternative way if GA are active! */ && mData.mAdditionsRunLevel > AdditionsRunLevelType_None) { /* * If we got back an empty string from GetAdditionsVersion() we either * really don't have the Guest Additions version yet or the guest is running * older Guest Additions (< 3.2.0) which don't provide VMMDevReq_ReportGuestInfo2, * so get the version + revision from the (hopefully) provided guest properties * instead. */ Bstr addVersion; LONG64 u64Timestamp; Bstr flags; hr = mParent->machine()->GetGuestProperty(Bstr("/VirtualBox/GuestAdd/Version").raw(), addVersion.asOutParam(), &u64Timestamp, flags.asOutParam()); if (hr == S_OK) { Bstr addRevision; hr = mParent->machine()->GetGuestProperty(Bstr("/VirtualBox/GuestAdd/Revision").raw(), addRevision.asOutParam(), &u64Timestamp, flags.asOutParam()); if ( hr == S_OK && !addVersion.isEmpty() && !addRevision.isEmpty()) { /* Some Guest Additions versions had interchanged version + revision values, * so check if the version value at least has a dot to identify it and change * both values to reflect the right content. */ if (!Utf8Str(addVersion).contains(".")) { Bstr addTemp = addVersion; addVersion = addRevision; addRevision = addTemp; } Bstr additionsVersion = BstrFmt("%ls r%ls", addVersion.raw(), addRevision.raw()); additionsVersion.cloneTo(aAdditionsVersion); } /** @todo r=bird: else: Should not return failure! */ } else { /* If getting the version + revision above fails or they simply aren't there * because of *really* old Guest Additions we only can report the interface * version to at least have something. */ mData.mInterfaceVersion.cloneTo(aAdditionsVersion); /** @todo r=bird: hr is still indicating failure! */ } } else mData.mAdditionsVersion.cloneTo(aAdditionsVersion); return hr; }