VirtualBox

source: vbox/trunk/src/VBox/Main/FloppyImageImpl.cpp@ 8083

Last change on this file since 8083 was 8083, checked in by vboxsync, 16 years ago

Main: Renamed AutoLock => AutoWriteLock; AutoReaderLock => AutoReadLock.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.3 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
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
18#include "FloppyImageImpl.h"
19#include "VirtualBoxImpl.h"
20#include "Logging.h"
21
22#include <iprt/file.h>
23#include <iprt/path.h>
24#include <iprt/cpputils.h>
25#include <VBox/err.h>
26#include <VBox/param.h>
27
28// constructor / destructor
29/////////////////////////////////////////////////////////////////////////////
30
31DEFINE_EMPTY_CTOR_DTOR (FloppyImage)
32
33HRESULT FloppyImage::FinalConstruct()
34{
35 mAccessible = FALSE;
36 return S_OK;
37}
38
39void FloppyImage::FinalRelease()
40{
41 uninit();
42}
43
44// public initializer/uninitializer for internal purposes only
45/////////////////////////////////////////////////////////////////////////////
46
47/**
48 * Initializes the floppy image object.
49 *
50 * @param aParent
51 * parent object
52 * @param aFilePath
53 * local file system path to the image file
54 * (can be relative to the VirtualBox config dir)
55 * @param aRegistered
56 * whether this object is being initialized by the VirtualBox init code
57 * because it is present in the registry
58 * @param aId
59 * ID of the DVD image to assign
60 *
61 * @return COM result indicator
62 */
63HRESULT FloppyImage::init (VirtualBox *aParent, const BSTR aFilePath,
64 BOOL aRegistered, const Guid &aId)
65{
66 LogFlowThisFunc (("aFilePath={%ls}, aId={%s}\n",
67 aFilePath, aId.toString().raw()));
68
69 ComAssertRet (aParent && aFilePath && !!aId, E_INVALIDARG);
70
71 /* Enclose the state transition NotReady->InInit->Ready */
72 AutoInitSpan autoInitSpan (this);
73 AssertReturn (autoInitSpan.isOk(), E_UNEXPECTED);
74
75 HRESULT rc = S_OK;
76
77 /* share the parent weakly */
78 unconst (mParent) = aParent;
79
80 /* register with parent early, since uninit() will unconditionally
81 * unregister on failure */
82 mParent->addDependentChild (this);
83
84 unconst (mImageFile) = aFilePath;
85 unconst (mUuid) = aId;
86
87 /* get the full file name */
88 char filePathFull [RTPATH_MAX];
89 int vrc = RTPathAbsEx (mParent->homeDir(), Utf8Str (aFilePath),
90 filePathFull, sizeof (filePathFull));
91 if (VBOX_FAILURE (vrc))
92 return setError (E_FAIL, tr ("Invalid image file path: '%ls' (%Vrc)"),
93 aFilePath, vrc);
94
95 unconst (mImageFileFull) = filePathFull;
96 LogFlowThisFunc (("...filePathFull={%ls}\n", mImageFileFull.raw()));
97
98 if (!aRegistered)
99 {
100 /* check whether the given file exists or not */
101 RTFILE file;
102 vrc = RTFileOpen (&file, filePathFull,
103 RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
104 if (VBOX_FAILURE (vrc))
105 {
106 /* here we come when the image was just opened by
107 * IVirtualBox::OpenFloppyImage(). fail in this case */
108 rc = setError (E_FAIL,
109 tr ("Could not open the floppy image '%ls' (%Vrc)"),
110 mImageFileFull.raw(), vrc);
111 }
112 else
113 RTFileClose (file);
114 }
115
116 /* Confirm a successful initialization when it's the case */
117 if (SUCCEEDED (rc))
118 autoInitSpan.setSucceeded();
119
120 return rc;
121}
122
123/**
124 * Uninitializes the instance and sets the ready flag to FALSE.
125 * Called either from FinalRelease() or by the parent when it gets destroyed.
126 */
127void FloppyImage::uninit()
128{
129 LogFlowThisFunc (("\n"));
130
131 /* Enclose the state transition Ready->InUninit->NotReady */
132 AutoUninitSpan autoUninitSpan (this);
133 if (autoUninitSpan.uninitDone())
134 return;
135
136 mParent->removeDependentChild (this);
137
138 unconst (mParent).setNull();
139}
140
141// IFloppyImage properties
142/////////////////////////////////////////////////////////////////////////////
143
144STDMETHODIMP FloppyImage::COMGETTER(Id) (GUIDPARAMOUT aId)
145{
146 if (!aId)
147 return E_POINTER;
148
149 AutoCaller autoCaller (this);
150 CheckComRCReturnRC (autoCaller.rc());
151
152 /* mUuid is constant during life time, no need to lock */
153 mUuid.cloneTo (aId);
154
155 return S_OK;
156}
157
158STDMETHODIMP FloppyImage::COMGETTER(FilePath) (BSTR *aFilePath)
159{
160 if (!aFilePath)
161 return E_POINTER;
162
163 AutoCaller autoCaller (this);
164 CheckComRCReturnRC (autoCaller.rc());
165
166 AutoReadLock alock (this);
167
168 mImageFileFull.cloneTo (aFilePath);
169
170 return S_OK;
171}
172
173STDMETHODIMP FloppyImage::COMGETTER(Accessible) (BOOL *aAccessible)
174{
175 if (!aAccessible)
176 return E_POINTER;
177
178 AutoCaller autoCaller (this);
179 CheckComRCReturnRC (autoCaller.rc());
180
181 AutoWriteLock alock (this);
182
183 HRESULT rc = S_OK;
184
185 /* check whether the given image file exists or not */
186 RTFILE file;
187 int vrc = RTFileOpen (&file, Utf8Str (mImageFileFull),
188 RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
189 if (VBOX_FAILURE (vrc))
190 {
191 Log (("FloppyImage::COMGETTER(Accessible): WARNING: '%ls' "
192 "is not accessible (%Vrc)\n", mImageFileFull.raw(), vrc));
193 mAccessible = FALSE;
194 }
195 else
196 {
197 mAccessible = TRUE;
198 RTFileClose (file);
199 }
200
201 *aAccessible = mAccessible;
202
203 return rc;
204}
205
206STDMETHODIMP FloppyImage::COMGETTER(Size) (ULONG *aSize)
207{
208 if (!aSize)
209 return E_POINTER;
210
211 HRESULT rc = S_OK;
212
213 AutoCaller autoCaller (this);
214 CheckComRCReturnRC (autoCaller.rc());
215
216 AutoReadLock alock (this);
217
218 RTFILE file;
219 int vrc = RTFileOpen (&file, Utf8Str (mImageFileFull),
220 RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
221
222 if (VBOX_FAILURE (vrc))
223 rc = setError (E_FAIL,
224 tr ("Failed to open floppy image '%ls' (%Vrc)\n"),
225 mImageFileFull.raw(), vrc);
226 else
227 {
228 uint64_t u64Size = 0;
229
230 vrc = RTFileGetSize (file, &u64Size);
231
232 if (VBOX_SUCCESS (vrc))
233 *aSize = (ULONG) u64Size;
234 else
235 rc = setError (E_FAIL,
236 tr ("Failed to determine size of floppy image '%ls' (%Vrc)\n"),
237 mImageFileFull.raw(), vrc);
238
239 RTFileClose (file);
240 }
241
242 return rc;
243}
244
245// public methods for internal purposes only
246////////////////////////////////////////////////////////////////////////////////
247
248/**
249 * Changes the stored path values of this image to reflect the new location.
250 * Intended to be called only by VirtualBox::updateSettings() if a machine's
251 * name change causes directory renaming that affects this image.
252 *
253 * @param aNewFullPath new full path to this image file
254 * @param aNewPath new path to this image file relative to the VirtualBox
255 * settings directory (when possible)
256 *
257 * @note Locks this object for writing.
258 */
259void FloppyImage::updatePath (const char *aNewFullPath, const char *aNewPath)
260{
261 AssertReturnVoid (aNewFullPath);
262 AssertReturnVoid (aNewPath);
263
264 AutoCaller autoCaller (this);
265 AssertComRCReturnVoid (autoCaller.rc());
266
267 AutoWriteLock alock (this);
268
269 unconst (mImageFileFull) = aNewFullPath;
270 unconst (mImageFile) = aNewPath;
271}
272
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use