void Hotel::addGuest(const int guestType, const std::string & name) { Guest* guest = new Guest(name, guestType); mGuests.push_back(guest); attach(guest->Impl(), guestType); (guest->Impl())->setSbj(this); }
/** * Update the guest additions capabilities. * This is called when the guest additions capabilities change. The new capabilities * are given and the connector should update its internal state. * * @param pInterface Pointer to this interface. * @param newCapabilities New capabilities. * @thread The emulation thread. */ DECLCALLBACK(void) vmmdevUpdateGuestCapabilities(PPDMIVMMDEVCONNECTOR pInterface, uint32_t newCapabilities) { PDRVMAINVMMDEV pDrv = RT_FROM_MEMBER(pInterface, DRVMAINVMMDEV, Connector); AssertPtr(pDrv); Console *pConsole = pDrv->pVMMDev->getParent(); /* store that information in IGuest */ Guest* pGuest = pConsole->i_getGuest(); AssertPtrReturnVoid(pGuest); /* * Report our current capabilities (and assume none is active yet). */ pGuest->i_setSupportedFeatures(newCapabilities); /* * Tell the Display, so that it can update the "supports graphics" * capability if the graphics card has not asserted it. */ Display* pDisplay = pConsole->i_getDisplay(); AssertPtrReturnVoid(pDisplay); pDisplay->i_handleUpdateVMMDevSupportsGraphics(RT_BOOL(newCapabilities & VMMDEV_GUEST_SUPPORTS_GRAPHICS)); /* * Tell the console interface about the event * so that it can notify its consumers. */ pConsole->i_onAdditionsStateChange(); }
/** * Notification that the ride is being removed. * @param ri Ride being removed. */ void Guests::NotifyRideDeletion(const RideInstance *ri) { for (int i = 0; i < GUEST_BLOCK_SIZE; i++) { Guest *p = this->block.Get(i); if (!p->IsActive()) continue; p->NotifyRideDeletion(ri); } }
/** * Update #free_idx to the next free guest (if available). * @return Whether a free guest was found. */ bool Guests::FindNextFreeGuest() { while (this->free_idx < GUEST_BLOCK_SIZE) { Guest *g = this->block.Get(this->free_idx); if (!g->IsActive()) return true; this->free_idx++; } return false; }
/** * Count the number of active guests. * @return The number of active guests. */ uint Guests::CountActiveGuests() { uint count = this->free_idx; for (uint i = this->free_idx; i < GUEST_BLOCK_SIZE; i++) { Guest *g = this->block.Get(i); if (g->IsActive()) count++; } return count; }
/** * Count the number of guests in the park. * @return The number of guests in the park. */ uint Guests::CountGuestsInPark() { uint count = 0; for (uint i = 0; i < GUEST_BLOCK_SIZE; i++) { Guest *g = this->block.Get(i); if (g->IsActive() && g->IsInPark()) count++; } return count; }
/* static */ void Guest::staticUpdateStats(RTTIMERLR hTimerLR, void *pvUser, uint64_t iTick) { AssertReturnVoid(pvUser != NULL); Guest *guest = static_cast<Guest *>(pvUser); Assert(guest->mMagic == GUEST_MAGIC); if (guest->mMagic == GUEST_MAGIC) guest->updateStats(iTick); NOREF(hTimerLR); }
/** * Some time has passed, update the animation. * @param delay Number of milliseconds time that have past since the last animation update. */ void Guests::OnAnimate(int delay) { for (int i = 0; i < GUEST_BLOCK_SIZE; i++) { Guest *p = this->block.Get(i); if (!p->IsActive()) continue; AnimateResult ar = p->OnAnimate(delay); if (ar != OAR_OK) { p->DeActivate(ar); this->AddFree(p); } } }
/** * @interface_method_impl{PDMIVMMDEVCONNECTOR,pfnUpdateGuestStatus} */ DECLCALLBACK(void) vmmdevUpdateGuestStatus(PPDMIVMMDEVCONNECTOR pInterface, uint32_t uFacility, uint16_t uStatus, uint32_t fFlags, PCRTTIMESPEC pTimeSpecTS) { PDRVMAINVMMDEV pDrv = RT_FROM_MEMBER(pInterface, DRVMAINVMMDEV, Connector); Console *pConsole = pDrv->pVMMDev->getParent(); /* Store that information in IGuest */ Guest* guest = pConsole->i_getGuest(); AssertPtrReturnVoid(guest); guest->i_setAdditionsStatus((VBoxGuestFacilityType)uFacility, (VBoxGuestFacilityStatus)uStatus, fFlags, pTimeSpecTS); pConsole->i_onAdditionsStateChange(); }
/** Deactivate all guests and reset variables. */ void Guests::Uninitialize() { for (int i = 0; i < GUEST_BLOCK_SIZE; i++) { Guest *g = this->block.Get(i); if (g->IsActive()) { g->DeActivate(OAR_REMOVE); this->AddFree(g); } } this->start_voxel.x = -1; this->start_voxel.y = -1; this->daily_frac = 0; this->next_daily_index = 0; }
/** * @interface_method_impl{PDMIVMMDEVCONNECTOR,pfnUpdateGuestStatus} */ DECLCALLBACK(void) vmmdevUpdateGuestStatus(PPDMIVMMDEVCONNECTOR pInterface, uint32_t uFacility, uint16_t uStatus, uint32_t fFlags, PCRTTIMESPEC pTimeSpecTS) { PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); Console *pConsole = pDrv->pVMMDev->getParent(); /* Store that information in IGuest */ Guest* guest = pConsole->getGuest(); Assert(guest); if (!guest) return; guest->setAdditionsStatus((VBoxGuestFacilityType)uFacility, (VBoxGuestFacilityStatus)uStatus, fFlags, pTimeSpecTS); pConsole->onAdditionsStateChange(); }
/** * Query the current page fusion setting * * @returns VBox status code. * @param pInterface Pointer to this interface. * @param pfPageFusionEnabled Pointer to boolean * @thread The emulation thread. */ DECLCALLBACK(int) vmmdevIsPageFusionEnabled(PPDMIVMMDEVCONNECTOR pInterface, bool *pfPageFusionEnabled) { PDRVMAINVMMDEV pDrv = RT_FROM_MEMBER(pInterface, DRVMAINVMMDEV, Connector); Console *pConsole = pDrv->pVMMDev->getParent(); BOOL val = 0; if (!pfPageFusionEnabled) return VERR_INVALID_POINTER; /* store that information in IGuest */ Guest* guest = pConsole->i_getGuest(); AssertPtrReturn(guest, VERR_GENERAL_FAILURE); *pfPageFusionEnabled = !!guest->i_isPageFusionEnabled(); return VINF_SUCCESS; }
/** * Reports Guest Additions API and OS version. * * Called whenever the Additions issue a guest version report request or the VM * is reset. * * @param pInterface Pointer to this interface. * @param guestInfo Pointer to guest information structure. * @thread The emulation thread. */ DECLCALLBACK(void) vmmdevUpdateGuestInfo(PPDMIVMMDEVCONNECTOR pInterface, const VBoxGuestInfo *guestInfo) { PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); Assert(guestInfo); if (!guestInfo) return; Console *pConsole = pDrv->pVMMDev->getParent(); /* Store that information in IGuest */ Guest* guest = pConsole->getGuest(); Assert(guest); if (!guest) return; if (guestInfo->interfaceVersion != 0) { char version[16]; RTStrPrintf(version, sizeof(version), "%d", guestInfo->interfaceVersion); guest->setAdditionsInfo(Bstr(version), guestInfo->osType); /* * Tell the console interface about the event * so that it can notify its consumers. */ pConsole->onAdditionsStateChange(); if (guestInfo->interfaceVersion < VMMDEV_VERSION) pConsole->onAdditionsOutdated(); } else { /* * The guest additions was disabled because of a reset * or driver unload. */ guest->setAdditionsInfo(Bstr(), guestInfo->osType); /* Clear interface version + OS type. */ /** @todo Would be better if GuestImpl.cpp did all this in the above method call * while holding down the. */ guest->setAdditionsInfo2(0, "", 0, 0); /* Clear Guest Additions version. */ RTTIMESPEC TimeSpecTS; RTTimeNow(&TimeSpecTS); guest->setAdditionsStatus(VBoxGuestFacilityType_All, VBoxGuestFacilityStatus_Inactive, 0 /*fFlags*/, &TimeSpecTS); pConsole->onAdditionsStateChange(); } }
/** * A new day arrived, handle daily chores of the park. * @todo Add popularity rating concept. */ void Guests::OnNewDay() { /* Try adding a new guest to the park. */ if (this->CountActiveGuests() >= _scenario.max_guests) return; if (!this->rnd.Success1024(_scenario.GetSpawnProbability(512))) return; if (!IsGoodEdgeRoad(this->start_voxel.x, this->start_voxel.y)) { /* New guest, but no road. */ this->start_voxel = FindEdgeRoad(); if (!IsGoodEdgeRoad(this->start_voxel.x, this->start_voxel.y)) return; } if (!this->HasFreeGuests()) return; // No more quests available. /* New guest! */ Guest *g = this->GetFree(); g->Activate(this->start_voxel, PERSON_GUEST); }
/** A new frame arrived, perform the daily call for some of the guests. */ void Guests::DoTick() { this->daily_frac++; int end_index = std::min(this->daily_frac * GUEST_BLOCK_SIZE / TICK_COUNT_PER_DAY, GUEST_BLOCK_SIZE); while (this->next_daily_index < end_index) { Guest *p = this->block.Get(this->next_daily_index); if (p->IsActive() && !p->DailyUpdate()) { p->DeActivate(OAR_REMOVE); this->AddFree(p); } this->next_daily_index++; } if (this->next_daily_index >= GUEST_BLOCK_SIZE) { this->daily_frac = 0; this->next_daily_index = 0; } }
/** * @interface_method_impl{PDMIVMMDEVCONNECTOR,pfnUpdateGuestUserState} */ DECLCALLBACK(void) vmmdevUpdateGuestUserState(PPDMIVMMDEVCONNECTOR pInterface, const char *pszUser, const char *pszDomain, uint32_t uState, const uint8_t *puDetails, uint32_t cbDetails) { PDRVMAINVMMDEV pDrv = RT_FROM_MEMBER(pInterface, DRVMAINVMMDEV, Connector); AssertPtr(pDrv); Console *pConsole = pDrv->pVMMDev->getParent(); AssertPtr(pConsole); /* Store that information in IGuest. */ Guest* pGuest = pConsole->i_getGuest(); AssertPtrReturnVoid(pGuest); pGuest->i_onUserStateChange(Bstr(pszUser), Bstr(pszDomain), (VBoxGuestUserState)uState, puDetails, cbDetails); }
/** * Query the current balloon size * * @returns VBox status code. * @param pInterface Pointer to this interface. * @param pcbBalloon Balloon size * @thread The emulation thread. */ DECLCALLBACK(int) vmmdevQueryBalloonSize(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pcbBalloon) { PDRVMAINVMMDEV pDrv = RT_FROM_MEMBER(pInterface, DRVMAINVMMDEV, Connector); Console *pConsole = pDrv->pVMMDev->getParent(); ULONG val = 0; if (!pcbBalloon) return VERR_INVALID_POINTER; /* store that information in IGuest */ Guest* guest = pConsole->i_getGuest(); AssertPtrReturn(guest, VERR_GENERAL_FAILURE); guest->COMGETTER(MemoryBalloonSize)(&val); *pcbBalloon = val; return VINF_SUCCESS; }
/** * Save guests to the save game. * @param svr Output stream to save to. */ void Guests::Save(Saver &svr) { svr.StartBlock("GSTS", 1); svr.PutWord(this->start_voxel.x); svr.PutWord(this->start_voxel.y); svr.PutWord(this->daily_frac); svr.PutWord(this->next_daily_index); svr.PutLong(this->free_idx); svr.PutLong(this->CountActiveGuests()); for (uint i = 0; i < GUEST_BLOCK_SIZE; i++) { Guest *g = this->block.Get(i); if (g->IsActive()) { svr.PutWord(g->id); g->Save(svr); } } svr.EndBlock(); }
/** * Query the current page fusion setting * * @returns VBox status code. * @param pInterface Pointer to this interface. * @param pfPageFusionEnabled Pointer to boolean * @thread The emulation thread. */ DECLCALLBACK(int) vmmdevIsPageFusionEnabled(PPDMIVMMDEVCONNECTOR pInterface, bool *pfPageFusionEnabled) { PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); Console *pConsole = pDrv->pVMMDev->getParent(); BOOL val = 0; if (!pfPageFusionEnabled) return VERR_INVALID_POINTER; /* store that information in IGuest */ Guest* guest = pConsole->getGuest(); Assert(guest); if (!guest) return VERR_GENERAL_FAILURE; *pfPageFusionEnabled = !!guest->isPageFusionEnabled(); return VINF_SUCCESS; }
/** * Load guests from the save game. * @param ldr Input stream to read. */ void Guests::Load(Loader &ldr) { uint32 version = ldr.OpenBlock("GSTS"); if (version == 1) { this->start_voxel.x = ldr.GetWord(); this->start_voxel.y = ldr.GetWord(); this->daily_frac = ldr.GetWord(); this->next_daily_index = ldr.GetWord(); this->free_idx = ldr.GetLong(); uint active_guest_count = ldr.GetLong(); for (uint i = 0; i < active_guest_count; i++) { Guest *g = this->block.Get(ldr.GetWord()); g->Load(ldr); } } else { ldr.SetFailMessage("Incorrect version of Guests block."); } ldr.CloseBlock(); }
/** * Request the statistics interval * * @returns VBox status code. * @param pInterface Pointer to this interface. * @param pulInterval Pointer to interval in seconds * @thread The emulation thread. */ DECLCALLBACK(int) vmmdevQueryStatisticsInterval(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pulInterval) { PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); Console *pConsole = pDrv->pVMMDev->getParent(); ULONG val = 0; if (!pulInterval) return VERR_INVALID_POINTER; /* store that information in IGuest */ Guest* guest = pConsole->getGuest(); Assert(guest); if (!guest) return VERR_GENERAL_FAILURE; guest->COMGETTER(StatisticsUpdateInterval)(&val); *pulInterval = val; return VINF_SUCCESS; }
/** * @interface_method_impl{PDMIVMMDEVCONNECTOR,pfnUpdateGuestInfo2} */ DECLCALLBACK(void) vmmdevUpdateGuestInfo2(PPDMIVMMDEVCONNECTOR pInterface, uint32_t uFullVersion, const char *pszName, uint32_t uRevision, uint32_t fFeatures) { PDRVMAINVMMDEV pDrv = RT_FROM_MEMBER(pInterface, DRVMAINVMMDEV, Connector); AssertPtr(pszName); Assert(uFullVersion); /* Store that information in IGuest. */ Guest *pGuest = pDrv->pVMMDev->getParent()->i_getGuest(); AssertPtrReturnVoid(pGuest); /* Just pass it on... */ pGuest->i_setAdditionsInfo2(uFullVersion, pszName, uRevision, fFeatures); /* * No need to tell the console interface about the update; * vmmdevUpdateGuestInfo takes care of that when called as the * last event in the chain. */ }
/** * Report new guest statistics * * @returns VBox status code. * @param pInterface Pointer to this interface. * @param pGuestStats Guest statistics * @thread The emulation thread. */ DECLCALLBACK(int) vmmdevReportStatistics(PPDMIVMMDEVCONNECTOR pInterface, VBoxGuestStatistics *pGuestStats) { PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); Console *pConsole = pDrv->pVMMDev->getParent(); Assert(pGuestStats); if (!pGuestStats) return VERR_INVALID_POINTER; /* store that information in IGuest */ Guest* guest = pConsole->getGuest(); Assert(guest); if (!guest) return VERR_GENERAL_FAILURE; if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_IDLE) guest->setStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUIDLE, pGuestStats->u32CpuLoad_Idle); if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_KERNEL) guest->setStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUKERNEL, pGuestStats->u32CpuLoad_Kernel); if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_USER) guest->setStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUUSER, pGuestStats->u32CpuLoad_User); /** @todo r=bird: Convert from 4KB to 1KB units? * CollectorGuestHAL::getGuestMemLoad says it returns KB units to * preCollect(). I might be wrong ofc, this is convoluted code... */ if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_TOTAL) guest->setStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMTOTAL, pGuestStats->u32PhysMemTotal); if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_AVAIL) guest->setStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMFREE, pGuestStats->u32PhysMemAvail); if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_BALLOON) guest->setStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMBALLOON, pGuestStats->u32PhysMemBalloon); if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_MEM_SYSTEM_CACHE) guest->setStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMCACHE, pGuestStats->u32MemSystemCache); if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PAGE_FILE_SIZE) guest->setStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_PAGETOTAL, pGuestStats->u32PageFileSize); return VINF_SUCCESS; }
/** * Update the guest additions capabilities. * This is called when the guest additions capabilities change. The new capabilities * are given and the connector should update its internal state. * * @param pInterface Pointer to this interface. * @param newCapabilities New capabilities. * @thread The emulation thread. */ DECLCALLBACK(void) vmmdevUpdateGuestCapabilities(PPDMIVMMDEVCONNECTOR pInterface, uint32_t newCapabilities) { PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); AssertPtr(pDrv); Console *pConsole = pDrv->pVMMDev->getParent(); /* store that information in IGuest */ Guest* pGuest = pConsole->getGuest(); AssertPtr(pGuest); if (!pGuest) return; /* * Report our current capabilities (and assume none is active yet). */ pGuest->setSupportedFeatures(newCapabilities); /* * Tell the console interface about the event * so that it can notify its consumers. */ pConsole->onAdditionsStateChange(); }
bool Seat::hasGuest(const Guest &guest) const { return (this->m_guest->getId() == guest.getId()); }