xref: /AOO41X/main/sal/inc/osl/file.hxx (revision 75e4cd29374597cc5cdee22e7a1cf686692801f1)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 /** @HTML */
25 
26 #ifndef _OSL_FILE_HXX_
27 #define _OSL_FILE_HXX_
28 
29 #ifdef __cplusplus
30 
31 #include <osl/time.h>
32 #   include <rtl/memory.h>
33 #   include <rtl/ustring.hxx>
34 
35 #include <osl/file.h>
36 #   include <rtl/byteseq.hxx>
37 
38 #include <stdio.h>
39 
40 namespace osl
41 {
42 
43 
44 // -----------------------------------------------------------------------------
45 /** Base class for all File System specific objects.
46 
47     @see Directory
48     @see DirectoryItem
49     @see File
50  */
51 
52 class FileBase
53 {
54 public:
55 
56     enum RC {
57         E_None         = osl_File_E_None,
58         E_PERM         = osl_File_E_PERM,
59         E_NOENT        = osl_File_E_NOENT,
60         E_SRCH         = osl_File_E_SRCH,
61         E_INTR         = osl_File_E_INTR,
62         E_IO           = osl_File_E_IO,
63         E_NXIO         = osl_File_E_NXIO,
64         E_2BIG         = osl_File_E_2BIG,
65         E_NOEXEC       = osl_File_E_NOEXEC,
66         E_BADF         = osl_File_E_BADF,
67         E_CHILD        = osl_File_E_CHILD,
68         E_AGAIN        = osl_File_E_AGAIN,
69         E_NOMEM        = osl_File_E_NOMEM,
70         E_ACCES        = osl_File_E_ACCES,
71         E_FAULT        = osl_File_E_FAULT,
72         E_BUSY         = osl_File_E_BUSY,
73         E_EXIST        = osl_File_E_EXIST,
74         E_XDEV         = osl_File_E_XDEV,
75         E_NODEV        = osl_File_E_NODEV,
76         E_NOTDIR       = osl_File_E_NOTDIR,
77         E_ISDIR        = osl_File_E_ISDIR,
78         E_INVAL        = osl_File_E_INVAL,
79         E_NFILE        = osl_File_E_NFILE,
80         E_MFILE        = osl_File_E_MFILE,
81         E_NOTTY        = osl_File_E_NOTTY,
82         E_FBIG         = osl_File_E_FBIG,
83         E_NOSPC        = osl_File_E_NOSPC,
84         E_SPIPE        = osl_File_E_SPIPE,
85         E_ROFS         = osl_File_E_ROFS,
86         E_MLINK        = osl_File_E_MLINK,
87         E_PIPE         = osl_File_E_PIPE,
88         E_DOM          = osl_File_E_DOM,
89         E_RANGE        = osl_File_E_RANGE,
90         E_DEADLK       = osl_File_E_DEADLK,
91         E_NAMETOOLONG  = osl_File_E_NAMETOOLONG,
92         E_NOLCK        = osl_File_E_NOLCK,
93         E_NOSYS        = osl_File_E_NOSYS,
94         E_NOTEMPTY     = osl_File_E_NOTEMPTY,
95         E_LOOP         = osl_File_E_LOOP,
96         E_ILSEQ        = osl_File_E_ILSEQ,
97         E_NOLINK       = osl_File_E_NOLINK,
98         E_MULTIHOP     = osl_File_E_MULTIHOP,
99         E_USERS        = osl_File_E_USERS,
100         E_OVERFLOW     = osl_File_E_OVERFLOW,
101         E_NOTREADY     = osl_File_E_NOTREADY,
102         E_LOCKED       = osl_File_E_LOCKED,
103         E_invalidError = osl_File_E_invalidError,   /* unmapped error: always last entry in enum! */
104         E_TIMEDOUT     = osl_File_E_TIMEDOUT,
105         E_NETWORK      = osl_File_E_NETWORK
106     };
107 
108 
109 public:
110 
111     /** Determine a valid unused canonical name for a requested name.
112 
113         Determines a valid unused canonical name for a requested name.
114         Depending on the Operating System and the File System the illegal characters are replaced by valid ones.
115         If a file or directory with the requested name already exists a new name is generated following
116         the common rules on the actual Operating System and File System.
117 
118         @param ustrRequestedURL [in]
119         Requested name of a file or directory.
120 
121         @param pustrValidURL [out]
122         On success receives a name which is unused and valid on the actual Operating System and
123         File System.
124 
125         @return
126         E_None on success
127         E_INVAL the format of the parameters was not valid
128 
129         @see DirectoryItem::getFileStatus()
130     */
131 
getCanonicalName(const::rtl::OUString & ustrRequestedURL,::rtl::OUString & ustrValidURL)132     static inline RC getCanonicalName( const ::rtl::OUString& ustrRequestedURL, ::rtl::OUString& ustrValidURL )
133     {
134         return (RC) osl_getCanonicalName( ustrRequestedURL.pData, &ustrValidURL.pData );
135     }
136 
137     /** Convert a path relative to a given directory into an full qualified file URL.
138 
139         Convert a path relative to a given directory into an full qualified file URL.
140         The function resolves symbolic links if possible and path ellipses, so on success
141         the resulting absolute path is fully resolved.
142 
143         @param ustrBaseDirectoryURL [in]
144         Base directory URL to which the relative path is related to.
145 
146         @param ustrRelativeFileURL [in]
147         An URL of a file or directory relative to the directory path specified by ustrBaseDirectoryURL
148         or an absolute path.
149         If ustrRelativeFileURL denotes an absolute path ustrBaseDirectoryURL will be ignored.
150 
151         @param ustrAbsoluteFileURL [out]
152         On success it receives the full qualified absoulte file URL.
153 
154         @return
155         E_None on success
156         E_INVAL the format of the parameters was not valid
157         E_NOMEM not enough memory for allocating structures
158         E_NOTDIR not a directory
159         E_ACCES permission denied
160         E_NOENT no such file or directory
161         E_NAMETOOLONG file name too long
162         E_OVERFLOW value too large for defined data type
163         E_FAULT bad address
164         E_INTR function call was interrupted
165         E_LOOP too many symbolic links encountered
166         E_MULTIHOP multihop attempted
167         E_NOLINK link has been severed
168 
169         @see DirectoryItem::getFileStatus()
170     */
171 
getAbsoluteFileURL(const::rtl::OUString & ustrBaseDirectoryURL,const::rtl::OUString & ustrRelativeFileURL,::rtl::OUString & ustrAbsoluteFileURL)172     static inline RC getAbsoluteFileURL( const ::rtl::OUString& ustrBaseDirectoryURL, const ::rtl::OUString& ustrRelativeFileURL, ::rtl::OUString& ustrAbsoluteFileURL )
173     {
174         return (RC) osl_getAbsoluteFileURL( ustrBaseDirectoryURL.pData, ustrRelativeFileURL.pData, &ustrAbsoluteFileURL.pData );
175     }
176 
177     /** Convert a file URL into a system dependend path.
178 
179         @param ustrFileURL [in]
180         A File URL.
181 
182         @param ustrSystemPath [out]
183         On success it receives the system path.
184 
185         @return
186         E_None on success
187         E_INVAL the format of the parameters was not valid
188 
189         @see getFileURLFromSystemPath()
190     */
191 
getSystemPathFromFileURL(const::rtl::OUString & ustrFileURL,::rtl::OUString & ustrSystemPath)192     static inline RC getSystemPathFromFileURL( const ::rtl::OUString& ustrFileURL, ::rtl::OUString& ustrSystemPath )
193     {
194         return (RC) osl_getSystemPathFromFileURL( ustrFileURL.pData, &ustrSystemPath.pData );
195     }
196 
197     /** Convert a system dependend path into a file URL.
198 
199         @param ustrSystemPath [in]
200         A System dependent path of a file or directory.
201 
202         @param ustrFileURL [out]
203         On success it receives the file URL.
204 
205         @return
206         E_None on success
207         E_INVAL the format of the parameters was not valid
208 
209         @see getSystemPathFromFileURL()
210     */
211 
getFileURLFromSystemPath(const::rtl::OUString & ustrSystemPath,::rtl::OUString & ustrFileURL)212     static inline RC getFileURLFromSystemPath( const ::rtl::OUString& ustrSystemPath, ::rtl::OUString& ustrFileURL )
213     {
214         return (RC) osl_getFileURLFromSystemPath( ustrSystemPath.pData, &ustrFileURL.pData );
215     }
216 
217     /** Searche a full qualified system path or a file URL.
218 
219         @param ustrFileName [in]
220         A system dependent path, a file URL, a file or relative directory
221 
222         @param ustrSearchPath [in]
223         A list of system paths, in which a given file has to be searched. The Notation of a path list is
224         system dependend, e.g. on UNIX system "/usr/bin:/bin" and on Windows "C:\BIN;C:\BATCH".
225         These paths are only for the search of a file or a relative path, otherwise it will be ignored.
226         If ustrSearchPath is NULL or while using the search path the search failed, the function searches for
227         a matching file in all system directories and in the directories listed in the PATH environment
228         variable.
229         The value of an environment variable should be used (e.g. LD_LIBRARY_PATH) if the caller is not
230         aware of the Operating System and so doesn't know which path list delimiter to use.
231 
232         @param ustrFileURL [out]
233         On success it receives the full qualified file URL.
234 
235         @return
236         E_None on success
237         E_INVAL the format of the parameters was not valid
238         E_NOTDIR not a directory
239         E_NOENT no such file or directory not found
240 
241         @see getFileURLFromSystemPath()
242         @see getSystemPathFromFileURL()
243     */
244 
searchFileURL(const::rtl::OUString & ustrFileName,const::rtl::OUString & ustrSearchPath,::rtl::OUString & ustrFileURL)245     static inline RC searchFileURL( const ::rtl::OUString& ustrFileName, const ::rtl::OUString& ustrSearchPath, ::rtl::OUString& ustrFileURL )
246     {
247         return (RC) osl_searchFileURL( ustrFileName.pData, ustrSearchPath.pData, &ustrFileURL.pData );
248     }
249 
250     /** Retrieves the file URL of the system's temporary directory path.
251 
252         @param ustrTempDirURL[out]
253         On success receives the URL of system's temporary directory path.
254 
255         @return
256         E_None on success
257         E_NOENT no such file or directory not found
258     */
259 
getTempDirURL(::rtl::OUString & ustrTempDirURL)260     static inline RC getTempDirURL( ::rtl::OUString& ustrTempDirURL )
261     {
262         return (RC) osl_getTempDirURL( &ustrTempDirURL.pData );
263     }
264 
265     /** Creates a temporary file in the directory provided by the caller or the
266         directory returned by getTempDirURL.
267         Under UNIX Operating Systems the file will be created with read and write
268         access for the user exclusively.
269         If the caller requests only a handle to the open file but not the name of
270         it, the file will be automatically removed on close else the caller is
271         responsible for removing the file on success.<br><br>
272 
273         @param  pustrDirectoryURL [in]
274         Specifies the full qualified URL where the temporary file should be created.
275         If pustrDirectoryURL is 0 the path returned by osl_getTempDirURL will be used.
276 
277         @param  pHandle [out]
278         On success receives a handle to the open file.
279         If pHandle is 0 the file will be closed on return, in this case
280         pustrTempFileURL must not be 0.
281 
282         @param  pustrTempFileURL [out]
283         On success receives the full qualified URL of the temporary file.
284         If pustrTempFileURL is 0 the file will be automatically removed
285         on close, in this case pHandle must not be 0.
286         If pustrTempFileURL is not 0 the caller receives the name of the
287         created file and is responsible for removing the file.
288 
289         @descr
290         Description of the different pHandle, ppustrTempFileURL parameter combinations.
291         pHandle is 0 and pustrTempDirURL is 0 - this combination is invalid<br>
292         pHandle is not 0 and pustrTempDirURL is 0 - a handle to the open file
293         will be returned on success and the file will be automatically removed on close<br>
294         pHandle is 0 and pustrTempDirURL is not 0 - the name of the file will be
295         returned, the caller is responsible for opening, closing and removing the file.<br>
296         pHandle is not 0 and pustrTempDirURL is not 0 - a handle to the open file as well as
297         the file name will be returned, the caller is responsible for closing and removing
298         the file.<br>
299 
300         @return
301         E_None   on success
302         E_INVAL  the format of the parameter is invalid
303         E_NOMEM  not enough memory for allocating structures
304         E_ACCES  Permission denied
305         E_NOENT  No such file or directory
306         E_NOTDIR Not a directory
307         E_ROFS   Read-only file system
308         E_NOSPC  No space left on device
309         E_DQUOT  Quota exceeded
310 
311         @see getTempDirURL()
312     */
313 
createTempFile(::rtl::OUString * pustrDirectoryURL,oslFileHandle * pHandle,::rtl::OUString * pustrTempFileURL)314     static inline RC createTempFile(
315         ::rtl::OUString* pustrDirectoryURL,
316         oslFileHandle*   pHandle,
317         ::rtl::OUString* pustrTempFileURL)
318     {
319         rtl_uString*  pustr_dir_url       = pustrDirectoryURL ? pustrDirectoryURL->pData : 0;
320         rtl_uString** ppustr_tmp_file_url = pustrTempFileURL  ? &pustrTempFileURL->pData : 0;
321 
322         return (RC) osl_createTempFile(pustr_dir_url, pHandle, ppustr_tmp_file_url);
323     }
324 };
325 
326 
327 // -----------------------------------------------------------------------------
328 /** The VolumeDevice class.
329 
330     @see VolumeInfo
331 */
332 #ifdef OS2
333 class VolumeInfo;
334 #endif
335 
336 class VolumeDevice : public FileBase
337 {
338 #ifdef OS2
339 public:
340 #endif
341     oslVolumeDeviceHandle   _aHandle;
342 
343 public:
344 
345     /** Constructor.
346     */
347 
VolumeDevice()348     VolumeDevice() : _aHandle( NULL )
349     {
350     }
351 
352     /** Copy constructor.
353 
354         @param rDevice
355         The other volume device.
356     */
357 
VolumeDevice(const VolumeDevice & rDevice)358     VolumeDevice( const VolumeDevice & rDevice )
359     {
360         _aHandle = rDevice._aHandle;
361         if ( _aHandle )
362             osl_acquireVolumeDeviceHandle( _aHandle );
363     }
364 
365     /** Destructor.
366     */
367 
~VolumeDevice()368     ~VolumeDevice()
369     {
370         if ( _aHandle )
371             osl_releaseVolumeDeviceHandle( _aHandle );
372     }
373 
374     /** Assignment operator.
375 
376         @param rDevice
377         The other volume device.
378     */
379 
operator =(const VolumeDevice & rDevice)380     inline VolumeDevice & operator =( const VolumeDevice & rDevice )
381     {
382         oslVolumeDeviceHandle   newHandle = rDevice._aHandle;
383 
384         if ( newHandle )
385             osl_acquireVolumeDeviceHandle( newHandle );
386 
387         if ( _aHandle )
388             osl_releaseVolumeDeviceHandle( _aHandle );
389 
390         _aHandle = newHandle;
391 
392         return *this;
393     }
394 
395     /** Automount a volume device.
396 
397         @return
398         E_None on success
399 
400         @todo
401         specify all error codes that may be returned
402     */
403 
automount()404     inline RC automount()
405     {
406         return (RC)osl_automountVolumeDevice( _aHandle );
407     }
408 
409     /** Unmount a volume device.
410 
411         @return
412         E_None on success
413 
414         @todo
415         specify all error codes that may be returned
416     */
417 
unmount()418     inline RC unmount()
419     {
420         return (RC)osl_unmountVolumeDevice( _aHandle );
421     }
422 
423     /** Get the full qualified URL where a device is mounted to.
424 
425         @return
426         The full qualified URL where the device is mounted to.
427     */
getMountPath()428     inline rtl::OUString getMountPath()
429     {
430         rtl::OUString   aPath;
431         osl_getVolumeDeviceMountPath( _aHandle, &aPath.pData );
432         return aPath;
433     }
434 
435     friend class VolumeInfo;
436 };
437 
438 // -----------------------------------------------------------------------------
439 
440 #define VolumeInfoMask_Attributes             osl_VolumeInfo_Mask_Attributes
441 #define VolumeInfoMask_TotalSpace             osl_VolumeInfo_Mask_TotalSpace
442 #define VolumeInfoMask_UsedSpace              osl_VolumeInfo_Mask_UsedSpace
443 #define VolumeInfoMask_FreeSpace              osl_VolumeInfo_Mask_FreeSpace
444 #define VolumeInfoMask_MaxNameLength          osl_VolumeInfo_Mask_MaxNameLength
445 #define VolumeInfoMask_MaxPathLength          osl_VolumeInfo_Mask_MaxPathLength
446 #define VolumeInfoMask_FileSystemName         osl_VolumeInfo_Mask_FileSystemName
447 #define VolumeInfoMask_FileSystemCaseHandling osl_VolumeInfo_Mask_FileSystemCaseHandling
448 
449 class Directory;
450 
451 /** The VolumeInfo class.
452 
453     Neither copy nor assignment is allowed for this class.
454 
455     @see Directory::getVolumeInfo
456 */
457 
458 
459 class VolumeInfo
460 {
461     oslVolumeInfo   _aInfo;
462     sal_uInt32      _nMask;
463     VolumeDevice    _aDevice;
464 
465     /** Copy constructor.
466     */
467 
468     VolumeInfo( VolumeInfo& );
469 
470     /** Assginment operator.
471     */
472 
473     VolumeInfo& operator = ( VolumeInfo& );
474 
475 public:
476 
477     /** Constructor.
478 
479         @param nMask
480         Set of flaggs decribing the demanded information.
481     */
482 
VolumeInfo(sal_uInt32 nMask)483     VolumeInfo( sal_uInt32 nMask ): _nMask( nMask )
484     {
485         _aInfo.uStructSize = sizeof( oslVolumeInfo );
486         rtl_fillMemory( &_aInfo.uValidFields, sizeof( oslVolumeInfo ) - sizeof( sal_uInt32 ), 0 );
487         _aInfo.pDeviceHandle = &_aDevice._aHandle;
488     }
489 
490     /** Destructor.
491     */
492 
~VolumeInfo()493     ~VolumeInfo()
494     {
495         if( _aInfo.ustrFileSystemName )
496             rtl_uString_release( _aInfo.ustrFileSystemName );
497     }
498 
499     /** Check if specified fields are valid.
500 
501         @param nMask
502         Set of flags for the fields to check.
503 
504         @return sal_True if all fields are valid else sal_False.
505     */
506 
isValid(sal_uInt32 nMask) const507     inline sal_Bool isValid( sal_uInt32 nMask ) const
508     {
509         return ( nMask & _aInfo.uValidFields ) == nMask;
510     }
511 
512     /** Check the remote flag.
513 
514         @return
515         sal_True if Attributes are valid and the volume is remote else sal_False.
516     */
517 
getRemoteFlag() const518     inline sal_Bool getRemoteFlag() const
519     {
520         return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_Remote);
521     }
522 
523     /** Check the removeable flag.
524 
525         @return
526         sal_True if attributes are valid and the volume is removable else sal_False.
527     */
528 
getRemoveableFlag() const529     inline sal_Bool getRemoveableFlag() const
530     {
531         return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_Removeable);
532     }
533 
534     /** Check the compact disc flag.
535 
536         @return
537         sal_True if attributes are valid and the volume is a CDROM else sal_False.
538     */
539 
getCompactDiscFlag() const540     inline sal_Bool getCompactDiscFlag() const
541     {
542         return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_CompactDisc);
543     }
544 
545     /** Check the floppy disc flag.
546 
547         @return
548         sal_True if attributes are valid and the volume is a floppy disk else sal_False.
549     */
550 
getFloppyDiskFlag() const551     inline sal_Bool getFloppyDiskFlag() const
552     {
553         return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_FloppyDisk);
554     }
555 
556     /** Check the fixed disk flag.
557 
558         @return
559         sal_True if attributes are valid and the volume is a fixed disk else sal_False.
560     */
561 
getFixedDiskFlag() const562     inline sal_Bool getFixedDiskFlag() const
563     {
564         return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_FixedDisk);
565     }
566 
567     /** Check the RAM disk flag.
568 
569         @return
570         sal_True if attributes are valid and the volume is a RAM disk else sal_False.
571     */
572 
getRAMDiskFlag() const573     inline sal_Bool getRAMDiskFlag() const
574     {
575         return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_RAMDisk);
576     }
577 
578     /** Determine the total space of a volume device.
579 
580         @return
581         The total diskspace of this volume if this information is valid,
582         0 otherwise.
583     */
584 
getTotalSpace() const585     inline sal_uInt64 getTotalSpace() const
586     {
587         return _aInfo.uTotalSpace;
588     }
589 
590     /** Determine the free space of a volume device.
591 
592         @return
593         The free diskspace of this volume if this information is valid,
594         0 otherwise.
595     */
596 
getFreeSpace() const597     inline sal_uInt64 getFreeSpace() const
598     {
599         return _aInfo.uFreeSpace;
600     }
601 
602     /** Determine the used space of a volume device.
603 
604         @return
605         The used diskspace of this volume if this information is valid,
606         0 otherwise.
607     */
608 
getUsedSpace() const609     inline sal_uInt64 getUsedSpace() const
610     {
611         return _aInfo.uUsedSpace;
612     }
613 
614     /** Determine the maximal length of a file name.
615 
616         @return
617         The maximal length of a file name if this information is valid,
618         0 otherwise.
619     */
620 
getMaxNameLength() const621     inline sal_uInt32 getMaxNameLength() const
622     {
623         return _aInfo.uMaxNameLength;
624     }
625 
626     /** Determine the maximal length of a path name.
627 
628         @return
629         The maximal length of a path if this information is valid,
630         0 otherwise.
631     */
632 
getMaxPathLength() const633     inline sal_uInt32 getMaxPathLength() const
634     {
635         return _aInfo.uMaxPathLength;
636     }
637 
638     /** Determine the name of the volume device's File System.
639 
640         @return
641         The name of the volume's fielsystem if this information is valid,
642         otherwise an empty string.
643     */
644 
getFileSystemName() const645     inline ::rtl::OUString getFileSystemName() const
646     {
647         return _aInfo.ustrFileSystemName ? ::rtl::OUString( _aInfo.ustrFileSystemName ) : ::rtl::OUString();
648     }
649 
650 
651     /** Get the volume device handle.
652 
653         @return
654         The device handle of the volume if this information is valid,
655         otherwise returns NULL;
656     */
657 
getDeviceHandle() const658     inline VolumeDevice getDeviceHandle() const
659     {
660         return _aDevice;
661     }
662 
663     /** Return whether the file system is case sensitive or
664         case insensitive
665 
666         @return
667         true if the file system is case sensitive false otherwise
668     */
isCaseSensitiveFileSystem() const669     bool isCaseSensitiveFileSystem() const
670     {
671         return (_aInfo.uAttributes & osl_Volume_Attribute_Case_Sensitive);
672     }
673 
674     /** Return whether the file system preserves the case of
675         file and directory names or not
676 
677         @return
678         true if the file system preserves the case of file and
679         directory names false otherwise
680     */
isCasePreservingFileSystem() const681     bool isCasePreservingFileSystem() const
682     {
683         return (_aInfo.uAttributes & osl_Volume_Attribute_Case_Is_Preserved);
684     }
685 
686     friend class Directory;
687 };
688 
689 // -----------------------------------------------------------------------------
690 
691 #define FileStatusMask_Type             osl_FileStatus_Mask_Type
692 #define FileStatusMask_Attributes       osl_FileStatus_Mask_Attributes
693 #define FileStatusMask_CreationTime     osl_FileStatus_Mask_CreationTime
694 #define FileStatusMask_AccessTime       osl_FileStatus_Mask_AccessTime
695 #define FileStatusMask_ModifyTime       osl_FileStatus_Mask_ModifyTime
696 #define FileStatusMask_FileSize         osl_FileStatus_Mask_FileSize
697 #define FileStatusMask_FileName         osl_FileStatus_Mask_FileName
698 #define FileStatusMask_FileURL          osl_FileStatus_Mask_FileURL
699 #define FileStatusMask_LinkTargetURL    osl_FileStatus_Mask_LinkTargetURL
700 #define FileStatusMask_All              osl_FileStatus_Mask_All
701 #define FileStatusMask_Validate         osl_FileStatus_Mask_Validate
702 
703 #define Attribute_ReadOnly     osl_File_Attribute_ReadOnly
704 #define Attribute_Hidden       osl_File_Attribute_Hidden
705 #define Attribute_Executable   osl_File_Attribute_Executable
706 #define Attribute_GrpWrite     osl_File_Attribute_GrpWrite
707 #define Attribute_GrpRead      osl_File_Attribute_GrpRead
708 #define Attribute_GrpExe       osl_File_Attribute_GrpExe
709 #define Attribute_OwnWrite     osl_File_Attribute_OwnWrite
710 #define Attribute_OwnRead      osl_File_Attribute_OwnRead
711 #define Attribute_OwnExe       osl_File_Attribute_OwnExe
712 #define Attribute_OthWrite     osl_File_Attribute_OthWrite
713 #define Attribute_OthRead      osl_File_Attribute_OthRead
714 #define Attribute_OthExe       osl_File_Attribute_OthExe
715 
716 class DirectoryItem;
717 
718 /** The FileStatus class.
719 
720     @see DirectoryItem::getFileStatus
721 */
722 
723 class FileStatus
724 {
725     oslFileStatus   _aStatus;
726     sal_uInt32      _nMask;
727 
728     /** Copy constructor.
729     */
730 
731     FileStatus( FileStatus& );
732 
733     /** Assignment operator.
734     */
735 
736     FileStatus& operator = ( FileStatus& );
737 
738 public:
739 
740     enum Type {
741         Directory = osl_File_Type_Directory,
742         Volume    = osl_File_Type_Volume,
743         Regular   = osl_File_Type_Regular,
744         Fifo      = osl_File_Type_Fifo,
745         Socket    = osl_File_Type_Socket,
746         Link      = osl_File_Type_Link,
747         Special   = osl_File_Type_Special,
748         Unknown   = osl_File_Type_Unknown
749     };
750 
751     /** Constructor.
752 
753         @param nMask
754         Set of flaggs decribing the demanded information.
755     */
756 
FileStatus(sal_uInt32 nMask)757     FileStatus( sal_uInt32 nMask ): _nMask( nMask )
758     {
759         _aStatus.uStructSize = sizeof( oslFileStatus );
760         rtl_fillMemory( &_aStatus.uValidFields, sizeof( oslFileStatus ) - sizeof( sal_uInt32 ), 0 );
761     }
762 
763     /** Destructor.
764     */
765 
~FileStatus()766     ~FileStatus()
767     {
768         if ( _aStatus.ustrFileURL )
769             rtl_uString_release( _aStatus.ustrFileURL );
770         if ( _aStatus.ustrLinkTargetURL )
771             rtl_uString_release( _aStatus.ustrLinkTargetURL );
772         if ( _aStatus.ustrFileName )
773             rtl_uString_release( _aStatus.ustrFileName );
774     }
775 
776     /** Check if specified fields are valid.
777 
778         @param nMask
779         Set of flags for the fields to check.
780 
781         @return
782         sal_True if all fields are valid else sal_False.
783     */
784 
isValid(sal_uInt32 nMask) const785     inline sal_Bool isValid( sal_uInt32 nMask ) const
786     {
787         return ( nMask & _aStatus.uValidFields ) == nMask;
788     }
789 
790     /** Get the file type.
791 
792         @return
793         The file type if this information is valid, Unknown otherwise.
794     */
getFileType() const795     inline Type getFileType() const
796     {
797         return (_aStatus.uValidFields & FileStatusMask_Type) ?  (Type) _aStatus.eType : Unknown;
798     }
799 
800     /** Get the file attributes.
801 
802         @return
803         The set of attribute flags of this file.
804     */
805 
getAttributes() const806     inline sal_uInt64 getAttributes() const
807     {
808         return _aStatus.uAttributes;
809     }
810 
811     /** Get the creation time of this file.
812 
813         @return
814         The creation time if this information is valid,
815         an uninitialized TimeValue otherwise.
816     */
817 
getCreationTime() const818     inline TimeValue getCreationTime() const
819     {
820         return _aStatus.aCreationTime;
821     }
822 
823     /** Get the file access time.
824 
825         @return
826         The last access time if this information is valid,
827         an uninitialized TimeValue otherwise.
828     */
829 
getAccessTime() const830     inline TimeValue getAccessTime() const
831     {
832         return _aStatus.aAccessTime;
833     }
834 
835     /** Get the file modification time.
836 
837         @return
838         The last modified time if this information is valid,
839         an uninitialized TimeValue otherwise.
840     */
841 
getModifyTime() const842     inline TimeValue getModifyTime() const
843     {
844         return _aStatus.aModifyTime;
845     }
846 
847     /** Get the size of the file.
848 
849         @return
850         The actual file size if this information is valid, 0 otherwise.
851     */
852 
getFileSize() const853     inline sal_uInt64 getFileSize() const
854     {
855         return _aStatus.uFileSize;
856     }
857 
858     /** Get the file name.
859 
860         @return
861         The file name if this information is valid, an empty string otherwise.
862     */
863 
getFileName() const864     inline ::rtl::OUString getFileName() const
865     {
866         return _aStatus.ustrFileName ? ::rtl::OUString(_aStatus.ustrFileName) : ::rtl::OUString();
867     }
868 
869 
870     /** Get the URL of the file.
871 
872         @return
873         The full qualified URL of the file if this information is valid, an empty string otherwise.
874     */
875 
getFileURL() const876     inline ::rtl::OUString getFileURL() const
877     {
878         return _aStatus.ustrFileURL ? ::rtl::OUString(_aStatus.ustrFileURL) : ::rtl::OUString();
879     }
880 
881     /** Get the link target URL.
882 
883         @return
884         The link target URL if this information is valid, an empty string otherwise.
885     */
886 
getLinkTargetURL() const887     inline ::rtl::OUString getLinkTargetURL() const
888     {
889         return _aStatus.ustrLinkTargetURL ? ::rtl::OUString(_aStatus.ustrLinkTargetURL) : ::rtl::OUString();
890     }
891 
892     friend class DirectoryItem;
893 };
894 
895 
896 // -----------------------------------------------------------------------------
897 /** The file class object provides access to file contents and attributes.
898 
899     @see Directory
900     @see DirectoryItem
901  */
902 
903 class File: public FileBase
904 {
905     oslFileHandle   _pData;
906     ::rtl::OUString _aPath;
907 
908     /** Copy constructor.
909     */
910 
911     File( File& );
912 
913     /** Assginment operator.
914     */
915 
916     File& operator = ( File& );
917 
918 public:
919 
920     /** Constructor.
921 
922         @param  ustrFileURL [in]
923         The full qualified URL of the file. Relative paths are not allowed.
924     */
925 
File(const::rtl::OUString & ustrFileURL)926     File( const ::rtl::OUString& ustrFileURL ): _pData( 0 ), _aPath( ustrFileURL ) {}
927 
928     /** Destructor
929     */
930 
~File()931     inline ~File()
932     {
933         close();
934     }
935 
936     #define OpenFlag_Read   osl_File_OpenFlag_Read
937     #define OpenFlag_Write  osl_File_OpenFlag_Write
938     #define OpenFlag_Create osl_File_OpenFlag_Create
939     #define OpenFlag_NoLock osl_File_OpenFlag_NoLock
940 
941     /** Open a regular file.
942 
943         Open a file. Only regular files can be openend.
944 
945         @param uFlags [in]
946         Specifies the open mode.
947 
948         @return
949         E_None on success
950         E_NOMEM not enough memory for allocating structures
951         E_INVAL the format of the parameters was not valid
952         E_NAMETOOLONG pathname was too long
953         E_NOENT no such file or directory
954         E_ACCES permission denied
955         E_AGAIN a write lock could not be established
956         E_NOTDIR not a directory
957         E_NXIO no such device or address
958         E_NODEV no such device
959         E_ROFS read-only file system
960         E_TXTBSY text file busy
961         E_FAULT bad address
962         E_LOOP too many symbolic links encountered
963         E_NOSPC no space left on device
964         E_ISDIR is a directory
965         E_MFILE too many open files used by the process
966         E_NFILE too many open files in the system
967         E_DQUOT quota exceeded
968         E_EXIST file exists
969         E_INTR function call was interrupted
970         E_IO on I/O errors
971         E_MULTIHOP multihop attempted
972         E_NOLINK link has been severed
973         E_EOVERFLOW value too large for defined data type
974 
975         @see close()
976         @see setPos()
977         @see getPos()
978         @see read()
979         @see write()
980         @see getSize()
981         @see setSize()
982     */
983 
open(sal_uInt32 uFlags)984     inline RC open( sal_uInt32 uFlags )
985     {
986         return (RC) osl_openFile( _aPath.pData, &_pData, uFlags );
987     }
988 
989     /** Close an open file.
990 
991         @return
992         E_None on success
993         E_INVAL the format of the parameters was not valid
994         E_BADF Bad file
995         E_INTR function call was interrupted
996         E_NOLINK link has been severed
997         E_NOSPC no space left on device
998         E_IO on I/O errors
999 
1000         @see open()
1001     */
1002 
close()1003     inline RC close()
1004     {
1005         oslFileError Error = osl_File_E_BADF;
1006 
1007         if( _pData )
1008         {
1009             Error=osl_closeFile( _pData );
1010             _pData = NULL;
1011         }
1012 
1013         return (RC) Error;
1014     }
1015 
1016 
1017     #define Pos_Absolut osl_Pos_Absolut
1018     #define Pos_Current osl_Pos_Current
1019     #define Pos_End     osl_Pos_End
1020 
1021     /** Set the internal position pointer of an open file.
1022 
1023         @param uHow [in]
1024         Distance to move the internal position pointer (from uPos).
1025 
1026         @param uPos [in]
1027         Absolute position from the beginning of the file.
1028 
1029         @return
1030         E_None on success
1031         E_INVAL the format of the parameters was not valid
1032         E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files
1033 
1034         @see open()
1035         @see getPos()
1036     */
1037 
setPos(sal_uInt32 uHow,sal_Int64 uPos)1038     inline RC setPos( sal_uInt32 uHow, sal_Int64 uPos )
1039     {
1040         return (RC) osl_setFilePos( _pData, uHow, uPos );
1041     }
1042 
1043     /** Retrieve the current position of the internal pointer of an open file.
1044 
1045         @param uPos [out]
1046         On success receives the current position of the file pointer.
1047 
1048         @return
1049         E_None on success
1050         E_INVAL the format of the parameters was not valid
1051         E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files
1052 
1053         @see open()
1054         @see setPos()
1055         @see read()
1056         @see write()
1057     */
1058 
getPos(sal_uInt64 & uPos)1059     inline RC getPos( sal_uInt64& uPos )
1060     {
1061         return (RC) osl_getFilePos( _pData, &uPos );
1062     }
1063 
1064     /** Test if the end of a file is reached.
1065 
1066         @param pIsEOF [out]
1067         Points to a variable that receives the end-of-file status.
1068 
1069         @return
1070         E_None on success
1071         E_INVAL the format of the parameters was not valid
1072         E_INTR function call was interrupted
1073         E_IO on I/O errors
1074         E_ISDIR is a directory
1075         E_BADF bad file
1076         E_FAULT bad address
1077         E_AGAIN operation would block
1078         E_NOLINK link has been severed
1079 
1080         @see open()
1081         @see read()
1082         @see readLine()
1083         @see setPos()
1084     */
1085 
isEndOfFile(sal_Bool * pIsEOF)1086     inline RC isEndOfFile( sal_Bool *pIsEOF )
1087     {
1088         return (RC) osl_isEndOfFile( _pData, pIsEOF );
1089     }
1090 
1091     /** Set the file size of an open file.
1092 
1093         Sets the file size of an open file. The file can be truncated or enlarged by the function.
1094         The position of the file pointer is not affeced by this function.
1095 
1096         @param uSize [in]
1097         New size in bytes.
1098 
1099         @return
1100         E_None on success
1101         E_INVAL the format of the parameters was not valid
1102         E_OVERFLOW the resulting file offset would be a value which cannot  be represented correctly for regular files
1103 
1104         @see open()
1105         @see setPos()
1106         @see getStatus()
1107     */
1108 
setSize(sal_uInt64 uSize)1109     inline RC setSize( sal_uInt64 uSize )
1110     {
1111         return (RC) osl_setFileSize( _pData, uSize );
1112     }
1113 
1114     /** Get the file size of an open file.
1115 
1116         Gets the file size of an open file.
1117         The position of the file pointer is not affeced by this function.
1118 
1119         @param rSize [out]
1120         Current size in bytes.
1121 
1122         @return
1123         E_None on success
1124         E_INVAL the format of the parameters was not valid
1125         E_OVERFLOW the resulting file offset would be a value which cannot  be represented correctly for regular files
1126 
1127         @see open()
1128         @see setPos()
1129         @see getSize()
1130         @see setSize()
1131         @see getStatus()
1132     */
1133 
getSize(sal_uInt64 & rSize)1134     inline RC getSize( sal_uInt64 &rSize )
1135     {
1136         return (RC) osl_getFileSize( _pData, &rSize );
1137     }
1138 
1139     /** Read a number of bytes from a file.
1140 
1141         Reads a number of bytes from a file. The internal file pointer is
1142         increased by the number of bytes read.
1143 
1144         @param pBuffer [out]
1145         Points to a buffer which receives data. The buffer must be large enough
1146         to hold uBytesRequested bytes.
1147 
1148         @param uBytesRequested [in]
1149         Number of bytes which should be retrieved.
1150 
1151         @param rBytesRead [out]
1152         On success the number of bytes which have actually been retrieved.
1153 
1154         @return
1155         E_None on success
1156         E_INVAL the format of the parameters was not valid
1157         E_INTR function call was interrupted
1158         E_IO on I/O errors
1159         E_ISDIR is a directory
1160         E_BADF bad file
1161         E_FAULT bad address
1162         E_AGAIN operation would block
1163         E_NOLINK link has been severed
1164 
1165         @see open()
1166         @see write()
1167         @see readLine()
1168         @see setPos()
1169     */
1170 
read(void * pBuffer,sal_uInt64 uBytesRequested,sal_uInt64 & rBytesRead)1171     inline RC read( void *pBuffer, sal_uInt64 uBytesRequested, sal_uInt64& rBytesRead )
1172     {
1173         return (RC) osl_readFile( _pData, pBuffer, uBytesRequested, &rBytesRead );
1174     }
1175 
1176     /** Write a number of bytes to a file.
1177 
1178         Writes a number of bytes to a file.
1179         The internal file pointer is increased by the number of bytes read.
1180 
1181         @param pBuffer [in]
1182         Points to a buffer which contains the data.
1183 
1184         @param uBytesToWrite [in]
1185         Number of bytes which should be written.
1186 
1187         @param rBytesWritten [out]
1188         On success the number of bytes which have actually been written.
1189 
1190         @return
1191         E_None on success
1192         E_INVAL the format of the parameters was not valid
1193         E_FBIG file too large
1194         E_DQUOT quota exceeded
1195         E_AGAIN operation would block
1196         E_BADF bad file
1197         E_FAULT bad address
1198         E_INTR function call was interrupted
1199         E_IO on I/O errosr
1200         E_NOLCK no record locks available
1201         E_NOLINK link has been severed
1202         E_NOSPC no space left on device
1203         E_NXIO no such device or address
1204 
1205         @see open()
1206         @see read()
1207         @see setPos()
1208     */
1209 
write(const void * pBuffer,sal_uInt64 uBytesToWrite,sal_uInt64 & rBytesWritten)1210     inline RC write(const void *pBuffer, sal_uInt64 uBytesToWrite, sal_uInt64& rBytesWritten)
1211     {
1212         return (RC) osl_writeFile( _pData, pBuffer, uBytesToWrite, &rBytesWritten );
1213     }
1214 
1215 
1216     /** Read a line from a file.
1217 
1218         Reads a line from a file. The new line delimiter is NOT returned!
1219 
1220         @param  aSeq [in/out]
1221         A reference to a ::rtl::ByteSequence that will hold the line read on success.
1222 
1223         @return
1224         E_None on success
1225         E_INVAL the format of the parameters was not valid
1226         E_INTR function call was interrupted
1227         E_IO on I/O errors
1228         E_ISDIR is a directory
1229         E_BADF bad file
1230         E_FAULT bad address
1231         E_AGAIN operation would block
1232         E_NOLINK link has been severed
1233 
1234         @see open()
1235         @see read()
1236         @see write()
1237         @see setPos()
1238     */
1239 
readLine(::rtl::ByteSequence & aSeq)1240     inline RC readLine( ::rtl::ByteSequence& aSeq )
1241     {
1242         return (RC) osl_readLine( _pData, reinterpret_cast<sal_Sequence**>(&aSeq) );
1243     }
1244 
1245     /** Synchronize the memory representation of a file with that on the physical medium.
1246 
1247     The function ensures that all modified data and attributes of the file associated with
1248     the given file handle have been written to the physical medium.
1249     In case the hard disk has a write cache enabled, the data may not really be on
1250     permanent storage when osl_syncFile returns.
1251 
1252     @return
1253     <dl>
1254     <dt>E_None</dt>
1255     <dd>On success</dd>
1256     <dt>E_INVAL</dt>
1257     <dd>The value of the input parameter is invalid</dd>
1258     </dl>
1259     <br><p><strong>In addition to these error codes others may occur as well, for instance:</strong></p><br>
1260     <dt>E_BADF</dt>
1261     <dd>The file is not open for writing</dd>
1262     <dt>E_IO</dt>
1263     <dd>An I/O error occurred</dd>
1264     <dt>E_NOSPC</dt>
1265     <dd>There is no enough space on the target device</dd>
1266     <dt>E_ROFS</dt>
1267     <dd>The file is located on a read only file system</dd>
1268     <dt>E_TIMEDOUT</dt>
1269     <dd>A remote connection timed out. This may happen when a file is on a remote location</dd>
1270     </dl>
1271 
1272     @see osl_syncFile()
1273     @see open()
1274     @see write()
1275     */
sync() const1276     inline RC sync() const
1277     {
1278         OSL_PRECOND(_pData, "File::sync(): File not open");
1279         return (RC)osl_syncFile(_pData);
1280     }
1281 
1282     /** Copy a file to a new destination.
1283 
1284         Copies a file to a new destination. Copies only files not directories.
1285         No assumptions should be made about preserving attributes or file time.
1286 
1287         @param ustrSourceFileURL [in]
1288         Full qualified URL of the source file.
1289 
1290         @param ustrDestFileURL [in]
1291         Full qualified URL of the destination file. A directory is NOT a valid destination file!
1292 
1293         @return
1294         E_None on success
1295         E_INVAL the format of the parameters was not valid
1296         E_NOMEM not enough memory for allocating structures
1297         E_ACCES permission denied
1298         E_PERM operation not permitted
1299         E_NAMETOOLONG file name too long
1300         E_NOENT no such file or directory
1301         E_ISDIR is a directory
1302         E_ROFS read-only file system
1303 
1304         @see move()
1305         @see remove()
1306     */
1307 
copy(const::rtl::OUString & ustrSourceFileURL,const::rtl::OUString & ustrDestFileURL)1308     inline static RC copy( const ::rtl::OUString& ustrSourceFileURL, const ::rtl::OUString& ustrDestFileURL )
1309     {
1310         return (RC) osl_copyFile( ustrSourceFileURL.pData, ustrDestFileURL.pData );
1311     }
1312 
1313     /** Move a file or directory to a new destination or renames it.
1314 
1315         Moves a file or directory to a new destination or renames it.
1316         File time and attributes are preserved.
1317 
1318         @param ustrSourceFileURL [in]
1319         Full qualified URL of the source file.
1320 
1321         @param ustrDestFileURL [in]
1322         Full qualified URL of the destination file. An existing directory is NOT a valid destination !
1323 
1324         @return
1325         E_None on success
1326         E_INVAL the format of the parameters was not valid
1327         E_NOMEM not enough memory for allocating structures
1328         E_ACCES permission denied
1329         E_PERM operation not permitted
1330         E_NAMETOOLONG file name too long
1331         E_NOENT no such file or directory
1332         E_ROFS read-only file system
1333 
1334         @see copy()
1335     */
1336 
move(const::rtl::OUString & ustrSourceFileURL,const::rtl::OUString & ustrDestFileURL)1337     inline static RC move( const ::rtl::OUString& ustrSourceFileURL, const ::rtl::OUString& ustrDestFileURL )
1338     {
1339         return (RC) osl_moveFile( ustrSourceFileURL.pData, ustrDestFileURL.pData );
1340     }
1341 
1342     /** Remove a regular file.
1343 
1344         @param ustrFileURL [in]
1345         Full qualified URL of the file to remove.
1346 
1347         @return
1348         E_None on success
1349         E_INVAL the format of the parameters was not valid
1350         E_NOMEM not enough memory for allocating structures
1351         E_ACCES permission denied
1352         E_PERM operation not permitted
1353         E_NAMETOOLONG file name too long
1354         E_NOENT no such file or directory
1355         E_ISDIR is a directory
1356         E_ROFS read-only file system
1357         E_FAULT bad address
1358         E_LOOP too many symbolic links encountered
1359         E_IO on I/O errors
1360         E_BUSY device or resource busy
1361         E_INTR function call was interrupted
1362         E_LOOP too many symbolic links encountered
1363         E_MULTIHOP multihop attempted
1364         E_NOLINK link has been severed
1365         E_TXTBSY text file busy
1366 
1367         @see open()
1368     */
1369 
remove(const::rtl::OUString & ustrFileURL)1370     inline static RC remove( const ::rtl::OUString& ustrFileURL )
1371     {
1372         return (RC) osl_removeFile( ustrFileURL.pData );
1373     }
1374 
1375     /** Set file attributes.
1376 
1377         @param ustrFileURL [in]
1378         The full qualified file URL.
1379 
1380         @param uAttributes [in]
1381         Attributes of the file to be set.
1382 
1383         @return
1384         E_None on success
1385         E_INVAL the format of the parameters was not valid
1386 
1387         @see FileStatus
1388     */
1389 
setAttributes(const::rtl::OUString & ustrFileURL,sal_uInt64 uAttributes)1390     inline static RC setAttributes( const ::rtl::OUString& ustrFileURL, sal_uInt64 uAttributes )
1391     {
1392         return (RC) osl_setFileAttributes( ustrFileURL.pData, uAttributes );
1393     }
1394 
1395     /** Set the file time.
1396 
1397         @param ustrFileURL [in]
1398         The full qualified URL of the file.
1399 
1400         @param rCreationTime [in]
1401         Creation time of the given file.
1402 
1403         @param rLastAccessTime [in]
1404         Time of the last access of the given file.
1405 
1406         @param rLastWriteTime [in]
1407         Time of the last modifying of the given file.
1408 
1409         @return
1410         E_None on success
1411         E_INVAL the format of the parameters was not valid
1412         E_NOENT no such file or directory not found
1413 
1414         @see FileStatus
1415     */
1416 
setTime(const::rtl::OUString & ustrFileURL,const TimeValue & rCreationTime,const TimeValue & rLastAccessTime,const TimeValue & rLastWriteTime)1417     inline static RC setTime(
1418         const ::rtl::OUString& ustrFileURL,
1419         const TimeValue& rCreationTime,
1420         const TimeValue& rLastAccessTime,
1421         const TimeValue& rLastWriteTime )
1422     {
1423         return (RC)  osl_setFileTime(
1424             ustrFileURL.pData,
1425             &rCreationTime,
1426             &rLastAccessTime,
1427             &rLastWriteTime );
1428     }
1429 
1430     friend class DirectoryItem;
1431 };
1432 
1433 // -----------------------------------------------------------------------------
1434 /** The directory item class object provides access to file status information.
1435 
1436     @see FileStatus
1437  */
1438 
1439 class DirectoryItem: public FileBase
1440 {
1441     oslDirectoryItem _pData;
1442 
1443 public:
1444 
1445     /** Constructor.
1446     */
1447 
DirectoryItem()1448     DirectoryItem(): _pData( NULL )
1449     {
1450     }
1451 
1452     /** Copy constructor.
1453     */
1454 
DirectoryItem(const DirectoryItem & rItem)1455     DirectoryItem( const DirectoryItem& rItem ): _pData( rItem._pData)
1456     {
1457         if( _pData )
1458             osl_acquireDirectoryItem( _pData );
1459     }
1460 
1461     /** Destructor.
1462     */
1463 
~DirectoryItem()1464     ~DirectoryItem()
1465     {
1466         if( _pData )
1467             osl_releaseDirectoryItem( _pData );
1468     }
1469 
1470     /** Assignment operator.
1471     */
1472 
operator =(const DirectoryItem & rItem)1473     DirectoryItem& operator=(const DirectoryItem& rItem )
1474     {
1475         if (&rItem != this)
1476         {
1477             if( _pData )
1478                 osl_releaseDirectoryItem( _pData );
1479 
1480             _pData = rItem._pData;
1481 
1482             if( _pData )
1483                 osl_acquireDirectoryItem( _pData );
1484         }
1485         return *this;
1486     }
1487 
1488     /** Check for validity of this instance.
1489 
1490         @return
1491         sal_True if object is valid directory item else sal_False.
1492      */
1493 
is()1494     inline sal_Bool is()
1495     {
1496         return _pData != NULL;
1497     }
1498 
1499     /** Retrieve a single directory item.
1500 
1501         Retrieves a single directory item. The returned handle has an initial refcount of 1.
1502         Due to performance issues it is not recommended to use this function while
1503         enumerating the contents of a directory. In this case use osl_getNextDirectoryItem() instead.
1504 
1505         @param ustrFileURL [in]
1506         An absolute file URL.
1507 
1508         @param rItem [out]
1509         On success it receives a handle which can be used for subsequent calls to osl_getFileStatus().
1510         The handle has to be released by a call to osl_releaseDirectoryItem().
1511 
1512         @return
1513         E_None on success
1514         E_INVAL the format of the parameters was not valid
1515         E_NOMEM not enough memory for allocating structures
1516         E_ACCES permission denied
1517         E_MFILE too many open files used by the process
1518         E_NFILE too many open files in the system
1519         E_NOENT no such file or directory
1520         E_LOOP  too many symbolic links encountered
1521         E_NAMETOOLONG the file name is too long
1522         E_NOTDIR a component of the path prefix of path is not a directory
1523         E_IO on I/O errors
1524         E_MULTIHOP multihop attempted
1525         E_NOLINK link has been severed
1526         E_FAULT bad address
1527         E_INTR the function call was interrupted
1528 
1529         @see FileStatus
1530         @see Directory::getNextItem()
1531     */
1532 
get(const::rtl::OUString & ustrFileURL,DirectoryItem & rItem)1533     static inline RC get( const ::rtl::OUString& ustrFileURL, DirectoryItem& rItem )
1534     {
1535         if( rItem._pData)
1536         {
1537             osl_releaseDirectoryItem( rItem._pData );
1538             rItem._pData = NULL;
1539         }
1540 
1541         return (RC) osl_getDirectoryItem( ustrFileURL.pData, &rItem._pData );
1542     }
1543 
1544     /** Retrieve information about a single file or directory.
1545 
1546         @param  rStatus [in|out]
1547         Reference to a class which receives the information of the file or directory
1548         represented by this directory item.
1549 
1550         @return
1551         E_None on success
1552         E_NOMEM not enough memory for allocating structures
1553         E_INVAL the format of the parameters was not valid
1554         E_LOOP too many symbolic links encountered
1555         E_ACCES permission denied
1556         E_NOENT no such file or directory
1557         E_NAMETOOLONG file name too long
1558         E_BADF invalid oslDirectoryItem parameter
1559         E_FAULT bad address
1560         E_OVERFLOW value too large for defined data type
1561         E_INTR function call was interrupted
1562         E_NOLINK link has been severed
1563         E_MULTIHOP components of path require hopping to multiple remote machines and the file system does not allow it
1564         E_MFILE too many open files used by the process
1565         E_NFILE too many open files in the system
1566         E_NOSPC no space left on device
1567         E_NXIO no such device or address
1568         E_IO on I/O errors
1569         E_NOSYS function not implemented
1570 
1571         @see get()
1572         @see Directory::getNextItem()
1573         @see FileStatus
1574     */
1575 
getFileStatus(FileStatus & rStatus)1576     inline RC getFileStatus( FileStatus& rStatus )
1577     {
1578         return (RC) osl_getFileStatus( _pData, &rStatus._aStatus, rStatus._nMask );
1579     }
1580 
1581     friend class Directory;
1582 };
1583 
1584 //###########################################
1585 
1586 /** Base class for observers of directory creation notifications.
1587 
1588     Clients which uses the method createDirectoryPath of the class
1589     Directory may want to be informed about the directories that
1590     have been created. This may be accomplished by deriving from
1591     this base class and overwriting the virtual function
1592     DirectoryCreated.
1593 
1594     @see Directory::createPath
1595 */
1596 class DirectoryCreationObserver
1597 {
1598 public:
~DirectoryCreationObserver()1599     virtual ~DirectoryCreationObserver() {}
1600 
1601     /** This method will be called when a new directory has been
1602         created and needs to be overwritten by derived classes.
1603         You must not delete the directory that was just created
1604         otherwise you will run into an endless loop.
1605 
1606         @param aDirectoryUrl
1607         [in]The absolute file URL of the directory that was just created by
1608         ::osl::Directory::createPath.
1609     */
1610     virtual void DirectoryCreated(const rtl::OUString& aDirectoryUrl) = 0;
1611 };
1612 
1613 //###########################################
1614 // This just an internal helper function for
1615 // private use.
onDirectoryCreated(void * pData,rtl_uString * aDirectoryUrl)1616 extern "C" inline void SAL_CALL onDirectoryCreated(void* pData, rtl_uString* aDirectoryUrl)
1617 {
1618     (static_cast<DirectoryCreationObserver*>(pData))->DirectoryCreated(aDirectoryUrl);
1619 }
1620 
1621 /** The directory class object provides a enumeration of DirectoryItems.
1622 
1623     @see DirectoryItem
1624     @see File
1625  */
1626 
1627 class Directory: public FileBase
1628 {
1629     oslDirectory    _pData;
1630     ::rtl::OUString _aPath;
1631 
1632     /** Copy constructor.
1633     */
1634 
1635     Directory( Directory& );
1636 
1637     /**  Assignment operator.
1638     */
1639 
1640     Directory& operator = ( Directory& );
1641 
1642 public:
1643 
1644     /** Constructor.
1645 
1646         @param strPath [in]
1647         The full qualified URL of the directory.
1648         Relative URLs are not allowed.
1649      */
1650 
Directory(const::rtl::OUString & strPath)1651     Directory( const ::rtl::OUString& strPath ): _pData( 0 ), _aPath( strPath )
1652     {
1653     }
1654 
1655     /** Destructor.
1656     */
1657 
~Directory()1658     ~Directory()
1659     {
1660         close();
1661     }
1662 
1663     /** Open a directory for enumerating its contents.
1664 
1665         @return
1666         E_None on success
1667         E_INVAL the format of the parameters was not valid
1668         E_NOENT the specified path doesn't exist
1669         E_NOTDIR the specified path is not an directory
1670         E_NOMEM not enough memory for allocating structures
1671         E_ACCES permission denied
1672         E_MFILE too many open files used by the process
1673         E_NFILE too many open files in the system
1674         E_NAMETOOLONG File name too long
1675         E_LOOP Too many symbolic links encountered
1676 
1677         @see getNextItem()
1678         @see close()
1679     */
1680 
open()1681     inline RC open()
1682     {
1683         return (RC) osl_openDirectory( _aPath.pData, &_pData );
1684     }
1685 
1686     /** Query if directory is open.
1687 
1688         Query if directory is open and so item enumeration is valid.
1689 
1690         @return
1691         sal_True if the directory is open else sal_False.
1692 
1693         @see open()
1694         @see close()
1695     */
1696 
isOpen()1697     inline sal_Bool isOpen() { return _pData != NULL; }
1698 
1699     /** Close a directory.
1700 
1701         @return
1702         E_None on success
1703         E_INVAL the format of the parameters was not valid
1704         E_NOMEM not enough memory for allocating structures
1705         E_BADF invalid oslDirectory parameter
1706         E_INTR the function call was interrupted
1707 
1708         @see open()
1709     */
1710 
close()1711     inline RC close()
1712     {
1713         oslFileError Error = osl_File_E_BADF;
1714 
1715         if( _pData )
1716         {
1717             Error=osl_closeDirectory( _pData );
1718             _pData = NULL;
1719         }
1720 
1721         return (RC) Error;
1722     }
1723 
1724 
1725     /** Resets the directory item enumeration to the beginning.
1726 
1727         @return
1728         E_None on success
1729         E_INVAL the format of the parameters was not valid
1730         E_NOENT the specified path doesn't exist
1731         E_NOTDIR the specified path is not an directory
1732         E_NOMEM not enough memory for allocating structures
1733         E_ACCES permission denied
1734         E_MFILE too many open files used by the process
1735         E_NFILE too many open files in the system
1736         E_NAMETOOLONG File name too long
1737         E_LOOP Too many symbolic links encountered
1738 
1739         @see open()
1740     */
1741 
reset()1742     inline RC reset()
1743     {
1744         close();
1745         return open();
1746     }
1747 
1748     /** Retrieve the next item of a previously opened directory.
1749 
1750         Retrieves the next item of a previously opened directory.
1751 
1752         @param  rItem [out]
1753         On success a valid DirectoryItem.
1754 
1755         @param  nHint [in]
1756         With this parameter the caller can tell the implementation that (s)he
1757         is going to call this function uHint times afterwards. This enables the implementation to
1758         get the information for more than one file and cache it until the next calls.
1759 
1760         @return
1761         E_None on success
1762         E_INVAL the format of the parameters was not valid
1763         E_NOMEM not enough memory for allocating structures
1764         E_NOENT no more entries in this directory
1765         E_BADF invalid oslDirectory parameter
1766         E_OVERFLOW the value too large for defined data type
1767 
1768         @see DirectoryItem
1769     */
1770 
getNextItem(DirectoryItem & rItem,sal_uInt32 nHint=0)1771     inline RC getNextItem( DirectoryItem& rItem, sal_uInt32 nHint = 0 )
1772     {
1773         if( rItem._pData )
1774         {
1775             osl_releaseDirectoryItem( rItem._pData );
1776             rItem._pData = 0;
1777         }
1778         return ( RC) osl_getNextDirectoryItem( _pData, &rItem._pData, nHint );
1779     }
1780 
1781 
1782     /** Retrieve information about a volume.
1783 
1784         Retrieves information about a volume. A volume can either be a mount point, a network
1785         resource or a drive depending on Operating System and File System.
1786 
1787         @param ustrDirectoryURL [in]
1788         Full qualified URL of the volume
1789 
1790         @param rInfo [out]
1791         On success it receives information about the volume.
1792 
1793         @return
1794         E_None on success
1795         E_NOMEM not enough memory for allocating structures
1796         E_INVAL the format of the parameters was not valid
1797         E_NOTDIR not a directory
1798         E_NAMETOOLONG file name too long
1799         E_NOENT no such file or directory
1800         E_ACCES permission denied
1801         E_LOOP too many symbolic links encountered
1802         E_FAULT Bad address
1803         E_IO on I/O errors
1804         E_NOSYS function not implemented
1805         E_MULTIHOP multihop attempted
1806         E_NOLINK link has been severed
1807         E_INTR function call was interrupted
1808 
1809         @see FileStatus
1810         @see VolumeInfo
1811     */
1812 
getVolumeInfo(const::rtl::OUString & ustrDirectoryURL,VolumeInfo & rInfo)1813     inline static RC getVolumeInfo( const ::rtl::OUString& ustrDirectoryURL, VolumeInfo& rInfo )
1814     {
1815         return (RC) osl_getVolumeInformation( ustrDirectoryURL.pData, &rInfo._aInfo, rInfo._nMask );
1816     }
1817 
1818     /** Create a directory.
1819 
1820         @param ustrDirectoryURL [in]
1821         Full qualified URL of the directory to create.
1822 
1823         @return
1824         E_None on success
1825         E_INVAL the format of the parameters was not valid
1826         E_NOMEM not enough memory for allocating structures
1827         E_EXIST file exists
1828         E_ACCES permission denied
1829         E_NAMETOOLONG file name too long
1830         E_NOENT no such file or directory
1831         E_NOTDIR not a directory
1832         E_ROFS read-only file system
1833         E_NOSPC no space left on device
1834         E_DQUOT quota exceeded
1835         E_LOOP too many symbolic links encountered
1836         E_FAULT bad address
1837         E_IO on I/O errors
1838         E_MLINK too many links
1839         E_MULTIHOP multihop attempted
1840         E_NOLINK link has been severed
1841 
1842         @see remove()
1843     */
1844 
create(const::rtl::OUString & ustrDirectoryURL)1845     inline static RC create( const ::rtl::OUString& ustrDirectoryURL )
1846     {
1847         return (RC) osl_createDirectory( ustrDirectoryURL.pData );
1848     }
1849 
1850     /** Remove an empty directory.
1851 
1852         @param ustrDirectoryURL [in]
1853         Full qualified URL of the directory.
1854 
1855         @return
1856         E_None on success
1857         E_INVAL the format of the parameters was not valid
1858         E_NOMEM not enough memory for allocating structures
1859         E_PERM operation not permitted
1860         E_ACCES permission denied
1861         E_NOENT no such file or directory
1862         E_NOTDIR not a directory
1863         E_NOTEMPTY directory not empty
1864         E_FAULT bad address
1865         E_NAMETOOLONG file name too long
1866         E_BUSY device or resource busy
1867         E_ROFS read-only file system
1868         E_LOOP too many symbolic links encountered
1869         E_BUSY device or resource busy
1870         E_EXIST file exists
1871         E_IO on I/O errors
1872         E_MULTIHOP multihop attempted
1873         E_NOLINK link has been severed
1874 
1875         @see create()
1876     */
1877 
remove(const::rtl::OUString & ustrDirectoryURL)1878     inline static RC remove( const ::rtl::OUString& ustrDirectoryURL )
1879     {
1880         return (RC) osl_removeDirectory( ustrDirectoryURL.pData );
1881     }
1882 
1883     /** Create a directory path.
1884 
1885         The osl_createDirectoryPath function creates a specified directory path.
1886         All nonexisting sub directories will be created.
1887         <p><strong>PLEASE NOTE:</strong> You cannot rely on getting the error code
1888         E_EXIST for existing directories. Programming against this error code is
1889         in general a strong indication of a wrong usage of osl_createDirectoryPath.</p>
1890 
1891         @param aDirectoryUrl
1892         [in] The absolute file URL of the directory path to create.
1893         A relative file URL will not be accepted.
1894 
1895         @param aDirectoryCreationObserver
1896         [in] Pointer to an instance of type DirectoryCreationObserver that will
1897         be informed about the creation of a directory. The value of this
1898         parameter may be NULL, in this case notifications will not be sent.
1899 
1900         @return
1901         <dl>
1902         <dt>E_None</dt>
1903         <dd>On success</dd>
1904         <dt>E_INVAL</dt>
1905         <dd>The format of the parameters was not valid</dd>
1906         <dt>E_ACCES</dt>
1907         <dd>Permission denied</dd>
1908         <dt>E_EXIST</dt>
1909         <dd>The final node of the specified directory path already exist</dd>
1910         <dt>E_NAMETOOLONG</dt>
1911         <dd>The name of the specified directory path exceeds the maximum allowed length</dd>
1912         <dt>E_NOTDIR</dt>
1913         <dd>A component of the specified directory path already exist as file in any part of the directory path</dd>
1914         <dt>E_ROFS</dt>
1915         <dd>Read-only file system</dd>
1916         <dt>E_NOSPC</dt>
1917         <dd>No space left on device</dd>
1918         <dt>E_DQUOT</dt>
1919         <dd>Quota exceeded</dd>
1920         <dt>E_FAULT</dt>
1921         <dd>Bad address</dd>
1922         <dt>E_IO</dt>
1923         <dd>I/O error</dd>
1924         <dt>E_LOOP</dt>
1925         <dd>Too many symbolic links encountered</dd>
1926         <dt>E_NOLINK</dt>
1927         <dd>Link has been severed</dd>
1928         <dt>E_invalidError</dt>
1929         <dd>An unknown error occurred</dd>
1930         </dl>
1931 
1932         @see DirectoryCreationObserver
1933         @see create
1934     */
createPath(const::rtl::OUString & aDirectoryUrl,DirectoryCreationObserver * aDirectoryCreationObserver=NULL)1935     static RC createPath(
1936         const ::rtl::OUString& aDirectoryUrl,
1937         DirectoryCreationObserver* aDirectoryCreationObserver = NULL)
1938     {
1939         return (RC)osl_createDirectoryPath(
1940             aDirectoryUrl.pData,
1941             (aDirectoryCreationObserver) ? onDirectoryCreated : NULL,
1942             aDirectoryCreationObserver);
1943     }
1944 };
1945 
1946 } /* namespace osl */
1947 
1948 #endif  /* __cplusplus */
1949 #endif  /* _OSL_FILE_HXX_ */
1950 
1951