VirtualBox

source: vbox/trunk/src/VBox/Main/MediumAttachmentImpl.cpp@ 25198

Last change on this file since 25198 was 25149, checked in by vboxsync, 15 years ago

Main: cleanup: remove all CheckComRC* macros (no functional change)

File size: 6.9 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2009 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#include "MediumAttachmentImpl.h"
23#include "MachineImpl.h"
24#include "Global.h"
25
26#include "Logging.h"
27
28// constructor / destructor
29/////////////////////////////////////////////////////////////////////////////
30
31DEFINE_EMPTY_CTOR_DTOR(MediumAttachment)
32
33HRESULT MediumAttachment::FinalConstruct()
34{
35 LogFlowThisFunc(("\n"));
36 return S_OK;
37}
38
39void MediumAttachment::FinalRelease()
40{
41 LogFlowThisFuncEnter();
42 uninit();
43 LogFlowThisFuncLeave();
44}
45
46// public initializer/uninitializer for internal purposes only
47/////////////////////////////////////////////////////////////////////////////
48
49/**
50 * Initializes the medium attachment object.
51 *
52 * @param aParent Machine object.
53 * @param aMedium Medium object.
54 * @param aController Controller the hard disk is attached to.
55 * @param aPort Port number.
56 * @param aDevice Device number on the port.
57 * @param aImplicit Wether the attachment contains an implicitly created diff.
58 */
59HRESULT MediumAttachment::init(Machine *aParent,
60 Medium *aMedium,
61 const Bstr &aControllerName,
62 LONG aPort,
63 LONG aDevice,
64 DeviceType_T aType,
65 bool aImplicit /*= false*/)
66{
67 LogFlowThisFuncEnter();
68 LogFlowThisFunc(("aParent=%p aMedium=%p aControllerName=%ls aPort=%d aDevice=%d aType=%d aImplicit=%d\n", aParent, aMedium, aControllerName.raw(), aPort, aDevice, aType, aImplicit));
69
70 if (aType == DeviceType_HardDisk)
71 AssertReturn(aMedium, E_INVALIDARG);
72
73 /* Enclose the state transition NotReady->InInit->Ready */
74 AutoInitSpan autoInitSpan(this);
75 AssertReturn(autoInitSpan.isOk(), E_FAIL);
76
77 unconst(mParent) = aParent;
78
79 m.allocate();
80 m->medium = aMedium;
81 unconst(m->controllerName) = aControllerName;
82 unconst(m->port) = aPort;
83 unconst(m->device) = aDevice;
84 unconst(m->type) = aType;
85 unconst(m->passthrough) = false;
86
87 m->implicit = aImplicit;
88
89 /* Confirm a successful initialization when it's the case */
90 autoInitSpan.setSucceeded();
91
92 /* Construct a short log name for this attachment. */
93 Utf8Str ctlName(aControllerName);
94 const char *psz = strpbrk(ctlName.c_str(), " \t:-");
95 mLogName = Utf8StrFmt("MA%p[%.*s:%u:%u:%s%s]",
96 this,
97 psz ? psz - ctlName.c_str() : 4, ctlName.c_str(),
98 aPort, aDevice, Global::stringifyDeviceType(aType),
99 aImplicit ? ":I" : "");
100
101 LogFlowThisFunc(("LEAVE - %s\n", getLogName()));
102 return S_OK;
103}
104
105/**
106 * Uninitializes the instance.
107 * Called from FinalRelease().
108 */
109void MediumAttachment::uninit()
110{
111 LogFlowThisFunc(("ENTER - %s\n", getLogName()));
112
113 /* Enclose the state transition Ready->InUninit->NotReady */
114 AutoUninitSpan autoUninitSpan(this);
115 if (autoUninitSpan.uninitDone())
116 return;
117
118 m.free();
119
120 unconst(mParent).setNull();
121
122 LogFlowThisFuncLeave();
123}
124
125/**
126 * @note Locks this object for writing.
127 */
128bool MediumAttachment::rollback()
129{
130 LogFlowThisFunc(("ENTER - %s\n", getLogName()));
131
132 /* sanity */
133 AutoCaller autoCaller(this);
134 AssertComRCReturn (autoCaller.rc(), false);
135
136 AutoWriteLock alock(this);
137
138 bool changed = false;
139
140 if (m.isBackedUp())
141 {
142 /* we need to check all data to see whether anything will be changed
143 * after rollback */
144 changed = m.hasActualChanges();
145 m.rollback();
146 }
147
148 LogFlowThisFunc(("LEAVE - %s - returning %RTbool\n", getLogName(), changed));
149 return changed;
150}
151
152/**
153 * @note Locks this object for writing.
154 */
155void MediumAttachment::commit()
156{
157 LogFlowThisFuncEnter();
158
159 /* sanity */
160 AutoCaller autoCaller(this);
161 AssertComRCReturnVoid (autoCaller.rc());
162
163 AutoWriteLock alock(this);
164
165 if (m.isBackedUp())
166 m.commit();
167
168 LogFlowThisFuncLeave();
169}
170
171
172// IHardDiskAttachment properties
173/////////////////////////////////////////////////////////////////////////////
174
175STDMETHODIMP MediumAttachment::COMGETTER(Medium)(IMedium **aHardDisk)
176{
177 LogFlowThisFuncEnter();
178
179 CheckComArgOutPointerValid(aHardDisk);
180
181 AutoCaller autoCaller(this);
182 if (FAILED(autoCaller.rc())) return autoCaller.rc();
183
184 AutoReadLock alock(this);
185
186 m->medium.queryInterfaceTo(aHardDisk);
187
188 LogFlowThisFuncLeave();
189 return S_OK;
190}
191
192STDMETHODIMP MediumAttachment::COMGETTER(Controller)(BSTR *aController)
193{
194 LogFlowThisFuncEnter();
195
196 CheckComArgOutPointerValid(aController);
197
198 AutoCaller autoCaller(this);
199 if (FAILED(autoCaller.rc())) return autoCaller.rc();
200
201 /* m->controller is constant during life time, no need to lock */
202 m->controllerName.cloneTo(aController);
203
204 LogFlowThisFuncLeave();
205 return S_OK;
206}
207
208STDMETHODIMP MediumAttachment::COMGETTER(Port)(LONG *aPort)
209{
210 LogFlowThisFuncEnter();
211
212 CheckComArgOutPointerValid(aPort);
213
214 AutoCaller autoCaller(this);
215 if (FAILED(autoCaller.rc())) return autoCaller.rc();
216
217 /* m->port is constant during life time, no need to lock */
218 *aPort = m->port;
219
220 LogFlowThisFuncLeave();
221 return S_OK;
222}
223
224STDMETHODIMP MediumAttachment::COMGETTER(Device)(LONG *aDevice)
225{
226 LogFlowThisFuncEnter();
227
228 CheckComArgOutPointerValid(aDevice);
229
230 AutoCaller autoCaller(this);
231 if (FAILED(autoCaller.rc())) return autoCaller.rc();
232
233 /* m->device is constant during life time, no need to lock */
234 *aDevice = m->device;
235
236 LogFlowThisFuncLeave();
237 return S_OK;
238}
239
240STDMETHODIMP MediumAttachment::COMGETTER(Type)(DeviceType_T *aType)
241{
242 LogFlowThisFuncEnter();
243
244 CheckComArgOutPointerValid(aType);
245
246 AutoCaller autoCaller(this);
247 if (FAILED(autoCaller.rc())) return autoCaller.rc();
248
249 /* m->type is constant during life time, no need to lock */
250 *aType = m->type;
251
252 LogFlowThisFuncLeave();
253 return S_OK;
254}
255
256STDMETHODIMP MediumAttachment::COMGETTER(Passthrough)(BOOL *aPassthrough)
257{
258 LogFlowThisFuncEnter();
259
260 CheckComArgOutPointerValid(aPassthrough);
261
262 AutoCaller autoCaller(this);
263 if (FAILED(autoCaller.rc())) return autoCaller.rc();
264
265 AutoReadLock lock(this);
266
267 *aPassthrough = m->passthrough;
268
269 LogFlowThisFuncLeave();
270 return S_OK;
271}
272
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use