68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync/** @file
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * VirtualBox COM class implementation
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync */
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync/*
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync * Copyright (C) 2014 Oracle Corporation
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync *
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * available from http://www.virtualbox.org. This file is free software;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * you can redistribute it and/or modify it under the terms of the GNU
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * General Public License (GPL) as published by the Free Software
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync */
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync#ifndef ____H_ADDITIONSFACILITYIMPL
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync#define ____H_ADDITIONSFACILITYIMPL
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync#include <vector>
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync#include <iprt/time.h>
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync#include "AdditionsFacilityWrap.h"
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncclass Guest;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncclass ATL_NO_VTABLE AdditionsFacility :
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync public AdditionsFacilityWrap
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync{
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncpublic:
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync DECLARE_EMPTY_CTOR_DTOR(AdditionsFacility)
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync // public initializer/uninitializer for internal purposes only
db4e05173041f696b1362c454bbf7e3a41fbe955vboxsync HRESULT init(Guest *a_pParent, AdditionsFacilityType_T a_enmFacility, AdditionsFacilityStatus_T a_enmStatus,
db4e05173041f696b1362c454bbf7e3a41fbe955vboxsync uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS);
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync void uninit();
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync HRESULT FinalConstruct();
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync void FinalRelease();
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncpublic:
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync /** Facility <-> string mappings. */
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync struct FacilityInfo
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync {
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync /** The facilitie's name. */
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync const char *mName; /* utf-8 */
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync /** The facilitie's type. */
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync AdditionsFacilityType_T mType;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync /** The facilitie's class. */
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync AdditionsFacilityClass_T mClass;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync };
db4e05173041f696b1362c454bbf7e3a41fbe955vboxsync static const FacilityInfo s_aFacilityInfo[8];
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync // public internal methods
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync static const AdditionsFacility::FacilityInfo &i_typeToInfo(AdditionsFacilityType_T aType);
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync AdditionsFacilityClass_T i_getClass() const;
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync LONG64 i_getLastUpdated() const;
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync com::Utf8Str i_getName() const;
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync AdditionsFacilityStatus_T i_getStatus() const;
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync AdditionsFacilityType_T i_getType() const;
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync void i_update(AdditionsFacilityStatus_T a_enmStatus, uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS);
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncprivate:
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync // Wrapped IAdditionsFacility properties
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync HRESULT getClassType(AdditionsFacilityClass_T *aClassType);
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync HRESULT getLastUpdated(LONG64 *aLastUpdated);
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync HRESULT getName(com::Utf8Str &aName);
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync HRESULT getStatus(AdditionsFacilityStatus_T *aStatus);
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync HRESULT getType(AdditionsFacilityType_T *aType);
99ed66b1a390b4f20a1a921c6f8b4d3d2d251adbvboxsync
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync /** A structure for keeping a facility status
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync * set at a certain time. Good for book-keeping. */
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync struct FacilityState
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync {
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync RTTIMESPEC mTimestamp;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync /** The facilitie's current status. */
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync AdditionsFacilityStatus_T mStatus;
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync };
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync struct Data
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync {
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync /** Record of current and previous facility
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync * states, limited to the 10 last states set.
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync * Note: This intentionally only is kept in
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync * Main so far! */
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync std::vector<FacilityState> mStates;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync /** The facilitie's ID/type. */
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync AdditionsFacilityType_T mType;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync } mData;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync};
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync#endif // ____H_ADDITIONSFACILITYIMPL
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync