Changeset 100467 in vbox for trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
- Timestamp:
- Jul 10, 2023 2:53:16 PM (19 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
r100426 r100467 3138 3138 } 3139 3139 3140 /** 3141 * Resolves a relative path of a specific transfer to its absolute path. 3142 * 3143 * @returns VBox status code. 3144 * @param pTransfer Clipboard transfer to resolve path for. 3145 * @param pszPath Relative path to resolve. 3146 * Paths have to end with a (back-)slash, otherwise this is considered to be a file. 3147 * @param fFlags Resolve flags. Currently not used and must be 0. 3148 * @param ppszResolved Where to store the allocated resolved path. Must be free'd by the called using RTStrFree(). 3149 */ 3150 int ShClTransferResolvePathAbs(PSHCLTRANSFER pTransfer, const char *pszPath, uint32_t fFlags, char **ppszResolved) 3151 { 3152 AssertPtrReturn(pTransfer, VERR_INVALID_POINTER); 3153 AssertPtrReturn(pszPath, VERR_INVALID_POINTER); 3154 AssertReturn (fFlags == 0, VERR_INVALID_PARAMETER); 3155 AssertPtrReturn(ppszResolved, VERR_INVALID_POINTER); 3156 3157 LogFlowFunc(("pszPath=%s, fFlags=%#x (pszPathRootAbs=%s, cRootListEntries=%RU64)\n", 3158 pszPath, fFlags, pTransfer->pszPathRootAbs, pTransfer->lstRoots.Hdr.cEntries)); 3159 3160 int rc = ShClTransferValidatePath(pszPath, false /* fMustExist */); 3161 if (RT_SUCCESS(rc)) 3162 { 3163 rc = VERR_PATH_NOT_FOUND; /* Play safe by default. */ 3164 3165 PSHCLLISTENTRY pEntry; 3166 RTListForEach(&pTransfer->lstRoots.lstEntries, pEntry, SHCLLISTENTRY, Node) 3167 { 3168 LogFlowFunc(("\tpEntry->pszName=%s\n", pEntry->pszName)); 3169 3170 if (RTStrStartsWith(pszPath, pEntry->pszName)) /* Case-sensitive! */ 3171 { 3172 rc = VINF_SUCCESS; 3173 break; 3174 } 3175 } 3176 3177 if (RT_SUCCESS(rc)) 3178 { 3179 char *pszPathAbs = RTPathJoinA(pTransfer->pszPathRootAbs, pszPath); 3180 if (pszPathAbs) 3181 { 3182 char szResolved[RTPATH_MAX]; 3183 size_t cbResolved = sizeof(szResolved); 3184 rc = RTPathAbsEx(pTransfer->pszPathRootAbs, pszPathAbs, RTPATH_STR_F_STYLE_HOST, szResolved, &cbResolved); 3185 3186 RTStrFree(pszPathAbs); 3187 pszPathAbs = NULL; 3188 3189 if (RT_SUCCESS(rc)) 3190 { 3191 LogRel2(("Shared Clipboard: Resolved: '%s' -> '%s'\n", pszPath, szResolved)); 3192 3193 *ppszResolved = RTStrDup(szResolved); 3194 } 3195 } 3196 else 3197 rc = VERR_NO_MEMORY; 3198 } 3199 } 3200 3201 if (RT_FAILURE(rc)) 3202 LogRel(("Shared Clipboard: Resolving absolute path for '%s' failed, rc=%Rrc\n", pszPath, rc)); 3203 3204 LogFlowFuncLeaveRC(rc); 3205 return rc; 3206 } 3207 3208 /** 3209 * Converts Shared Clipboard create flags (see SharedClipboard-transfers.h) into IPRT create flags. 3210 * 3211 * @returns IPRT status code. 3212 * @param fShClFlags Shared clipboard create flags. 3213 * @param[out] pfOpen Where to store the RTFILE_O_XXX flags for 3214 * RTFileOpen. 3215 * 3216 * @sa Initially taken from vbsfConvertFileOpenFlags(). 3217 */ 3218 int ShClTransferConvertFileCreateFlags(uint32_t fShClFlags, uint64_t *pfOpen) 3219 { 3220 AssertMsgReturnStmt(!(fShClFlags & ~SHCL_OBJ_CF_VALID_MASK), ("%#x4\n", fShClFlags), *pfOpen = 0, VERR_INVALID_FLAGS); 3221 3222 uint64_t fOpen = 0; 3223 3224 switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_RW) 3225 { 3226 case SHCL_OBJ_CF_ACCESS_NONE: 3227 { 3228 #ifdef RT_OS_WINDOWS 3229 if ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR) != SHCL_OBJ_CF_ACCESS_ATTR_NONE) 3230 fOpen |= RTFILE_O_OPEN | RTFILE_O_ATTR_ONLY; 3231 else 3232 #endif 3233 fOpen |= RTFILE_O_OPEN | RTFILE_O_READ; 3234 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_NONE\n")); 3235 break; 3236 } 3237 3238 case SHCL_OBJ_CF_ACCESS_READ: 3239 { 3240 fOpen |= RTFILE_O_OPEN | RTFILE_O_READ; 3241 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_READ\n")); 3242 break; 3243 } 3244 3245 default: 3246 AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); 3247 } 3248 3249 switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR) 3250 { 3251 case SHCL_OBJ_CF_ACCESS_ATTR_NONE: 3252 { 3253 fOpen |= RTFILE_O_ACCESS_ATTR_DEFAULT; 3254 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_NONE\n")); 3255 break; 3256 } 3257 3258 case SHCL_OBJ_CF_ACCESS_ATTR_READ: 3259 { 3260 fOpen |= RTFILE_O_ACCESS_ATTR_READ; 3261 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_READ\n")); 3262 break; 3263 } 3264 3265 default: 3266 AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); 3267 } 3268 3269 /* Sharing mask */ 3270 switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_DENY) 3271 { 3272 case SHCL_OBJ_CF_ACCESS_DENYNONE: 3273 fOpen |= RTFILE_O_DENY_NONE; 3274 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYNONE\n")); 3275 break; 3276 3277 case SHCL_OBJ_CF_ACCESS_DENYWRITE: 3278 fOpen |= RTFILE_O_DENY_WRITE; 3279 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYWRITE\n")); 3280 break; 3281 3282 default: 3283 AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); 3284 } 3285 3286 *pfOpen = fOpen; 3287 3288 LogFlowFuncLeaveRC(VINF_SUCCESS); 3289 return VINF_SUCCESS; 3290 } 3291
Note:
See TracChangeset
for help on using the changeset viewer.