VirtualBox

Ignore:
Timestamp:
Aug 12, 2015 11:33:22 AM (9 years ago)
Author:
vboxsync
Message:

DnD/HostService: Check for bad_alloc, report if host callbacks are missing, logging.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/DragAndDrop/service.cpp

    r55640 r57286  
    371371                            }
    372372                        }
    373                         else
    374                             rc = VERR_NOT_FOUND;
     373                        else /* No host callback in place, so drag and drop is not supported by the host. */
     374                            rc = VERR_NOT_SUPPORTED;
    375375
    376376                        if (RT_FAILURE(rc))
    377377                            rc = m_pManager->nextMessage(u32Function, cParms, paParms);
    378378
    379                         /* Some error occurred? */
    380                         if (   RT_FAILURE(rc)
    381                             && paParms[2].u.uint32) /* Blocking flag set? */
     379                        /* Some error occurred or no (new) messages available? */
     380                        if (RT_FAILURE(rc))
    382381                        {
    383                             /* Defer client returning. */
    384                             rc = VINF_HGCM_ASYNC_EXECUTE;
     382                            if (paParms[2].u.uint32) /* Blocking flag set? */
     383                            {
     384                                /* Defer client returning. */
     385                                rc = VINF_HGCM_ASYNC_EXECUTE;
     386                            }
     387
     388                            LogFlowFunc(("Message queue is empty, returning %Rrc to guest\n", rc));
    385389                        }
    386390                    }
     
    666670                        }
    667671                    }
     672                    else /* No host callback in place, so drag and drop is not supported by the host. */
     673                        rc = VERR_NOT_SUPPORTED;
    668674                }
    669675                break;
     
    679685    if (rc == VINF_HGCM_ASYNC_EXECUTE)
    680686    {
    681         m_clientQueue.append(new HGCM::Client(u32ClientID, callHandle,
    682                                               u32Function, cParms, paParms));
    683     }
    684 
    685     if (   rc != VINF_HGCM_ASYNC_EXECUTE
    686         && m_pHelpers)
    687     {
     687        try
     688        {
     689            LogFlowFunc(("Deferring guest call completion of client ID=%RU32\n", u32ClientID));
     690            m_clientQueue.append(new HGCM::Client(u32ClientID, callHandle,
     691                                                  u32Function, cParms, paParms));
     692        }
     693        catch (std::bad_alloc)
     694        {
     695            rc = VERR_NO_MEMORY;
     696            /* Don't report to guest. */
     697        }
     698    }
     699    else if (m_pHelpers)
     700    {
     701        /* Complete call on guest side. */
    688702        m_pHelpers->pfnCallComplete(callHandle, rc);
    689703    }
     704    else
     705        rc = VERR_NOT_IMPLEMENTED;
    690706
    691707    LogFlowFunc(("Returning rc=%Rrc\n", rc));
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