Changeset 82465 in vbox
- Timestamp:
- Dec 6, 2019 3:44:15 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 135316
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/GuestHost/SharedClipboard-transfers.h
r81768 r82465 111 111 #define SHCL_OBJ_CF_DIRECTORY (0x00000004) 112 112 113 /** Open/create action to do if object exists114 * and if the object does not exists.115 * REPLACE file means atomically DELETE and CREATE.116 * OVERWRITE file means truncating the file to 0 and117 * setting new size.118 * When opening an existing directory REPLACE and OVERWRITE119 * actions are considered invalid, and cause returning120 * FILE_EXISTS with NIL handle.121 */122 #define SHCL_OBJ_CF_ACT_MASK_IF_EXISTS (0x000000F0)123 #define SHCL_OBJ_CF_ACT_MASK_IF_NEW (0x00000F00)124 125 /** What to do if object exists. */126 #define SHCL_OBJ_CF_ACT_OPEN_IF_EXISTS (0x00000000)127 #define SHCL_OBJ_CF_ACT_FAIL_IF_EXISTS (0x00000010)128 #define SHCL_OBJ_CF_ACT_REPLACE_IF_EXISTS (0x00000020)129 #define SHCL_OBJ_CF_ACT_OVERWRITE_IF_EXISTS (0x00000030)130 131 /** What to do if object does not exist. */132 #define SHCL_OBJ_CF_ACT_CREATE_IF_NEW (0x00000000)133 #define SHCL_OBJ_CF_ACT_FAIL_IF_NEW (0x00000100)134 135 113 /** Read/write requested access for the object. */ 136 #define SHCL_OBJ_CF_ACCESS_MASK_RW (0x0000 3000)114 #define SHCL_OBJ_CF_ACCESS_MASK_RW (0x00001000) 137 115 138 116 /** No access requested. */ … … 140 118 /** Read access requested. */ 141 119 #define SHCL_OBJ_CF_ACCESS_READ (0x00001000) 142 /** Write access requested. */143 #define SHCL_OBJ_CF_ACCESS_WRITE (0x00002000)144 /** Read/Write access requested. */145 #define SHCL_OBJ_CF_ACCESS_READWRITE (SHCL_OBJ_CF_ACCESS_READ | SHCL_OBJ_CF_ACCESS_WRITE)146 120 147 121 /** Requested share access for the object. */ … … 164 138 /** Read access requested. */ 165 139 #define SHCL_OBJ_CF_ACCESS_ATTR_READ (0x00010000) 166 /** Write access requested. */167 #define SHCL_OBJ_CF_ACCESS_ATTR_WRITE (0x00020000)168 /** Read/Write access requested. */169 #define SHCL_OBJ_CF_ACCESS_ATTR_READWRITE (SHCL_OBJ_CF_ACCESS_ATTR_READ | SHCL_OBJ_CF_ACCESS_ATTR_WRITE)170 171 /** The file is opened in append mode. Ignored if SHCL_OBJ_CF_ACCESS_WRITE is not set. */172 #define SHCL_OBJ_CF_ACCESS_APPEND (0x00040000)173 140 174 141 /** @} */ 175 142 176 /** Result of an open /createrequest.143 /** Result of an open request. 177 144 * Along with handle value the result code 178 145 * identifies what has happened while … … 186 153 /** Path to file exists, but the last component does not. */ 187 154 SHCL_CREATERESULT_FILE_NOT_FOUND, 188 /** File already exists and either has been opened or not. */189 SHCL_CREATERESULT_FILE_EXISTS,190 /** New file was created. */191 SHCL_CREATERESULT_FILE_CREATED,192 /** Existing file was replaced or overwritten. */193 SHCL_CREATERESULT_FILE_REPLACED,194 155 /** Blow the type up to 32-bit. */ 195 156 SHCL_CREATERESULT_32BIT_HACK = 0x7fffffff -
trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
r82462 r82465 815 815 if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL) 816 816 { 817 /*818 * Make sure the transfer direction matches the open/create parameters.819 */820 if (pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE)821 {822 if ( pOpenCreateParms->fCreate & SHCL_OBJ_CF_ACCESS_READ) /* Read access wanted? */817 PSHCLOBJHANDLEINFO pInfo 818 = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO)); 819 if (pInfo) 820 { 821 rc = ShClTransferObjHandleInfoInit(pInfo); 822 if (RT_SUCCESS(rc)) 823 823 { 824 AssertMsgFailed(("Is not a write transfer, but object open flags are set to read access (0x%x)\n", 825 pOpenCreateParms->fCreate)); /* Should never happen. */ 826 rc = VERR_INVALID_PARAMETER; 827 } 828 } 829 else if (pTransfer->State.enmDir == SHCLTRANSFERDIR_TO_REMOTE) 830 { 831 if (pOpenCreateParms->fCreate & SHCL_OBJ_CF_ACCESS_WRITE) /* Write access wanted? */ 832 { 833 AssertMsgFailed(("Is not a read transfer, but object open flags are set to write access (0x%x)\n", 834 pOpenCreateParms->fCreate)); /* Should never happen. */ 835 rc = VERR_INVALID_PARAMETER; 836 } 837 } 838 else 839 { 840 AssertFailed(); 841 rc = VERR_NOT_SUPPORTED; 842 } 843 844 if (RT_SUCCESS(rc)) 845 { 846 PSHCLOBJHANDLEINFO pInfo 847 = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO)); 848 if (pInfo) 849 { 850 rc = ShClTransferObjHandleInfoInit(pInfo); 824 825 /* Only if this is a read transfer (locally) we're able to actually write to files 826 * (we're reading from the source). */ 827 const bool fWritable = pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE; 828 829 uint64_t fOpen; 830 rc = shClConvertFileCreateFlags(fWritable, 831 pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode, 832 SHCLOBJHANDLE_INVALID, &fOpen); 851 833 if (RT_SUCCESS(rc)) 852 834 { 853 854 /* Only if this is a read transfer (locally) we're able to actually write to files 855 * (we're reading from the source). */ 856 const bool fWritable = pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE; 857 858 uint64_t fOpen; 859 rc = shClConvertFileCreateFlags(fWritable, 860 pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode, 861 SHCLOBJHANDLE_INVALID, &fOpen); 835 rc = shClTransferResolvePathAbs(pTransfer, pOpenCreateParms->pszPath, 0 /* fFlags */, 836 &pInfo->pszPathLocalAbs); 862 837 if (RT_SUCCESS(rc)) 863 838 { 864 rc = shClTransferResolvePathAbs(pTransfer, pOpenCreateParms->pszPath, 0 /* fFlags */, 865 &pInfo->pszPathLocalAbs); 839 rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen); 866 840 if (RT_SUCCESS(rc)) 867 841 { 868 rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen); 869 if (RT_SUCCESS(rc)) 870 { 871 LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs)); 872 } 873 else 874 LogRel(("Shared Clipboard: Error opening file '%s', rc=%Rrc\n", pInfo->pszPathLocalAbs, rc)); 842 LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs)); 875 843 } 844 else 845 LogRel(("Shared Clipboard: Error opening file '%s', rc=%Rrc\n", pInfo->pszPathLocalAbs, rc)); 876 846 } 877 847 } 878 879 if (RT_SUCCESS(rc)) 880 { 881 pInfo->hObj = pTransfer->uObjHandleNext++; 882 pInfo->enmType = SHCLOBJTYPE_FILE; 883 884 RTListAppend(&pTransfer->lstObj, &pInfo->Node); 885 pTransfer->cObjHandles++; 886 887 LogFlowFunc(("cObjHandles=%RU32\n", pTransfer->cObjHandles)); 888 889 *phObj = pInfo->hObj; 890 } 891 else 892 { 893 ShClTransferObjHandleInfoDestroy(pInfo); 894 RTMemFree(pInfo); 895 } 848 } 849 850 if (RT_SUCCESS(rc)) 851 { 852 pInfo->hObj = pTransfer->uObjHandleNext++; 853 pInfo->enmType = SHCLOBJTYPE_FILE; 854 855 RTListAppend(&pTransfer->lstObj, &pInfo->Node); 856 pTransfer->cObjHandles++; 857 858 LogFlowFunc(("cObjHandles=%RU32\n", pTransfer->cObjHandles)); 859 860 *phObj = pInfo->hObj; 896 861 } 897 862 else 898 rc = VERR_NO_MEMORY; 899 } 863 { 864 ShClTransferObjHandleInfoDestroy(pInfo); 865 RTMemFree(pInfo); 866 } 867 } 868 else 869 rc = VERR_NO_MEMORY; 900 870 } 901 871 else if (pTransfer->State.enmSource == SHCLSOURCE_REMOTE) … … 3098 3068 { 3099 3069 default: 3070 RT_FALL_THROUGH(); 3100 3071 case SHCL_OBJ_CF_ACCESS_NONE: 3101 3072 { … … 3116 3087 break; 3117 3088 } 3118 3119 case SHCL_OBJ_CF_ACCESS_WRITE:3120 {3121 fOpen |= RTFILE_O_WRITE;3122 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_WRITE\n"));3123 break;3124 }3125 3126 case SHCL_OBJ_CF_ACCESS_READWRITE:3127 {3128 fOpen |= RTFILE_O_READWRITE;3129 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_READWRITE\n"));3130 break;3131 }3132 }3133 3134 if (fShClFlags & SHCL_OBJ_CF_ACCESS_APPEND)3135 {3136 fOpen |= RTFILE_O_APPEND;3137 3089 } 3138 3090 … … 3140 3092 { 3141 3093 default: 3094 RT_FALL_THROUGH(); 3142 3095 case SHCL_OBJ_CF_ACCESS_ATTR_NONE: 3143 3096 { … … 3151 3104 fOpen |= RTFILE_O_ACCESS_ATTR_READ; 3152 3105 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_READ\n")); 3153 break;3154 }3155 3156 case SHCL_OBJ_CF_ACCESS_ATTR_WRITE:3157 {3158 fOpen |= RTFILE_O_ACCESS_ATTR_WRITE;3159 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_WRITE\n"));3160 break;3161 }3162 3163 case SHCL_OBJ_CF_ACCESS_ATTR_READWRITE:3164 {3165 fOpen |= RTFILE_O_ACCESS_ATTR_READWRITE;3166 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_READWRITE\n"));3167 3106 break; 3168 3107 } … … 3192 3131 LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYALL\n")); 3193 3132 break; 3194 }3195 3196 /* Open/Create action mask */3197 switch ((fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_EXISTS))3198 {3199 case SHCL_OBJ_CF_ACT_OPEN_IF_EXISTS:3200 if (SHCL_OBJ_CF_ACT_CREATE_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))3201 {3202 fOpen |= RTFILE_O_OPEN_CREATE;3203 LogFlowFunc(("SHCL_OBJ_CF_ACT_OPEN_IF_EXISTS and SHCL_OBJ_CF_ACT_CREATE_IF_NEW\n"));3204 }3205 else if (SHCL_OBJ_CF_ACT_FAIL_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))3206 {3207 fOpen |= RTFILE_O_OPEN;3208 LogFlowFunc(("SHCL_OBJ_CF_ACT_OPEN_IF_EXISTS and SHCL_OBJ_CF_ACT_FAIL_IF_NEW\n"));3209 }3210 else3211 {3212 LogFlowFunc(("invalid open/create action combination\n"));3213 rc = VERR_INVALID_PARAMETER;3214 }3215 break;3216 case SHCL_OBJ_CF_ACT_FAIL_IF_EXISTS:3217 if (SHCL_OBJ_CF_ACT_CREATE_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))3218 {3219 fOpen |= RTFILE_O_CREATE;3220 LogFlowFunc(("SHCL_OBJ_CF_ACT_FAIL_IF_EXISTS and SHCL_OBJ_CF_ACT_CREATE_IF_NEW\n"));3221 }3222 else3223 {3224 LogFlowFunc(("invalid open/create action combination\n"));3225 rc = VERR_INVALID_PARAMETER;3226 }3227 break;3228 case SHCL_OBJ_CF_ACT_REPLACE_IF_EXISTS:3229 if (SHCL_OBJ_CF_ACT_CREATE_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))3230 {3231 fOpen |= RTFILE_O_CREATE_REPLACE;3232 LogFlowFunc(("SHCL_OBJ_CF_ACT_REPLACE_IF_EXISTS and SHCL_OBJ_CF_ACT_CREATE_IF_NEW\n"));3233 }3234 else if (SHCL_OBJ_CF_ACT_FAIL_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))3235 {3236 fOpen |= RTFILE_O_OPEN | RTFILE_O_TRUNCATE;3237 LogFlowFunc(("SHCL_OBJ_CF_ACT_REPLACE_IF_EXISTS and SHCL_OBJ_CF_ACT_FAIL_IF_NEW\n"));3238 }3239 else3240 {3241 LogFlowFunc(("invalid open/create action combination\n"));3242 rc = VERR_INVALID_PARAMETER;3243 }3244 break;3245 case SHCL_OBJ_CF_ACT_OVERWRITE_IF_EXISTS:3246 if (SHCL_OBJ_CF_ACT_CREATE_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))3247 {3248 fOpen |= RTFILE_O_CREATE_REPLACE;3249 LogFlowFunc(("SHCL_OBJ_CF_ACT_OVERWRITE_IF_EXISTS and SHCL_OBJ_CF_ACT_CREATE_IF_NEW\n"));3250 }3251 else if (SHCL_OBJ_CF_ACT_FAIL_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))3252 {3253 fOpen |= RTFILE_O_OPEN | RTFILE_O_TRUNCATE;3254 LogFlowFunc(("SHCL_OBJ_CF_ACT_OVERWRITE_IF_EXISTS and SHCL_OBJ_CF_ACT_FAIL_IF_NEW\n"));3255 }3256 else3257 {3258 LogFlowFunc(("invalid open/create action combination\n"));3259 rc = VERR_INVALID_PARAMETER;3260 }3261 break;3262 default:3263 {3264 rc = VERR_INVALID_PARAMETER;3265 LogFlowFunc(("SHCL_OBJ_CF_ACT_MASK_IF_EXISTS - invalid parameter\n"));3266 break;3267 }3268 3133 } 3269 3134
Note:
See TracChangeset
for help on using the changeset viewer.