VirtualBox

source: vbox/trunk/src/VBox/Main/SharedFolderImpl.cpp@ 26169

Last change on this file since 26169 was 25860, checked in by vboxsync, 15 years ago

Main: cleanup: get rid of VirtualBoxBaseProto, move AutoCaller*/*Span* classes out of VirtualBoxBaseProto class scope and into separate header; move CombinedProgress into separate header (it's only used by Console any more)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.8 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2007 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 "SharedFolderImpl.h"
23#include "VirtualBoxImpl.h"
24#include "MachineImpl.h"
25#include "ConsoleImpl.h"
26
27#include "AutoCaller.h"
28#include "Logging.h"
29
30#include <iprt/param.h>
31#include <iprt/cpp/utils.h>
32#include <iprt/path.h>
33
34// constructor / destructor
35/////////////////////////////////////////////////////////////////////////////
36
37SharedFolder::SharedFolder()
38 : mParent (NULL)
39{
40}
41
42SharedFolder::~SharedFolder()
43{
44}
45
46HRESULT SharedFolder::FinalConstruct()
47{
48 return S_OK;
49}
50
51void SharedFolder::FinalRelease()
52{
53 uninit();
54}
55
56// public initializer/uninitializer for internal purposes only
57/////////////////////////////////////////////////////////////////////////////
58
59/**
60 * Initializes the shared folder object.
61 *
62 * @param aMachine parent Machine object
63 * @param aName logical name of the shared folder
64 * @param aHostPath full path to the shared folder on the host
65 * @param aWritable writable if true, readonly otherwise
66 *
67 * @return COM result indicator
68 */
69HRESULT SharedFolder::init (Machine *aMachine,
70 CBSTR aName, CBSTR aHostPath, BOOL aWritable)
71{
72 /* Enclose the state transition NotReady->InInit->Ready */
73 AutoInitSpan autoInitSpan(this);
74 AssertReturn(autoInitSpan.isOk(), E_FAIL);
75
76 unconst(mMachine) = aMachine;
77
78 HRESULT rc = protectedInit(aMachine, aName, aHostPath, aWritable);
79
80 /* Confirm a successful initialization when it's the case */
81 if (SUCCEEDED(rc))
82 autoInitSpan.setSucceeded();
83
84 return rc;
85}
86
87/**
88 * Initializes the shared folder object given another object
89 * (a kind of copy constructor). This object makes a private copy of data
90 * of the original object passed as an argument.
91 *
92 * @param aMachine parent Machine object
93 * @param aThat shared folder object to copy
94 *
95 * @return COM result indicator
96 */
97HRESULT SharedFolder::initCopy (Machine *aMachine, SharedFolder *aThat)
98{
99 ComAssertRet (aThat, E_INVALIDARG);
100
101 /* Enclose the state transition NotReady->InInit->Ready */
102 AutoInitSpan autoInitSpan(this);
103 AssertReturn(autoInitSpan.isOk(), E_FAIL);
104
105 unconst(mMachine) = aMachine;
106
107 HRESULT rc = protectedInit (aMachine, aThat->m.name,
108 aThat->m.hostPath, aThat->m.writable);
109
110 /* Confirm a successful initialization when it's the case */
111 if (SUCCEEDED(rc))
112 autoInitSpan.setSucceeded();
113
114 return rc;
115}
116
117/**
118 * Initializes the shared folder object.
119 *
120 * @param aConsole Console parent object
121 * @param aName logical name of the shared folder
122 * @param aHostPath full path to the shared folder on the host
123 * @param aWritable writable if true, readonly otherwise
124 *
125 * @return COM result indicator
126 */
127HRESULT SharedFolder::init(Console *aConsole,
128 CBSTR aName, CBSTR aHostPath, BOOL aWritable)
129{
130 /* Enclose the state transition NotReady->InInit->Ready */
131 AutoInitSpan autoInitSpan(this);
132 AssertReturn(autoInitSpan.isOk(), E_FAIL);
133
134 unconst(mConsole) = aConsole;
135
136 HRESULT rc = protectedInit(aConsole, aName, aHostPath, aWritable);
137
138 /* Confirm a successful initialization when it's the case */
139 if (SUCCEEDED(rc))
140 autoInitSpan.setSucceeded();
141
142 return rc;
143}
144
145/**
146 * Initializes the shared folder object.
147 *
148 * @param aVirtualBox VirtualBox parent object
149 * @param aName logical name of the shared folder
150 * @param aHostPath full path to the shared folder on the host
151 * @param aWritable writable if true, readonly otherwise
152 *
153 * @return COM result indicator
154 */
155HRESULT SharedFolder::init (VirtualBox *aVirtualBox,
156 CBSTR aName, CBSTR aHostPath, BOOL aWritable)
157{
158 /* Enclose the state transition NotReady->InInit->Ready */
159 AutoInitSpan autoInitSpan(this);
160 AssertReturn(autoInitSpan.isOk(), E_FAIL);
161
162 unconst(mVirtualBox) = aVirtualBox;
163
164 HRESULT rc = protectedInit(aVirtualBox, aName, aHostPath, aWritable);
165
166 /* Confirm a successful initialization when it's the case */
167 if (SUCCEEDED(rc))
168 autoInitSpan.setSucceeded();
169
170 return rc;
171}
172
173/**
174 * Helper for init() methods.
175 *
176 * @note
177 * Must be called from under the object's lock!
178 */
179HRESULT SharedFolder::protectedInit(VirtualBoxBase *aParent,
180 CBSTR aName,
181 CBSTR aHostPath,
182 BOOL aWritable)
183{
184 LogFlowThisFunc(("aName={%ls}, aHostPath={%ls}, aWritable={%d}\n",
185 aName, aHostPath, aWritable));
186
187 ComAssertRet (aParent && aName && aHostPath, E_INVALIDARG);
188
189 Utf8Str hostPath = Utf8Str (aHostPath);
190 size_t hostPathLen = hostPath.length();
191
192 /* Remove the trailing slash unless it's a root directory
193 * (otherwise the comparison with the RTPathAbs() result will fail at least
194 * on Linux). Note that this isn't really necessary for the shared folder
195 * itself, since adding a mapping eventually results into a
196 * RTDirOpenFiltered() call (see HostServices/SharedFolders) that seems to
197 * accept both the slashified paths and not. */
198#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
199 if (hostPathLen > 2 &&
200 RTPATH_IS_SEP (hostPath.raw()[hostPathLen - 1]) &&
201 RTPATH_IS_VOLSEP (hostPath.raw()[hostPathLen - 2]))
202 ;
203#else
204 if (hostPathLen == 1 && RTPATH_IS_SEP(hostPath[0]))
205 ;
206#endif
207 else
208 hostPath.stripTrailingSlash();
209
210 /* Check whether the path is full (absolute) */
211 char hostPathFull [RTPATH_MAX];
212 int vrc = RTPathAbsEx(NULL,
213 hostPath.c_str(),
214 hostPathFull,
215 sizeof (hostPathFull));
216 if (RT_FAILURE(vrc))
217 return setError (E_INVALIDARG,
218 tr ("Invalid shared folder path: '%s' (%Rrc)"), hostPath.raw(), vrc);
219
220 if (RTPathCompare(hostPath.c_str(), hostPathFull) != 0)
221 return setError (E_INVALIDARG,
222 tr ("Shared folder path '%s' is not absolute"), hostPath.raw());
223
224 unconst(mParent) = aParent;
225
226 unconst(m.name) = aName;
227 unconst(m.hostPath) = hostPath;
228 m.writable = aWritable;
229
230 return S_OK;
231}
232
233/**
234 * Uninitializes the instance and sets the ready flag to FALSE.
235 * Called either from FinalRelease() or by the parent when it gets destroyed.
236 */
237void SharedFolder::uninit()
238{
239 LogFlowThisFunc(("\n"));
240
241 /* Enclose the state transition Ready->InUninit->NotReady */
242 AutoUninitSpan autoUninitSpan(this);
243 if (autoUninitSpan.uninitDone())
244 return;
245
246 unconst(mParent) = NULL;
247
248 unconst(mMachine).setNull();
249 unconst(mConsole).setNull();
250 unconst(mVirtualBox).setNull();
251}
252
253// ISharedFolder properties
254/////////////////////////////////////////////////////////////////////////////
255
256STDMETHODIMP SharedFolder::COMGETTER(Name) (BSTR *aName)
257{
258 CheckComArgOutPointerValid(aName);
259
260 AutoCaller autoCaller(this);
261 if (FAILED(autoCaller.rc())) return autoCaller.rc();
262
263 /* mName is constant during life time, no need to lock */
264 m.name.cloneTo(aName);
265
266 return S_OK;
267}
268
269STDMETHODIMP SharedFolder::COMGETTER(HostPath) (BSTR *aHostPath)
270{
271 CheckComArgOutPointerValid(aHostPath);
272
273 AutoCaller autoCaller(this);
274 if (FAILED(autoCaller.rc())) return autoCaller.rc();
275
276 /* mHostPath is constant during life time, no need to lock */
277 m.hostPath.cloneTo(aHostPath);
278
279 return S_OK;
280}
281
282STDMETHODIMP SharedFolder::COMGETTER(Accessible) (BOOL *aAccessible)
283{
284 CheckComArgOutPointerValid(aAccessible);
285
286 AutoCaller autoCaller(this);
287 if (FAILED(autoCaller.rc())) return autoCaller.rc();
288
289 /* mName and mHostPath are constant during life time, no need to lock */
290
291 /* check whether the host path exists */
292 Utf8Str hostPath = Utf8Str(m.hostPath);
293 char hostPathFull[RTPATH_MAX];
294 int vrc = RTPathExists(hostPath.c_str()) ? RTPathReal(hostPath.c_str(),
295 hostPathFull,
296 sizeof(hostPathFull))
297 : VERR_PATH_NOT_FOUND;
298 if (RT_SUCCESS(vrc))
299 {
300 *aAccessible = TRUE;
301 return S_OK;
302 }
303
304 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
305
306 m.lastAccessError = BstrFmt (
307 tr ("'%s' is not accessible (%Rrc)"), hostPath.raw(), vrc);
308
309 LogWarningThisFunc(("m.lastAccessError=\"%ls\"\n", m.lastAccessError.raw()));
310
311 *aAccessible = FALSE;
312 return S_OK;
313}
314
315STDMETHODIMP SharedFolder::COMGETTER(Writable) (BOOL *aWritable)
316{
317 CheckComArgOutPointerValid(aWritable);
318
319 *aWritable = m.writable;
320
321 return S_OK;
322}
323
324STDMETHODIMP SharedFolder::COMGETTER(LastAccessError) (BSTR *aLastAccessError)
325{
326 CheckComArgOutPointerValid(aLastAccessError);
327
328 AutoCaller autoCaller(this);
329 if (FAILED(autoCaller.rc())) return autoCaller.rc();
330
331 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
332
333 if (m.lastAccessError.isEmpty())
334 Bstr("").cloneTo(aLastAccessError);
335 else
336 m.lastAccessError.cloneTo(aLastAccessError);
337
338 return S_OK;
339}
340
341/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette