mappings.cpp revision 0b2fe03525bf326aeae736bb44c572debe8ba180
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/** @file
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Shared Folders: Mappings support.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Copyright (C) 2006-2007 innotek GmbH
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * available from http://www.virtualbox.org. This file is free software;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * General Public License as published by the Free Software Foundation,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * If you received this file as part of a commercial VirtualBox
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * distribution, then only the terms of your commercial VirtualBox
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * license agreement apply instead of the previous paragraph.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include "mappings.h"
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/alloc.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/assert.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync#include <iprt/string.h>
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncMAPPING FolderMapping[SHFL_MAX_MAPPINGS];
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * We are always executed from one specific HGCM thread. So thread safe.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncint vbsfMappingsAdd (PSHFLSTRING pFolderName, PSHFLSTRING pMapName)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int i;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Assert(pFolderName && pMapName);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* check for duplicates */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync for (i=0;i<SHFL_MAX_MAPPINGS;i++)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (FolderMapping[i].fValid == true)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (!RTUtf16LocaleICmp(FolderMapping[i].pMapName->String.ucs2, pMapName->String.ucs2))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertMsgFailed(("vbsfMappingsAdd: %ls mapping already exists!!\n", pMapName->String.ucs2));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VERR_ALREADY_EXISTS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync for (i=0;i<SHFL_MAX_MAPPINGS;i++)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (FolderMapping[i].fValid == false)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].pFolderName = (PSHFLSTRING)RTMemAlloc(ShflStringSizeOfBuffer(pFolderName));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Assert(FolderMapping[i].pFolderName);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (FolderMapping[i].pFolderName == NULL)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VERR_NO_MEMORY;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].pFolderName->u16Length = pFolderName->u16Length;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].pFolderName->u16Size = pFolderName->u16Size;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync memcpy(FolderMapping[i].pFolderName->String.ucs2, pFolderName->String.ucs2, pFolderName->u16Size);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].pMapName = (PSHFLSTRING)RTMemAlloc(ShflStringSizeOfBuffer(pMapName));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Assert(FolderMapping[i].pMapName);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (FolderMapping[i].pMapName == NULL)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VERR_NO_MEMORY;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].pMapName->u16Length = pMapName->u16Length;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].pMapName->u16Size = pMapName->u16Size;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync memcpy(FolderMapping[i].pMapName->String.ucs2, pMapName->String.ucs2, pMapName->u16Size);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].fValid = true;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].cMappings = 0;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* Check if the host file system is case sensitive */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync RTFSPROPERTIES prop;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync char *utf8Root, *asciiroot;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int rc = RTUtf16ToUtf8(FolderMapping[i].pFolderName->String.ucs2, &utf8Root);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertRC(rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (VBOX_SUCCESS(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = RTStrUtf8ToCurrentCP(&asciiroot, utf8Root);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (VBOX_SUCCESS(rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = RTFsQueryProperties(asciiroot, &prop);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertRC(rc);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync RTStrFree(asciiroot);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync RTStrFree(utf8Root);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].fHostCaseSensitive = VBOX_SUCCESS(rc) ? prop.fCaseSensitive : false;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync break;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (i == SHFL_MAX_MAPPINGS)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertMsgFailed(("vbsfMappingsAdd: no more room to add mapping %ls to %ls!!\n", pFolderName->String.ucs2, pMapName->String.ucs2));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VERR_TOO_MUCH_DATA;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Log(("vbsfMappingsAdd: added mapping %ls to %ls\n", pFolderName->String.ucs2, pMapName->String.ucs2));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VINF_SUCCESS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncint vbsfMappingsRemove (PSHFLSTRING pMapName)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int i;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Assert(pMapName);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync for (i=0;i<SHFL_MAX_MAPPINGS;i++)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (FolderMapping[i].fValid == true)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (!RTUtf16LocaleICmp(FolderMapping[i].pMapName->String.ucs2, pMapName->String.ucs2))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync RTMemFree(FolderMapping[i].pFolderName);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync RTMemFree(FolderMapping[i].pMapName);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].pFolderName = NULL;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].pMapName = NULL;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync FolderMapping[i].fValid = false;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync break;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (i == SHFL_MAX_MAPPINGS)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertMsgFailed(("vbsfMappingsRemove: mapping %ls not found!!!!\n", pMapName->String));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VERR_FILE_NOT_FOUND;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Log(("vbsfMappingsRemove: mapping %ls removed\n", pMapName->String));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VINF_SUCCESS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncconst RTUCS2 *vbsfMappingsQueryHostRoot (SHFLROOT root, uint32_t *pcbRoot)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (root > SHFL_MAX_MAPPINGS)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertFailed();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return NULL;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *pcbRoot = FolderMapping[root].pFolderName->u16Size;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return &FolderMapping[root].pFolderName->String.ucs2[0];
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncbool vbsfIsGuestMappingCaseSensitive (SHFLROOT root)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (root > SHFL_MAX_MAPPINGS)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertFailed();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return false;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return FolderMapping[root].fGuestCaseSensitive;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncbool vbsfIsHostMappingCaseSensitive (SHFLROOT root)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (root > SHFL_MAX_MAPPINGS)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertFailed();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return false;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return FolderMapping[root].fHostCaseSensitive;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncint vbsfMappingsQuery (SHFLCLIENTDATA *pClient, SHFLMAPPING *pMappings, uint32_t *pcMappings)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int rc = VINF_SUCCESS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync uint32_t cMaxMappings = RT_MIN(*pcMappings, SHFL_MAX_MAPPINGS);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogFlow(("vbsfMappingsQuery: pClient = %p, pMappings = %p, pcMappings = %p, *pcMappings = %d\n",
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pClient, pMappings, pcMappings, *pcMappings));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *pcMappings = 0;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync for (uint32_t i=0;i<cMaxMappings;i++)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (FolderMapping[i].fValid == true)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pMappings[*pcMappings].u32Status = SHFL_MS_NEW;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pMappings[*pcMappings].root = i;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *pcMappings = *pcMappings + 1;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogFlow(("vbsfMappingsQuery: return rc = %Vrc\n", rc));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return rc;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncint vbsfMappingsQueryName (SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pString)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int rc = VINF_SUCCESS;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogFlow(("vbsfMappingsQuery: pClient = %p, root = %d, *pString = %p\n",
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pClient, root, pString));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (root >= SHFL_MAX_MAPPINGS)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VERR_INVALID_PARAMETER;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (BIT_FLAG(pClient->fu32Flags, SHFL_CF_UTF8))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* not implemented */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertFailed();
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return VERR_INVALID_PARAMETER;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (FolderMapping[root].fValid == true)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pString->u16Length = FolderMapping[root].pMapName->u16Length;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync memcpy(pString->String.ucs2, FolderMapping[root].pMapName->String.ucs2, pString->u16Size);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync else
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = VERR_FILE_NOT_FOUND;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync LogFlow(("vbsfMappingsQuery:Name return rc = %Vrc\n", rc));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return rc;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncstatic int vbsfQueryMappingIndex (PRTUTF16 utf16Name, size_t *pIndex)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync size_t i;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync for (i=0;i<SHFL_MAX_MAPPINGS;i++)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (FolderMapping[i].fValid == true)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (!RTUtf16LocaleICmp(FolderMapping[i].pMapName->String.ucs2, utf16Name))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync *pIndex = i;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return 0;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return -1;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync}
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncint vbsfMapFolder (SHFLCLIENTDATA *pClient, PSHFLSTRING pszMapName, RTUCS2 delimiter, bool fCaseSensitive, SHFLROOT *pRoot)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync{
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync size_t index;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (BIT_FLAG(pClient->fu32Flags, SHFL_CF_UTF8))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Log(("vbsfMapFolder %s\n", pszMapName->String.utf8));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync else
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Log(("vbsfMapFolder %ls\n", pszMapName->String.ucs2));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (pClient->PathDelimiter == 0)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pClient->PathDelimiter = delimiter;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync else
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync Assert(delimiter == pClient->PathDelimiter);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync }
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (BIT_FLAG(pClient->fu32Flags, SHFL_CF_UTF8))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync {
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync int rc;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PRTUTF16 utf16Name;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rc = RTStrToUtf16 ((const char *) pszMapName->String.utf8, &utf16Name);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync if (VBOX_FAILURE (rc))
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return rc;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync
rc = vbsfQueryMappingIndex (utf16Name, &index);
RTUtf16Free (utf16Name);
if (rc)
{
// AssertMsgFailed(("vbsfMapFolder: map %s not found!!\n",
// pszMapName->String.utf8));
return VERR_FILE_NOT_FOUND;
}
}
else
{
if (vbsfQueryMappingIndex (pszMapName->String.ucs2, &index))
{
// AssertMsgFailed(("vbsfMapFolder: map %ls not found!!\n",
// pszMapName->String.ucs2));
return VERR_FILE_NOT_FOUND;
}
}
FolderMapping[index].cMappings++;
Assert(FolderMapping[index].cMappings == 1 || FolderMapping[index].fGuestCaseSensitive == fCaseSensitive);
FolderMapping[index].fGuestCaseSensitive = fCaseSensitive;
*pRoot = index;
return VINF_SUCCESS;
}
int vbsfUnmapFolder (SHFLCLIENTDATA *pClient, SHFLROOT root)
{
int rc = VINF_SUCCESS;
if (root > SHFL_MAX_MAPPINGS)
{
AssertFailed();
return VERR_FILE_NOT_FOUND;
}
Assert(FolderMapping[root].fValid == true && FolderMapping[root].cMappings > 0);
if (FolderMapping[root].cMappings > 0)
FolderMapping[root].cMappings--;
Log(("vbsfUnmapFolder\n"));
return rc;
}