SerialPortImpl.cpp revision aa28b72963d5e1c22902b7f4b6066ae806fb919f
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/** @file
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VirtualBox COM class implementation
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/*
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * available from http://www.virtualbox.org. This file is free software;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * General Public License (GPL) as published by the Free Software
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * additional information or have any questions.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include "SerialPortImpl.h"
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include "MachineImpl.h"
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include "VirtualBoxImpl.h"
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include "GuestOSTypeImpl.h"
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include "Logging.h"
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include <iprt/string.h>
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include <iprt/cpputils.h>
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync#include <VBox/settings.h>
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync////////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync//
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// SerialPort private data definition
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync//
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync////////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncstruct SerialPort::Data
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Data()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync { }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const ComObjPtr<Machine, ComWeakRef> pMachine;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync const ComObjPtr<SerialPort> pPeer;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Backupable<settings::SerialPort> bd;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync};
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// constructor / destructor
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncDEFINE_EMPTY_CTOR_DTOR (SerialPort)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::FinalConstruct()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncvoid SerialPort::FinalRelease()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync uninit();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// public initializer/uninitializer for internal purposes only
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Initializes the Serial Port object.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param aParent Handle of the parent object.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::init(Machine *aParent, ULONG aSlot)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlowThisFunc(("aParent=%p, aSlot=%d\n", aParent, aSlot));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComAssertRet (aParent, E_INVALIDARG);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enclose the state transition NotReady->InInit->Ready */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoInitSpan autoInitSpan(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m = new Data();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync unconst(m->pMachine) = aParent;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* m->pPeer is left null */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.allocate();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* initialize data */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->ulSlot = aSlot;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Confirm a successful initialization */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync autoInitSpan.setSucceeded();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Initializes the Serial Port object given another serial port object
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * (a kind of copy constructor). This object shares data with
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * the object passed as an argument.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note This object must be destroyed before the original object
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * it shares data with is destroyed.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks @a aThat object for reading.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::init(Machine *aParent, SerialPort *aThat)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlowThisFunc(("aParent=%p, aThat=%p\n", aParent, aThat));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComAssertRet (aParent && aThat, E_INVALIDARG);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enclose the state transition NotReady->InInit->Ready */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoInitSpan autoInitSpan(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m = new Data();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync unconst(m->pMachine) = aParent;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync unconst(m->pPeer) = aThat;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller thatCaller (aThat);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnRC(thatCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock thatLock(aThat COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.share (aThat->m->bd);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Confirm a successful initialization */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync autoInitSpan.setSucceeded();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Initializes the guest object given another guest object
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * (a kind of copy constructor). This object makes a private copy of data
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * of the original object passed as an argument.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks @a aThat object for reading.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::initCopy(Machine *aParent, SerialPort *aThat)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlowThisFunc(("aParent=%p, aThat=%p\n", aParent, aThat));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ComAssertRet (aParent && aThat, E_INVALIDARG);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enclose the state transition NotReady->InInit->Ready */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoInitSpan autoInitSpan(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m = new Data();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync unconst(m->pMachine) = aParent;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* pPeer is left null */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller thatCaller (aThat);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnRC(thatCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock thatLock(aThat COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.attachCopy (aThat->m->bd);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Confirm a successful initialization */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync autoInitSpan.setSucceeded();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Uninitializes the instance and sets the ready flag to FALSE.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Called either from FinalRelease() or by the parent when it gets destroyed.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncvoid SerialPort::uninit()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlowThisFunc(("\n"));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enclose the state transition Ready->InUninit->NotReady */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoUninitSpan autoUninitSpan(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (autoUninitSpan.uninitDone())
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.free();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync unconst(m->pPeer).setNull();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync unconst(m->pMachine).setNull();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync delete m;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m = NULL;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// ISerialPort properties
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(Enabled) (BOOL *aEnabled)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CheckComArgOutPointerValid(aEnabled);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *aEnabled = m->bd->fEnabled;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(Enabled) (BOOL aEnabled)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlowThisFunc(("aEnabled=%RTbool\n", aEnabled));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(adep.rc())) return adep.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd->fEnabled != aEnabled)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.backup();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->fEnabled = aEnabled;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync alock.release();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->pMachine->onSerialPortChange (this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(HostMode) (PortMode_T *aHostMode)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CheckComArgOutPointerValid(aHostMode);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *aHostMode = m->bd->portMode;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(HostMode) (PortMode_T aHostMode)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(adep.rc())) return adep.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync HRESULT rc = S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool emitChangeEvent = false;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd->portMode != aHostMode)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync switch (aHostMode)
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync {
fb1975a6972d89de9e515bed0248db93f04ec9d8vboxsync case PortMode_RawFile:
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync if (m->bd->strPath.isEmpty())
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return setError (E_INVALIDARG,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr ("Cannot set the raw file mode of the serial port %d "
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync "because the file path is empty or null"),
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync m->bd->ulSlot);
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync break;
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync case PortMode_HostPipe:
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync if (m->bd->strPath.isEmpty())
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync return setError (E_INVALIDARG,
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync tr ("Cannot set the host pipe mode of the serial port %d "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "because the pipe path is empty or null"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->ulSlot);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync break;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync case PortMode_HostDevice:
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd->strPath.isEmpty())
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return setError (E_INVALIDARG,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr ("Cannot set the host device mode of the serial port %d "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "because the device path is empty or null"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->ulSlot);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync break;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync case PortMode_Disconnected:
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync break;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.backup();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->portMode = aHostMode;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync emitChangeEvent = true;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (emitChangeEvent)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync alock.release();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->pMachine->onSerialPortChange (this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return rc;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(Slot) (ULONG *aSlot)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CheckComArgOutPointerValid(aSlot);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *aSlot = m->bd->ulSlot;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(IRQ) (ULONG *aIRQ)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CheckComArgOutPointerValid(aIRQ);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *aIRQ = m->bd->ulIRQ;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(IRQ)(ULONG aIRQ)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* check IRQ limits
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * (when changing this, make sure it corresponds to XML schema */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (aIRQ > 255)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return setError (E_INVALIDARG,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr ("Invalid IRQ number of the serial port %d: "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "%lu (must be in range [0, %lu])"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->ulSlot, aIRQ, 255);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(adep.rc())) return adep.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT rc = S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool emitChangeEvent = false;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd->ulIRQ != aIRQ)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.backup();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->ulIRQ = aIRQ;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync emitChangeEvent = true;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (emitChangeEvent)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
46fd1b35e55cbd736b7abe0d856a940f0336eb81vboxsync alock.release();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->pMachine->onSerialPortChange (this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return rc;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(IOBase) (ULONG *aIOBase)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CheckComArgOutPointerValid(aIOBase);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *aIOBase = m->bd->ulIOBase;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(IOBase)(ULONG aIOBase)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* check IOBase limits
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * (when changing this, make sure it corresponds to XML schema */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (aIOBase > 0xFFFF)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return setError (E_INVALIDARG,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr ("Invalid I/O port base address of the serial port %d: "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "%lu (must be in range [0, 0x%X])"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->ulSlot, aIOBase, 0, 0xFFFF);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(adep.rc())) return adep.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT rc = S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool emitChangeEvent = false;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd->ulIOBase != aIOBase)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.backup();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->ulIOBase = aIOBase;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync emitChangeEvent = true;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (emitChangeEvent)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync alock.release();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->pMachine->onSerialPortChange (this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return rc;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(Path) (BSTR *aPath)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CheckComArgOutPointerValid(aPath);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->strPath.cloneTo(aPath);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(Path) (IN_BSTR aPath)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(adep.rc())) return adep.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* we treat empty as null when e.g. saving to XML, do the same here */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (aPath && *aPath == '\0')
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync aPath = NULL;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Utf8Str str(aPath);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (str != m->bd->strPath)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync HRESULT rc = checkSetPath(str);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(rc)) return rc;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.backup();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->strPath = str;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync alock.release();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return m->pMachine->onSerialPortChange(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(Server) (BOOL *aServer)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync CheckComArgOutPointerValid(aServer);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *aServer = m->bd->fServer;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(Server) (BOOL aServer)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(adep.rc())) return adep.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd->fServer != aServer)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.backup();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->fServer = aServer;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync alock.release();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->pMachine->onSerialPortChange (this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// public methods only for internal purposes
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync////////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Loads settings from the given port node.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * May be called once right after this object creation.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param aPortNode <Port> node.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for writing.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::loadSettings(const settings::SerialPort &data)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnRC(autoCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // simply copy
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *m->bd.data() = data;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Saves the port settings to the given port node.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Note that the given Port node is comletely empty on input.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param aPortNode <Port> node.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync *
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for reading.
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::saveSettings(settings::SerialPort &data)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnRC(autoCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // simply copy
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync data = *m->bd.data();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncbool SerialPort::isModified()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return m->bd.isBackedUp();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncbool SerialPort::isReallyModified()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return m->bd.hasActualChanges();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for writing.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncbool SerialPort::rollback()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturn (autoCaller.rc(), false);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool changed = false;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd.isBackedUp())
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* we need to check all data to see whether anything will be changed
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * after rollback */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync changed = m->bd.hasActualChanges();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.rollback();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return changed;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for writing, together with the peer object (also
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * for writing) if there is one.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncvoid SerialPort::commit()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnVoid (autoCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity too */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller peerCaller(m->pPeer);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnVoid(peerCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* lock both for writing since we modify both (pPeer is "master" so locked
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * first) */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoMultiWriteLock2 alock(m->pPeer, this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd.isBackedUp())
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.commit();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->pPeer)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* attach new data to the peer and reshare it */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->pPeer->m->bd.attach(m->bd);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for writing, together with the peer object
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * represented by @a aThat (locked for reading).
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncvoid SerialPort::copyFrom (SerialPort *aThat)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertReturnVoid (aThat != NULL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnVoid (autoCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity too */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller thatCaller (aThat);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnVoid (thatCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* peer is not modified, lock it for reading (aThat is "master" so locked
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * first) */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock rl(aThat COMMA_LOCKVAL_SRC_POS);
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync AutoWriteLock wl(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* this will back up current data */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd.assignCopy (aThat->m->bd);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncvoid SerialPort::applyDefaults (GuestOSType *aOsType)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertReturnVoid (aOsType != NULL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoCaller autoCaller(this);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertComRCReturnVoid (autoCaller.rc());
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync uint32_t numSerialEnabled = aOsType->numSerialEnabled();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enable port if requested */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (m->bd->ulSlot < numSerialEnabled)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync {
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->fEnabled = true;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync }
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/**
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Validates COMSETTER(Path) arguments.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::checkSetPath(const Utf8Str &str)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync{
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertReturn(isWriteLockOnCurrentThread(), E_FAIL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if ( ( m->bd->portMode == PortMode_HostDevice
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync || m->bd->portMode == PortMode_HostPipe
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync || m->bd->portMode == PortMode_RawFile
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync ) && str.isEmpty()
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync )
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return setError(E_INVALIDARG,
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr("Path of the serial port %d may not be empty or null in "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "host pipe or host device mode"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync m->bd->ulSlot);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync return S_OK;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync}
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync