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