VirtualBox

Ignore:
Timestamp:
Aug 21, 2013 4:37:27 PM (11 years ago)
Author:
vboxsync
Message:

VBoxService/VBoxTray: User idle detection: Reset usage status to idle when VBoxTray exits, cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp

    r47973 r47977  
    814814    AssertPtrReturn(pCache, VERR_INVALID_POINTER);
    815815    AssertPtrReturn(pszUser, VERR_INVALID_POINTER);
     816    /* pszDomain is optional. */
    816817
    817818    int rc = VINF_SUCCESS;
     
    821822                    VBOXTRAY_IPC_PIPE_PREFIX, pszUser))
    822823    {
     824        bool fReportToHost = false;
     825        VBoxGuestUserState userState = VBoxGuestUserState_Unknown;
     826
    823827        RTLOCALIPCSESSION hSession;
    824828        rc = RTLocalIpcSessionConnect(&hSession, szPipeName, 0 /* Flags */);
     
    839843                && ipcRes.uLastInput != UINT32_MAX)
    840844            {
    841                 VBoxGuestUserState userState = (ipcRes.uLastInput * 1000) < g_uVMInfoUserIdleThresholdMS
    842                                              ? VBoxGuestUserState_InUse
    843                                              : VBoxGuestUserState_Idle;
     845                userState = (ipcRes.uLastInput * 1000) < g_uVMInfoUserIdleThresholdMS
     846                          ? VBoxGuestUserState_InUse
     847                          : VBoxGuestUserState_Idle;
    844848
    845849                rc = vboxServiceUserUpdateF(pCache, pszUser, pszDomain, "UsageState",
     
    852856                 *       new.
    853857                 */
    854                 if (rc == VINF_SUCCESS)
    855                 {
    856                     VBoxServiceVerbose(4, "User \"%s\" (domain \"%s\") is idle for %RU32s\n",
    857                                        pszUser, pszDomain ? pszDomain : "<None>", ipcRes.uLastInput);
     858                fReportToHost = rc == VINF_SUCCESS;
     859                VBoxServiceVerbose(4, "User \"%s\" (domain \"%s\") is idle for %RU32, fReportToHost=%RTbool\n",
     860                                   pszUser, pszDomain ? pszDomain : "<None>", ipcRes.uLastInput, fReportToHost);
    858861
    859862#if 0 /* Do we want to write the idle time as well? */
     
    868871                    if (RT_SUCCESS(rc))
    869872#endif
    870                         rc = VbglR3GuestUserReportState(pszUser, pszDomain, userState,
    871                                                         NULL /* No details */, 0);
    872                 }
    873873            }
    874874#ifdef DEBUG
    875875            else if (ipcRes.uLastInput == UINT32_MAX)
    876                 VBoxServiceVerbose(4, "Last input for user \"%s\" is not available, skipping\n",
     876                VBoxServiceVerbose(4, "Last input for user \"%s\" is not supported, skipping\n",
    877877                                   pszUser, rc);
    878878
     
    889889            {
    890890                case VERR_FILE_NOT_FOUND:
     891                {
    891892                    /* No VBoxTray (or too old version which does not support IPC) running
    892893                       for the given user. Not much we can do then. */
    893                     VBoxServiceVerbose(4, "User \"%s\" not logged in, no last input available\n",
     894                    VBoxServiceVerbose(4, "VBoxTray for user \"%s\" not running (anymore), no last input available\n",
    894895                                       pszUser);
     896
     897                    /* Overwrite rc from above. */
     898                    rc = vboxServiceUserUpdateF(pCache, pszUser, pszDomain,
     899                                                "UsageState", "Idle");
     900
     901                    fReportToHost = rc == VINF_SUCCESS;
     902                    if (fReportToHost)
     903                        userState = VBoxGuestUserState_Idle;
    895904                    break;
     905                }
    896906
    897907                default:
    898                     VBoxServiceVerbose(4, "Error querying last input for user \"%s\", rc=%Rrc\n",
    899                                        pszUser, rc);
     908                    VBoxServiceError("Error querying last input for user \"%s\", rc=%Rrc\n",
     909                                     pszUser, rc);
    900910                    break;
    901911            }
    902 
    903             rc = VINF_SUCCESS;
     912        }
     913
     914        if (fReportToHost)
     915        {
     916            Assert(userState != VBoxGuestUserState_Unknown);
     917            int rc2 = VbglR3GuestUserReportState(pszUser, pszDomain, userState,
     918                                                 NULL /* No details */, 0);
     919            if (RT_FAILURE(rc2))
     920                VBoxServiceError("Error reporting usage state %ld for user \"%s\" to host, rc=%Rrc\n",
     921                                 userState, pszUser, rc2);
     922
     923            if (RT_SUCCESS(rc))
     924                rc = rc2;
    904925        }
    905926    }
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