VirtualBox

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

Last change on this file since 26624 was 26603, checked in by vboxsync, 15 years ago

Main: back out r57775

  • 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)"),
219 hostPath.raw(), vrc);
220
221 if (RTPathCompare(hostPath.c_str(), hostPathFull) != 0)
222 return setError(E_INVALIDARG,
223 tr("Shared folder path '%s' is not absolute"),
224 hostPath.raw());
225
226 unconst(mParent) = aParent;
227
228 unconst(m.name) = aName;
229 unconst(m.hostPath) = hostPath;
230 m.writable = aWritable;
231
232 return S_OK;
233}
234
235/**
236 * Uninitializes the instance and sets the ready flag to FALSE.
237 * Called either from FinalRelease() or by the parent when it gets destroyed.
238 */
239void SharedFolder::uninit()
240{
241 LogFlowThisFunc(("\n"));
242
243 /* Enclose the state transition Ready->InUninit->NotReady */
244 AutoUninitSpan autoUninitSpan(this);
245 if (autoUninitSpan.uninitDone())
246 return;
247
248 unconst(mParent) = NULL;
249
250 unconst(mMachine).setNull();
251 unconst(mConsole).setNull();
252 unconst(mVirtualBox).setNull();
253}
254
255// ISharedFolder properties
256/////////////////////////////////////////////////////////////////////////////
257
258STDMETHODIMP SharedFolder::COMGETTER(Name) (BSTR *aName)
259{
260 CheckComArgOutPointerValid(aName);
261
262 AutoCaller autoCaller(this);
263 if (FAILED(autoCaller.rc())) return autoCaller.rc();
264
265 /* mName is constant during life time, no need to lock */
266 m.name.cloneTo(aName);
267
268 return S_OK;
269}
270
271STDMETHODIMP SharedFolder::COMGETTER(HostPath) (BSTR *aHostPath)
272{
273 CheckComArgOutPointerValid(aHostPath);
274
275 AutoCaller autoCaller(this);
276 if (FAILED(autoCaller.rc())) return autoCaller.rc();
277
278 /* mHostPath is constant during life time, no need to lock */
279 m.hostPath.cloneTo(aHostPath);
280
281 return S_OK;
282}
283
284STDMETHODIMP SharedFolder::COMGETTER(Accessible) (BOOL *aAccessible)
285{
286 CheckComArgOutPointerValid(aAccessible);
287
288 AutoCaller autoCaller(this);
289 if (FAILED(autoCaller.rc())) return autoCaller.rc();
290
291 /* mName and mHostPath are constant during life time, no need to lock */
292
293 /* check whether the host path exists */
294 Utf8Str hostPath = Utf8Str(m.hostPath);
295 char hostPathFull[RTPATH_MAX];
296 int vrc = RTPathExists(hostPath.c_str()) ? RTPathReal(hostPath.c_str(),
297 hostPathFull,
298 sizeof(hostPathFull))
299 : VERR_PATH_NOT_FOUND;
300 if (RT_SUCCESS(vrc))
301 {
302 *aAccessible = TRUE;
303 return S_OK;
304 }
305
306 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
307
308 m.lastAccessError = BstrFmt (
309 tr ("'%s' is not accessible (%Rrc)"), hostPath.raw(), vrc);
310
311 LogWarningThisFunc(("m.lastAccessError=\"%ls\"\n", m.lastAccessError.raw()));
312
313 *aAccessible = FALSE;
314 return S_OK;
315}
316
317STDMETHODIMP SharedFolder::COMGETTER(Writable) (BOOL *aWritable)
318{
319 CheckComArgOutPointerValid(aWritable);
320
321 *aWritable = m.writable;
322
323 return S_OK;
324}
325
326STDMETHODIMP SharedFolder::COMGETTER(LastAccessError) (BSTR *aLastAccessError)
327{
328 CheckComArgOutPointerValid(aLastAccessError);
329
330 AutoCaller autoCaller(this);
331 if (FAILED(autoCaller.rc())) return autoCaller.rc();
332
333 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
334
335 if (m.lastAccessError.isEmpty())
336 Bstr("").cloneTo(aLastAccessError);
337 else
338 m.lastAccessError.cloneTo(aLastAccessError);
339
340 return S_OK;
341}
342
343/* 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