int UIDnDHandler::dragCheckPending(ulong screenID) { int rc; #ifdef VBOX_WITH_DRAG_AND_DROP_GH LogFlowFunc(("enmOpMode=%RU32, fIsPending=%RTbool, screenID=%RU32\n", m_enmOpMode, m_fIsPending, screenID)); { QMutexLocker AutoReadLock(&m_ReadLock); if ( m_enmOpMode != DNDMODE_UNKNOWN && m_enmOpMode != DNDMODE_GUESTTOHOST) /* Wrong mode set? */ return VINF_SUCCESS; if (m_fIsPending) /* Pending operation is in progress. */ return VINF_SUCCESS; } QMutexLocker AutoWriteLock(&m_WriteLock); m_fIsPending = true; AutoWriteLock.unlock(); /** * How this works: Source is asking the target if there is any DnD * operation pending, when the mouse leaves the guest window. On * return there is some info about a running DnD operation * (or defaultAction is KDnDAction_Ignore if not). With * this information we create a Qt QDrag object with our own QMimeType * implementation and call exec. * * Note: This function *blocks* until the actual drag'n drop operation * has been finished (successfully or not)! */ CGuest guest = m_pSession->guest(); /* Clear our current data set. */ m_dataSource.lstFormats.clear(); m_dataSource.vecActions.clear(); /* Ask the guest if there is a drag and drop operation pending (on the guest). */ QVector<QString> vecFormats; m_dataSource.defaultAction = m_dndSource.DragIsPending(screenID, vecFormats, m_dataSource.vecActions); LogRelMax3(10, ("DnD: Default action is: 0x%x\n", m_dataSource.defaultAction)); LogRelMax3(10, ("DnD: Number of supported guest actions: %d\n", m_dataSource.vecActions.size())); for (int i = 0; i < m_dataSource.vecActions.size(); i++) LogRelMax3(10, ("DnD: \tAction %d: 0x%x\n", i, m_dataSource.vecActions.at(i))); LogRelMax3(10, ("DnD: Number of supported guest formats: %d\n", vecFormats.size())); for (int i = 0; i < vecFormats.size(); i++) { const QString &strFmtGuest = vecFormats.at(i); LogRelMax3(10, ("DnD: \tFormat %d: %s\n", i, strFmtGuest.toUtf8().constData())); } LogFlowFunc(("defaultAction=0x%x, vecFormatsSize=%d, vecActionsSize=%d\n", m_dataSource.defaultAction, vecFormats.size(), m_dataSource.vecActions.size())); if ( m_dataSource.defaultAction != KDnDAction_Ignore && vecFormats.size()) { for (int i = 0; i < vecFormats.size(); i++) { const QString &strFormat = vecFormats.at(i); m_dataSource.lstFormats << strFormat; } rc = VINF_SUCCESS; /* There's a valid pending drag and drop operation on the guest. */ } else /* No format data from the guest arrived yet. */ rc = VERR_NO_DATA; AutoWriteLock.relock(); m_fIsPending = false; AutoWriteLock.unlock(); #else /* !VBOX_WITH_DRAG_AND_DROP_GH */ NOREF(screenID); rc = VERR_NOT_SUPPORTED; #endif /* VBOX_WITH_DRAG_AND_DROP_GH */ LogFlowFuncLeaveRC(rc); return rc; }
void UIDnDHandler::setOpMode(DNDOPMODE enmMode) { QMutexLocker AutoWriteLock(&m_WriteLock); m_enmOpMode = enmMode; LogFunc(("Operation mode is now: %RU32\n", m_enmOpMode)); }
void UIDnDHandler::setMode(DNDMODE enmMode) { QMutexLocker AutoWriteLock(&m_WriteLock); m_enmMode = enmMode; LogFlowFunc(("Mode is now: %RU32\n", m_enmMode)); }