xref: /aoo42x/main/sal/inc/osl/file.hxx (revision 9c0df323)
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 
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 
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 
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 
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 
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 
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 
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 
348 	VolumeDevice() : _aHandle( NULL )
349 	{
350 	}
351 
352     /** Copy constructor.
353 
354         @param rDevice
355         The other volume device.
356     */
357 
358 	VolumeDevice( const VolumeDevice & rDevice )
359 	{
360 		_aHandle = rDevice._aHandle;
361 		if ( _aHandle )
362 			osl_acquireVolumeDeviceHandle( _aHandle );
363 	}
364 
365     /** Destructor.
366     */
367 
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 
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 
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 
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     */
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 describing the demanded information.
481     */
482 
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 
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 
507     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 
518     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 
529     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 
540     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 
551     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 
562     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 
573     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 
585     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 
597     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 
609     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 
621     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 
633     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 
645 	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 
658 	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     */
669     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     */
681     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 describing the demanded information.
755     */
756 
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 
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 
785     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     */
795     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 
806     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 
818     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 
830     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 
842     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 
853     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 
864     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 
876     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 
887     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 
926     File( const ::rtl::OUString& ustrFileURL ): _pData( 0 ), _aPath( ustrFileURL ) {}
927 
928     /** Destructor
929     */
930 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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     */
1276     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 
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 
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 
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 
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 
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 
1448 	DirectoryItem(): _pData( NULL )
1449 	{
1450 	}
1451 
1452     /** Copy constructor.
1453     */
1454 
1455 	DirectoryItem( const DirectoryItem& rItem ): _pData( rItem._pData)
1456 	{
1457 		if( _pData )
1458             osl_acquireDirectoryItem( _pData );
1459 	}
1460 
1461 	/** Destructor.
1462 	*/
1463 
1464 	~DirectoryItem()
1465 	{
1466 		if( _pData )
1467 			osl_releaseDirectoryItem( _pData );
1468 	}
1469 
1470     /** Assignment operator.
1471     */
1472 
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 
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 
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 
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:
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.
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 
1651 	Directory( const ::rtl::OUString& strPath ): _pData( 0 ), _aPath( strPath )
1652 	{
1653 	}
1654 
1655     /** Destructor.
1656     */
1657 
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 
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 
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 
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 
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 
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 
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 
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 
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 	*/
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