AdditionsFacilityImpl.h revision 2b2d2111baf3a01b7144b5b3ed0b19007bf08a50
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync/** @file
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync * VirtualBox COM class implementation
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync */
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync/*
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync * Copyright (C) 2012 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
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync#include "VirtualBoxBase.h"
2b2d2111baf3a01b7144b5b3ed0b19007bf08a50vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncclass Guest;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncclass ATL_NO_VTABLE AdditionsFacility :
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync public VirtualBoxBase,
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync VBOX_SCRIPTABLE_IMPL(IAdditionsFacility)
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync{
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncpublic:
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(AdditionsFacility, IAdditionsFacility)
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync DECLARE_NOT_AGGREGATABLE(AdditionsFacility)
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync BEGIN_COM_MAP(AdditionsFacility)
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync VBOX_DEFAULT_INTERFACE_ENTRIES(IAdditionsFacility)
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync END_COM_MAP()
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 // IAdditionsFacility properties
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync STDMETHOD(COMGETTER(ClassType))(AdditionsFacilityClass_T *aClass);
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync STDMETHOD(COMGETTER(LastUpdated))(LONG64 *aTimestamp);
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync STDMETHOD(COMGETTER(Name))(BSTR *aName);
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync STDMETHOD(COMGETTER(Status))(AdditionsFacilityStatus_T *aStatus);
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync STDMETHOD(COMGETTER(Type))(AdditionsFacilityType_T *aType);
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
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync static const AdditionsFacility::FacilityInfo &typeToInfo(AdditionsFacilityType_T aType);
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync AdditionsFacilityClass_T getClass() const;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync LONG64 getLastUpdated() const;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync Bstr getName() const;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync AdditionsFacilityStatus_T getStatus() const;
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync AdditionsFacilityType_T getType() const;
db4e05173041f696b1362c454bbf7e3a41fbe955vboxsync void update(AdditionsFacilityStatus_T a_enmStatus, uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS);
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsync
68e0b366071a6dd88182866e8852ec5ec90a8b66vboxsyncprivate:
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