VirtualBox

Changeset 36249 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 10, 2011 12:18:20 PM (14 years ago)
Author:
vboxsync
Message:

VBoxService/VBoxHeadless: Drop VRDP connection on manual restart / hard VM reset.

Location:
trunk/src/VBox
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.cpp

    r36219 r36249  
    9999        if (RTStrAPrintfV(&pszValue, pszValueFormat, va) >= 0)
    100100        {
    101             if (fFlags & VBOXSERVICEPROPCACHEFLAG_TEMPORARY)
     101            if (fFlags & VBOXSERVICEPROPCACHEFLAG_TRANSIENT)
    102102            {
    103103                /*
     
    118118            }
    119119            else
    120                 rc = VbglR3GuestPropWriteValue(u32ClientId, pszName, pszValue);
     120                rc = VbglR3GuestPropWriteValue(u32ClientId, pszName, pszValue /* No transient flags set */);
    121121            RTStrFree(pszValue);
    122122        }
     
    383383            RTListNodeRemove(&pNode->NodeSucc);
    384384
    385             /*
    386              * When destroying the cache and we have a temporary value, remove the
    387              * (eventually) set TRANSIENT_RESET flag from it so that it doesn't get deleted
    388              * by the host side in order to put the actual reset value in it.
    389              */
    390385            if (pNode->fFlags & VBOXSERVICEPROPCACHEFLAG_TEMPORARY)
    391                 vboxServicePropCacheWritePropF(pCache->uClientID, pNode->pszName, 0 /* Flags, clear all */, pNode->pszValueReset);
     386            {
     387                rc = vboxServicePropCacheWritePropF(pCache->uClientID, pNode->pszName,
     388                                                    pNode->fFlags, pNode->pszValueReset);
     389            }
    392390
    393391            AssertPtr(pNode->pszName);
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.h

    r36178 r36249  
    2424
    2525/** Indicates wheter a guest property is temporary and either should
    26  *  get deleted when
    27  *  - a) the property cache gets destroyed, or
    28  *  - b) the VM gets a hard reset / shutdown
    29  *  or gets a default "reset" value (if specified via VBoxServicePropCacheUpdateEntry)
    30  *  when the property cache gets properly destroyed.
     26 *  - a) get a "reset" value assigned (via VBoxServicePropCacheUpdateEntry)
     27 *       as soon as the property cache gets destroyed, or
     28 *  - b) get deleted when no reset value is specified.
    3129 */
    32 #define VBOXSERVICEPROPCACHEFLAG_TEMPORARY          RT_BIT(1)
     30#define VBOXSERVICEPROPCACHEFLAG_TEMPORARY              RT_BIT(1)
    3331/** Indicates whether a property every time needs to be updated, regardless
    3432 *  if its real value changed or not. */
    35 #define VBOXSERVICEPROPCACHEFLAG_ALWAYS_UPDATE      RT_BIT(2)
     33#define VBOXSERVICEPROPCACHEFLAG_ALWAYS_UPDATE          RT_BIT(2)
     34/** The guest property gets deleted when
     35 *  - a) the property cache gets destroyed, or
     36 *  - b) the VM gets reset / shutdown / destroyed.
     37 */
     38#define VBOXSERVICEPROPCACHEFLAG_TRANSIENT              RT_BIT(3)
    3639
    3740int VBoxServicePropCacheCreate(PVBOXSERVICEVEPROPCACHE pCache, uint32_t uClientId);
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp

    r33554 r36249  
    147147         */
    148148        VBoxServicePropCacheUpdateEntry(&g_VMInfoPropCache, "/VirtualBox/GuestInfo/OS/LoggedInUsersList",
    149                                         VBOXSERVICEPROPCACHEFLAG_TEMPORARY, NULL /* Delete on exit */);
     149                                        VBOXSERVICEPROPCACHEFLAG_TEMPORARY | VBOXSERVICEPROPCACHEFLAG_TRANSIENT, NULL /* Delete on exit */);
    150150        VBoxServicePropCacheUpdateEntry(&g_VMInfoPropCache, "/VirtualBox/GuestInfo/OS/LoggedInUsers",
    151                                         VBOXSERVICEPROPCACHEFLAG_TEMPORARY, "0");
     151                                        VBOXSERVICEPROPCACHEFLAG_TEMPORARY | VBOXSERVICEPROPCACHEFLAG_TRANSIENT, "0");
    152152        VBoxServicePropCacheUpdateEntry(&g_VMInfoPropCache, "/VirtualBox/GuestInfo/OS/NoLoggedInUsers",
    153                                         VBOXSERVICEPROPCACHEFLAG_TEMPORARY, "true");
     153                                        VBOXSERVICEPROPCACHEFLAG_TEMPORARY | VBOXSERVICEPROPCACHEFLAG_TRANSIENT, "true");
    154154        VBoxServicePropCacheUpdateEntry(&g_VMInfoPropCache, "/VirtualBox/GuestInfo/Net/Count",
    155155                                        VBOXSERVICEPROPCACHEFLAG_TEMPORARY | VBOXSERVICEPROPCACHEFLAG_ALWAYS_UPDATE, NULL /* Delete on exit */);
  • trunk/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp

    r35741 r36249  
    208208                    if (fProcessDisconnectOnGuestLogout)
    209209                    {
     210                        bool fDropConnection = false;
     211
    210212                        Bstr value;
    211213                        gpcev->COMGETTER(Value)(value.asOutParam());
     
    216218                            {
    217219                                mfNoLoggedInUsers = true;
    218 
    219                                 /* If there is a connection, drop it. */
    220                                 ComPtr<IVRDEServerInfo> info;
    221                                 hrc = gConsole->COMGETTER(VRDEServerInfo)(info.asOutParam());
    222                                 if (SUCCEEDED(hrc) && info)
    223                                 {
    224                                     ULONG cClients = 0;
    225                                     hrc = info->COMGETTER(NumberOfClients)(&cClients);
    226                                     if (SUCCEEDED(hrc) && cClients > 0)
    227                                     {
    228                                         ComPtr <IVRDEServer> vrdeServer;
    229                                         hrc = machine->COMGETTER(VRDEServer)(vrdeServer.asOutParam());
    230                                         if (SUCCEEDED(hrc) && vrdeServer)
    231                                         {
    232                                             LogRel(("VRDE: the guest user has logged out, disconnecting remote clients.\n"));
    233                                             vrdeServer->COMSETTER(Enabled)(FALSE);
    234                                             vrdeServer->COMSETTER(Enabled)(TRUE);
    235                                         }
    236                                     }
    237                                 }
     220                                fDropConnection = true;
    238221                            }
     222                        }
     223                        /* Guest property got deleted due to hard reset,
     224                         * so it has no value anymore. */
     225                        else if (utf8Value.isEmpty())
     226                        {
     227                            fDropConnection = true;
    239228                        }
    240229                        else
    241230                        {
    242231                            mfNoLoggedInUsers = false;
     232                        }
     233
     234                        if (fDropConnection)
     235                        {
     236                            /* If there is a connection, drop it. */
     237                            ComPtr<IVRDEServerInfo> info;
     238                            hrc = gConsole->COMGETTER(VRDEServerInfo)(info.asOutParam());
     239                            if (SUCCEEDED(hrc) && info)
     240                            {
     241                                ULONG cClients = 0;
     242                                hrc = info->COMGETTER(NumberOfClients)(&cClients);
     243                                if (SUCCEEDED(hrc) && cClients > 0)
     244                                {
     245                                    ComPtr <IVRDEServer> vrdeServer;
     246                                    hrc = machine->COMGETTER(VRDEServer)(vrdeServer.asOutParam());
     247                                    if (SUCCEEDED(hrc) && vrdeServer)
     248                                    {
     249                                        LogRel(("VRDE: the guest user has logged out, disconnecting remote clients.\n"));
     250                                        vrdeServer->COMSETTER(Enabled)(FALSE);
     251                                        vrdeServer->COMSETTER(Enabled)(TRUE);
     252                                    }
     253                                }
     254                            }
    243255                        }
    244256                    }
     
    532544#endif /* VBOX_FFMPEG defined */
    533545
    534 #ifdef RT_OS_WINDOWS 
     546#ifdef RT_OS_WINDOWS
    535547// Required for ATL
    536548static CComModule _Module;
     
    13261338    pVirtualBoxClient.setNull();
    13271339    machine.setNull();
    1328  
     1340
    13291341    com::Shutdown();
    13301342
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