STDMETHODIMP Guest::DragHGMove(ULONG uScreenId, ULONG uX, ULONG uY, DragAndDropAction_T defaultAction, ComSafeArrayIn(DragAndDropAction_T, allowedActions), ComSafeArrayIn(IN_BSTR, formats), DragAndDropAction_T *pResultAction) { /* Input validation */ CheckComArgSafeArrayNotNull(allowedActions); CheckComArgSafeArrayNotNull(formats); CheckComArgOutPointerValid(pResultAction); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); #ifdef VBOX_WITH_DRAG_AND_DROP return m_pGuestDnD->dragHGMove(uScreenId, uX, uY, defaultAction, ComSafeArrayInArg(allowedActions), ComSafeArrayInArg(formats), pResultAction); #else /* VBOX_WITH_DRAG_AND_DROP */ ReturnComNotImplemented(); #endif /* !VBOX_WITH_DRAG_AND_DROP */ }
STDMETHODIMP Session::OnlineMergeMedium(IMediumAttachment *aMediumAttachment, ULONG aSourceIdx, ULONG aTargetIdx, IMedium *aSource, IMedium *aTarget, BOOL aMergeForward, IMedium *aParentForTarget, ComSafeArrayIn(IMedium *, aChildrenToReparent), IProgress *aProgress) { AutoCaller autoCaller(this); AssertComRCReturn(autoCaller.rc(), autoCaller.rc()); if (mState != SessionState_Locked) return setError(VBOX_E_INVALID_VM_STATE, tr("Machine is not locked by session (session state: %s)."), Global::stringifySessionState(mState)); AssertReturn(mType == SessionType_WriteLock, VBOX_E_INVALID_OBJECT_STATE); AssertReturn(mConsole, VBOX_E_INVALID_OBJECT_STATE); CheckComArgNotNull(aMediumAttachment); CheckComArgSafeArrayNotNull(aChildrenToReparent); return mConsole->onlineMergeMedium(aMediumAttachment, aSourceIdx, aTargetIdx, aSource, aTarget, aMergeForward, aParentForTarget, ComSafeArrayInArg(aChildrenToReparent), aProgress); }
STDMETHODIMP Guest::DragGHPending(ULONG uScreenId, ComSafeArrayOut(BSTR, formats), ComSafeArrayOut(DragAndDropAction_T, allowedActions), DragAndDropAction_T *pDefaultAction) { /* Input validation */ CheckComArgSafeArrayNotNull(formats); CheckComArgSafeArrayNotNull(allowedActions); CheckComArgOutPointerValid(pDefaultAction); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); #if defined(VBOX_WITH_DRAG_AND_DROP) && defined(VBOX_WITH_DRAG_AND_DROP_GH) return m_pGuestDnD->dragGHPending(uScreenId, ComSafeArrayOutArg(formats), ComSafeArrayOutArg(allowedActions), pDefaultAction); #else /* VBOX_WITH_DRAG_AND_DROP */ ReturnComNotImplemented(); #endif /* !VBOX_WITH_DRAG_AND_DROP */ }
STDMETHODIMP EventSource::RegisterListener(IEventListener * aListener, ComSafeArrayIn(VBoxEventType_T, aInterested), BOOL aActive) { CheckComArgNotNull(aListener); CheckComArgSafeArrayNotNull(aInterested); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); { AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); Listeners::const_iterator it = m->mListeners.find(aListener); if (it != m->mListeners.end()) return setError(E_INVALIDARG, tr("This listener already registered")); com::SafeArray<VBoxEventType_T> interested(ComSafeArrayInArg (aInterested)); RecordHolder<ListenerRecord> lrh(new ListenerRecord(aListener, interested, aActive, this)); m->mListeners.insert(Listeners::value_type(aListener, lrh)); } VBoxEventDesc evDesc; evDesc.init(this, VBoxEventType_OnEventSourceChanged, aListener, TRUE); evDesc.fire(0); return S_OK; }
STDMETHODIMP GuestFile::WriteAt(LONG64 aOffset, ComSafeArrayIn(BYTE, aData), ULONG aTimeoutMS, ULONG *aWritten) { #ifndef VBOX_WITH_GUEST_CONTROL ReturnComNotImplemented(); #else LogFlowThisFuncEnter(); CheckComArgSafeArrayNotNull(aData); CheckComArgOutPointerValid(aWritten); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); HRESULT hr = S_OK; com::SafeArray<BYTE> data(ComSafeArrayInArg(aData)); int vrc = writeData(aTimeoutMS, data.raw(), (uint32_t)data.size(), (uint32_t*)aWritten); if (RT_FAILURE(vrc)) { switch (vrc) { default: hr = setError(VBOX_E_IPRT_ERROR, tr("Writing %zubytes to file \"%s\" (at offset %RU64) failed: %Rrc"), data.size(), mData.mOpenInfo.mFileName.c_str(), aOffset, vrc); break; } } LogFlowFuncLeaveRC(vrc); return hr; #endif /* VBOX_WITH_GUEST_CONTROL */ }
STDMETHODIMP VFSExplorer::Exists(ComSafeArrayIn(IN_BSTR, aNames), ComSafeArrayOut(BSTR, aExists)) { CheckComArgSafeArrayNotNull(aNames); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); com::SafeArray<IN_BSTR> sfaNames(ComSafeArrayInArg(aNames)); std::list<BSTR> listExists; for (size_t a=0; a < sfaNames.size(); ++a) { std::list<VFSExplorer::Data::DirEntry>::const_iterator it; for (it = m->entryList.begin(); it != m->entryList.end(); ++it) { const VFSExplorer::Data::DirEntry &entry = (*it); if (entry.name == RTPathFilename(Utf8Str(sfaNames[a]).c_str())) { BSTR name; Bstr tmp(sfaNames[a]); /* gcc-3.3 cruft */ tmp.cloneTo(&name); listExists.push_back(name); } } } com::SafeArray<BSTR> sfaExists(listExists); sfaExists.detachTo(ComSafeArrayOutArg(aExists)); return S_OK; }
STDMETHODIMP Guest::DragGHGetData(ComSafeArrayOut(BYTE, data)) { /* Input validation */ CheckComArgSafeArrayNotNull(data); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); #if defined(VBOX_WITH_DRAG_AND_DROP) && defined(VBOX_WITH_DRAG_AND_DROP_GH) return m_pGuestDnD->dragGHGetData(ComSafeArrayOutArg(data)); #else /* VBOX_WITH_DRAG_AND_DROP */ ReturnComNotImplemented(); #endif /* !VBOX_WITH_DRAG_AND_DROP */ }
STDMETHODIMP VFSExplorer::Remove(ComSafeArrayIn(IN_BSTR, aNames), IProgress **aProgress) { CheckComArgSafeArrayNotNull(aNames); CheckComArgOutPointerValid(aProgress); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); HRESULT rc = S_OK; com::SafeArray<IN_BSTR> sfaNames(ComSafeArrayInArg(aNames)); ComObjPtr<Progress> progress; try { /* Create the progress object */ progress.createObject(); rc = progress->init(mVirtualBox, static_cast<IVFSExplorer*>(this), Bstr(tr("Delete files")).raw(), TRUE /* aCancelable */); if (FAILED(rc)) throw rc; /* Initialize our worker task */ std::auto_ptr<TaskVFSExplorer> task(new TaskVFSExplorer(TaskVFSExplorer::Delete, this, progress)); /* Add all filenames to delete as task data */ for (size_t a=0; a < sfaNames.size(); ++a) task->filenames.push_back(Utf8Str(sfaNames[a])); rc = task->startThread(); if (FAILED(rc)) throw rc; /* Don't destruct on success */ task.release(); } catch (HRESULT aRC) { rc = aRC; } if (SUCCEEDED(rc)) /* Return progress to the caller */ progress.queryInterfaceTo(aProgress); return rc; }
STDMETHODIMP Guest::DragHGPutData(ULONG uScreenId, IN_BSTR bstrFormat, ComSafeArrayIn(BYTE, data), IProgress **ppProgress) { /* Input validation */ CheckComArgStrNotEmptyOrNull(bstrFormat); CheckComArgSafeArrayNotNull(data); CheckComArgOutPointerValid(ppProgress); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); #ifdef VBOX_WITH_DRAG_AND_DROP return m_pGuestDnD->dragHGPutData(uScreenId, bstrFormat, ComSafeArrayInArg(data), ppProgress); #else /* VBOX_WITH_DRAG_AND_DROP */ ReturnComNotImplemented(); #endif /* !VBOX_WITH_DRAG_AND_DROP */ }