SerialPortImpl.cpp revision aa28b72963d5e1c22902b7f4b6066ae806fb919f
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * VirtualBox COM class implementation
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * 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// SerialPort private data definition
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync////////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// constructor / destructor
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// public initializer/uninitializer for internal purposes only
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Initializes the Serial Port object.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param aParent Handle of the parent object.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::init(Machine *aParent, ULONG aSlot)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlowThisFunc(("aParent=%p, aSlot=%d\n", aParent, aSlot));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enclose the state transition NotReady->InInit->Ready */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* m->pPeer is left null */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* initialize data */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Confirm a successful initialization */
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 * @note This object must be destroyed before the original object
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * it shares data with is destroyed.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks @a aThat object for reading.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::init(Machine *aParent, SerialPort *aThat)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlowThisFunc(("aParent=%p, aThat=%p\n", aParent, aThat));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enclose the state transition NotReady->InInit->Ready */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock thatLock(aThat COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Confirm a successful initialization */
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 * @note Locks @a aThat object for reading.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::initCopy(Machine *aParent, SerialPort *aThat)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync LogFlowThisFunc(("aParent=%p, aThat=%p\n", aParent, aThat));
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enclose the state transition NotReady->InInit->Ready */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* pPeer is left null */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AutoReadLock thatLock(aThat COMMA_LOCKVAL_SRC_POS);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Confirm a successful initialization */
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 /* Enclose the state transition Ready->InUninit->NotReady */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// ISerialPort properties
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(Enabled) (BOOL *aEnabled)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(Enabled) (BOOL aEnabled)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(HostMode) (PortMode_T *aHostMode)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(HostMode) (PortMode_T aHostMode)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr ("Cannot set the raw file mode of the serial port %d "
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync "because the file path is empty or null"),
83dc9ca94cd3c31dabc33a35b945de124d43aaeavboxsync tr ("Cannot set the host pipe mode of the serial port %d "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "because the pipe path is empty or null"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr ("Cannot set the host device mode of the serial port %d "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "because the device path is empty or null"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(Slot) (ULONG *aSlot)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(IRQ) (ULONG *aIRQ)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* check IRQ limits
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * (when changing this, make sure it corresponds to XML schema */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "%lu (must be in range [0, %lu])"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(IOBase) (ULONG *aIOBase)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(IOBase)(ULONG aIOBase)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* check IOBase limits
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * (when changing this, make sure it corresponds to XML schema */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr ("Invalid I/O port base address of the serial port %d: "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "%lu (must be in range [0, 0x%X])"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(Path) (BSTR *aPath)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(Path) (IN_BSTR aPath)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* we treat empty as null when e.g. saving to XML, do the same here */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMGETTER(Server) (BOOL *aServer)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncSTDMETHODIMP SerialPort::COMSETTER(Server) (BOOL aServer)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* the machine needs to be mutable */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync Machine::AutoMutableStateDependency adep(m->pMachine);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* leave the lock before informing callbacks */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync// public methods only for internal purposes
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync////////////////////////////////////////////////////////////////////////////////
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Loads settings from the given port node.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * May be called once right after this object creation.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param aPortNode <Port> node.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for writing.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::loadSettings(const settings::SerialPort &data)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // simply copy
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Saves the port settings to the given port node.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Note that the given Port node is comletely empty on input.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @param aPortNode <Port> node.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for reading.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::saveSettings(settings::SerialPort &data)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync // simply copy
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for writing.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync bool changed = false;
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* we need to check all data to see whether anything will be changed
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * after rollback */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for writing, together with the peer object (also
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * for writing) if there is one.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity too */
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 /* attach new data to the peer and reshare it */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * @note Locks this object for writing, together with the peer object
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * represented by @a aThat (locked for reading).
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity too */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* peer is not modified, lock it for reading (aThat is "master" so locked
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * first) */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* this will back up current data */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncvoid SerialPort::applyDefaults (GuestOSType *aOsType)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* sanity */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync uint32_t numSerialEnabled = aOsType->numSerialEnabled();
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync /* Enable port if requested */
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync * Validates COMSETTER(Path) arguments.
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsyncHRESULT SerialPort::checkSetPath(const Utf8Str &str)
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync AssertReturn(isWriteLockOnCurrentThread(), E_FAIL);
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync tr("Path of the serial port %d may not be empty or null in "
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync "host pipe or host device mode"),
1c2c968fd241148110002d75b2c0fdeddc211e14vboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */