summaryrefslogtreecommitdiff
path: root/src/VBox/Main/include/GuestFileImpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Main/include/GuestFileImpl.h')
-rw-r--r--src/VBox/Main/include/GuestFileImpl.h64
1 files changed, 49 insertions, 15 deletions
diff --git a/src/VBox/Main/include/GuestFileImpl.h b/src/VBox/Main/include/GuestFileImpl.h
index cea13081..7890cb48 100644
--- a/src/VBox/Main/include/GuestFileImpl.h
+++ b/src/VBox/Main/include/GuestFileImpl.h
@@ -1,11 +1,11 @@
/* $Id: GuestFileImpl.h $ */
/** @file
- * VirtualBox Main - XXX.
+ * VirtualBox Main - Guest file handling.
*/
/*
- * Copyright (C) 2012 Oracle Corporation
+ * Copyright (C) 2012-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -20,9 +20,12 @@
#define ____H_GUESTFILEIMPL
#include "VirtualBoxBase.h"
+#include "EventImpl.h"
#include "GuestFsObjInfoImpl.h"
+#include "GuestCtrlImplPrivate.h"
+class Console;
class GuestSession;
class GuestProcess;
@@ -31,6 +34,7 @@ class GuestProcess;
*/
class ATL_NO_VTABLE GuestFile :
public VirtualBoxBase,
+ public GuestObject,
VBOX_SCRIPTABLE_IMPL(IGuestFile)
{
public:
@@ -45,7 +49,7 @@ public:
END_COM_MAP()
DECLARE_EMPTY_CTOR_DTOR(GuestFile)
- int init(GuestSession *pSession, const Utf8Str &strPath, const Utf8Str &strOpenMode, const Utf8Str &strDisposition, uint32_t uCreationMode, int64_t iOffset, int *pGuestRc);
+ int init(Console *pConsole, GuestSession *pSession, ULONG uFileID, const GuestFileOpenInfo &openInfo);
void uninit(void);
HRESULT FinalConstruct(void);
void FinalRelease(void);
@@ -54,11 +58,14 @@ public:
/** @name IFile interface.
* @{ */
STDMETHOD(COMGETTER(CreationMode))(ULONG *aCreationMode);
- STDMETHOD(COMGETTER(Disposition))(ULONG *aDisposition);
+ STDMETHOD(COMGETTER(Disposition))(BSTR *aDisposition);
+ STDMETHOD(COMGETTER(EventSource))(IEventSource ** aEventSource);
STDMETHOD(COMGETTER(FileName))(BSTR *aFileName);
+ STDMETHOD(COMGETTER(Id))(ULONG *aID);
STDMETHOD(COMGETTER(InitialSize))(LONG64 *aInitialSize);
STDMETHOD(COMGETTER(Offset))(LONG64 *aOffset);
- STDMETHOD(COMGETTER(OpenMode))(ULONG *aOpenMode);
+ STDMETHOD(COMGETTER(OpenMode))(BSTR *aOpenMode);
+ STDMETHOD(COMGETTER(Status))(FileStatus_T *aStatus);
STDMETHOD(Close)(void);
STDMETHOD(QueryInfo)(IFsObjInfo **aInfo);
@@ -73,22 +80,49 @@ public:
public:
/** @name Public internal methods.
* @{ */
- static uint32_t getDispositionFromString(const Utf8Str &strDisposition);
- static uint32_t getOpenModeFromString(const Utf8Str &strOpenMode);
+ int callbackDispatcher(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
+ int closeFile(int *pGuestRc);
+ EventSource *getEventSource(void) { return mEventSource; }
+ static Utf8Str guestErrorToString(int guestRc);
+ int onFileNotify(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData);
+ int onGuestDisconnected(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData);
+ int onRemove(void);
+ int openFile(uint32_t uTimeoutMS, int *pGuestRc);
+ int readData(uint32_t uSize, uint32_t uTimeoutMS, void* pvData, uint32_t cbData, uint32_t* pcbRead);
+ int readDataAt(uint64_t uOffset, uint32_t uSize, uint32_t uTimeoutMS, void* pvData, size_t cbData, size_t* pcbRead);
+ int seekAt(int64_t iOffset, GUEST_FILE_SEEKTYPE eSeekType, uint32_t uTimeoutMS, uint64_t *puOffset);
+ static HRESULT setErrorExternal(VirtualBoxBase *pInterface, int guestRc);
+ int setFileStatus(FileStatus_T fileStatus, int fileRc);
+ int waitForOffsetChange(GuestWaitEvent *pEvent, uint32_t uTimeoutMS, uint64_t *puOffset);
+ int waitForRead(GuestWaitEvent *pEvent, uint32_t uTimeoutMS, void *pvData, size_t cbData, uint32_t *pcbRead);
+ int waitForStatusChange(GuestWaitEvent *pEvent, uint32_t uTimeoutMS, FileStatus_T *pFileStatus, int *pGuestRc);
+ int waitForWrite(GuestWaitEvent *pEvent, uint32_t uTimeoutMS, uint32_t *pcbWritten);
+ int writeData(uint32_t uTimeoutMS, void *pvData, uint32_t cbData, uint32_t *pcbWritten);
+ int writeDataAt(uint64_t uOffset, uint32_t uTimeoutMS, void *pvData, uint32_t cbData, uint32_t *pcbWritten);
/** @} */
private:
+ /** This can safely be used without holding any locks.
+ * An AutoCaller suffices to prevent it being destroy while in use and
+ * internally there is a lock providing the necessary serialization. */
+ const ComObjPtr<EventSource> mEventSource;
+
struct Data
{
- /** The associate session this file belongs to. */
- GuestSession *mSession;
- uint32_t mCreationMode;
- uint32_t mDisposition;
- Utf8Str mFileName;
- int64_t mInitialSize;
- uint32_t mOpenMode;
- int64_t mOffset;
+ /** The file's open info. */
+ GuestFileOpenInfo mOpenInfo;
+ /** The file's initial size on open. */
+ uint64_t mInitialSize;
+ /** The file's ID. */
+ uint32_t mID;
+ /** The current file status. */
+ FileStatus_T mStatus;
+ /** The last returned process status
+ * returned from the guest side. */
+ int mLastError;
+ /** The file's current offset. */
+ uint64_t mOffCurrent;
} mData;
};