VirtualBox

Changeset 100412 in vbox for trunk/src/VBox/GuestHost


Ignore:
Timestamp:
Jul 6, 2023 2:08:30 PM (20 months ago)
Author:
vboxsync
Message:

Shared Clipboard: Windows host service now uses the same way as the Linux host service wrt transfer handling. ​​​bugref:9437

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp

    r100407 r100412  
    188188    AssertReturnVoid(m_lRefCount == 0);
    189189
     190    /* Make sure to release the transfer. */
     191    setTransferLocked(NULL);
     192
    190193    int rc = RTCritSectDelete(&m_CritSect);
    191194    AssertRC(rc);
     
    310313    GlobalFree(hGlobal);
    311314    return VERR_ACCESS_DENIED;
     315}
     316
     317inline int SharedClipboardWinDataObject::lock(void)
     318{
     319    int rc = RTCritSectEnter(&m_CritSect);
     320    AssertRCReturn(rc, rc);
     321
     322    return rc;
     323}
     324
     325inline int SharedClipboardWinDataObject::unlock(void)
     326{
     327    int rc = RTCritSectLeave(&m_CritSect);
     328    AssertRCReturn(rc, rc);
     329
     330    return rc;
    312331}
    313332
     
    675694    AssertPtrReturn(pMedium, DV_E_FORMATETC);
    676695
    677     int rc2 = RTCritSectEnter(&m_CritSect);
    678     AssertRCReturn(rc2, E_UNEXPECTED);
     696    lock();
    679697
    680698    LogFlowFunc(("lIndex=%RI32, enmStatus=%#x\n", pFormatEtc->lindex, m_enmStatus));
     
    702720
    703721                /* Leave lock while requesting + waiting. */
    704                 rc2 = RTCritSectLeave(&m_CritSect);
    705                 AssertRCBreak(rc);
     722                unlock();
    706723
    707724                /* Start the transfer. */
     
    715732                 *       Windows Explorer unresponsive (i.e. "ghost window") when waiting for too long. */
    716733                rc = RTSemEventWait(m_EventStatusChanged, RT_MS_10SEC);
    717                 AssertRCBreak(rc);
    718734
    719735                /* Re-acquire lock. */
    720                 rc = RTCritSectEnter(&m_CritSect);
    721                 AssertRCBreak(rc);
     736                lock();
     737
     738                if (RT_FAILURE(rc))
     739                {
     740                    LogRel(("Shared Clipboard: Waiting for IDataObject status status failed, rc=%Rrc\n", rc));
     741                    break;
     742                }
    722743
    723744                if (m_enmStatus != Running)
     
    757778
    758779                            /* Leave lock while waiting. */
    759                             rc = RTCritSectLeave(&m_CritSect);
    760                             AssertRCReturn(rc, E_UNEXPECTED);
     780                            unlock();
    761781
    762782                            /* Don't block for too long here, as this also will screw other apps running on the OS. */
     
    765785
    766786                            /* Re-acquire lock. */
    767                             rc = RTCritSectEnter(&m_CritSect);
    768                             AssertRCReturn(rc, E_UNEXPECTED);
     787                            lock();
    769788                        }
    770789                    }
     
    847866    }
    848867
    849     rc2 = RTCritSectLeave(&m_CritSect);
    850     AssertRCReturn(rc2, E_UNEXPECTED);
     868    unlock();
    851869
    852870    LogFlowFunc(("hr=%Rhrc\n", hr));
     
    10121030
    10131031/**
    1014  * Assigns a transfer object for the data object.
     1032 * Assigns a transfer object for the data object, internal version.
    10151033 *
    10161034 * @returns VBox status code.
    10171035 * @param   pTransfer           Transfer to assign.
    1018  *                              Must be in started state.
    1019  */
    1020 int SharedClipboardWinDataObject::SetTransfer(PSHCLTRANSFER pTransfer)
    1021 {
    1022     AssertReturn(m_pTransfer == NULL, VERR_WRONG_ORDER); /* Transfer already set? */
    1023 
    1024     int rc = RTCritSectEnter(&m_CritSect);
    1025     if (RT_SUCCESS(rc))
    1026     {
     1036 *                              Must be in INITIALIZED state.
     1037 *                              When set to NULL, the transfer will be released from the object.
     1038 */
     1039int SharedClipboardWinDataObject::setTransferLocked(PSHCLTRANSFER pTransfer)
     1040{
     1041    LogFlowFunc(("pTransfer=%p\n", pTransfer));
     1042
     1043    int rc = VINF_SUCCESS;
     1044
     1045    if (pTransfer) /* Set */
     1046    {
     1047        Assert(m_pTransfer == NULL); /* Transfer already set? */
     1048
    10271049        if (m_enmStatus == Initialized)
    10281050        {
     
    10391061        else
    10401062            AssertFailedStmt(rc = VERR_WRONG_ORDER);
    1041 
    1042         RTCritSectLeave(&m_CritSect);
    1043     }
     1063    }
     1064    else /* Unset */
     1065    {
     1066        if (m_pTransfer)
     1067        {
     1068            ShClTransferRelease(m_pTransfer);
     1069            m_pTransfer = NULL;
     1070        }
     1071    }
     1072
     1073    return rc;
     1074}
     1075
     1076/**
     1077 * Assigns a transfer object for the data object.
     1078 *
     1079 * @returns VBox status code.
     1080 * @param   pTransfer           Transfer to assign.
     1081 *                              Must be in INITIALIZED state.
     1082 *                              When set to NULL, the transfer will be released from the object.
     1083 */
     1084int SharedClipboardWinDataObject::SetTransfer(PSHCLTRANSFER pTransfer)
     1085{
     1086    lock();
     1087
     1088    int rc = setTransferLocked(pTransfer);
     1089
     1090    unlock();
    10441091
    10451092    return rc;
     
    10571104int SharedClipboardWinDataObject::SetStatus(Status enmStatus, int rcSts /* = VINF_SUCCESS */)
    10581105{
    1059     int rc = RTCritSectEnter(&m_CritSect);
    1060     if (RT_SUCCESS(rc))
    1061     {
    1062         rc = setStatusLocked(enmStatus, rcSts);
    1063 
    1064         RTCritSectLeave(&m_CritSect);
    1065     }
    1066 
     1106    lock();
     1107
     1108    int rc = setStatusLocked(enmStatus, rcSts);
     1109
     1110    unlock();
    10671111    return rc;
    10681112}
     
    11411185    RT_NOREF(rc);
    11421186
    1143     int rc2 = RTCritSectEnter(&m_CritSect);
    1144     if (RT_SUCCESS(rc2))
    1145     {
    1146         LogFlowFunc(("enmStatus=%#x (current is: %#x)\n", enmStatus, m_enmStatus));
    1147 
    1148         switch (enmStatus)
    1149         {
    1150             case Completed:
    1151             {
    1152                 LogFlowFunc(("m_uObjIdx=%RU32 (total: %zu)\n", m_uObjIdx, m_lstEntries.size()));
    1153 
    1154                 const bool fComplete = m_uObjIdx == m_lstEntries.size() - 1 /* Object index is zero-based */;
    1155                 if (fComplete)
    1156                     m_enmStatus = Completed;
    1157                 break;
    1158             }
    1159 
    1160             default:
    1161             {
    1162                 m_enmStatus = enmStatus;
    1163                 break;
    1164             }
    1165         }
    1166 
    1167         if (RT_FAILURE(rc))
    1168             LogRel(("Shared Clipboard: Data object received error %Rrc (status %#x)\n", rc, enmStatus));
    1169 
    1170         if (m_EventStatusChanged != NIL_RTSEMEVENT)
    1171             rc2 = RTSemEventSignal(m_EventStatusChanged);
    1172 
    1173         RTCritSectLeave(&m_CritSect);
    1174     }
     1187    LogFlowFunc(("enmStatus=%#x (current is: %#x)\n", enmStatus, m_enmStatus));
     1188
     1189    int rc2 = VINF_SUCCESS;
     1190
     1191    switch (enmStatus)
     1192    {
     1193        case Completed:
     1194        {
     1195            LogFlowFunc(("m_uObjIdx=%RU32 (total: %zu)\n", m_uObjIdx, m_lstEntries.size()));
     1196
     1197            const bool fComplete = m_uObjIdx == m_lstEntries.size() - 1 /* Object index is zero-based */;
     1198            if (fComplete)
     1199                m_enmStatus = Completed;
     1200            break;
     1201        }
     1202
     1203        default:
     1204        {
     1205            m_enmStatus = enmStatus;
     1206            break;
     1207        }
     1208    }
     1209
     1210    if (RT_FAILURE(rc))
     1211        LogRel(("Shared Clipboard: Data object received error %Rrc (status %#x)\n", rc, enmStatus));
     1212
     1213    if (m_EventStatusChanged != NIL_RTSEMEVENT)
     1214        rc2 = RTSemEventSignal(m_EventStatusChanged);
    11751215
    11761216    return rc2;
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