/*---------------------------------------------------------------------------* * PFileSystem.h * * * * Copyright 2007, 2008 Nuance Communciations, Inc. * * * * Licensed under the Apache License, Version 2.0 (the 'License'); * * you may not use this file except in compliance with the License. * * * * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an 'AS IS' BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * *---------------------------------------------------------------------------*/ #ifndef __PFILESYSTEM_H #define __PFILESYSTEM_H #include "ESR_ReturnCode.h" #include "PortPrefix.h" #include "PFile.h" #include "ptypes.h" /** * @addtogroup PFileSystemModule PFileSystem API functions * Portable file-system API. * * Must call pmemInit() before using this module. * If threads are to be used, ptrdInit() must be called before using this module as well. * * @{ */ /** * Portable standard input. */ /*PORTABLE_API PFile* PSTDIN;*/ /** * Portable standard output. */ /*PORTABLE_API PFile* PSTDOUT;*/ /** * Portable standard error. */ /*PORTABLE_API PFile* PSTDERR;*/ #define PSTDIN stdin #define PSTDOUT stdout #define PSTDERR stderr /** * Portable file-system. */ typedef struct PFileSystem_t { /** * Destroys the PFileSystem. * * @param self PFileSystem handle * @return ESR_INVALID_ARGUMENT if self is null */ ESR_ReturnCode(*destroy)(struct PFileSystem_t* self); /** * Creates a new PFile using this file-system. * * @param self PFileSystem handle * @param path Fully qualified file path * @param littleEndian True if file is in little-endian format * @param file [out] Resulting PFile */ ESR_ReturnCode(*createPFile)(struct PFileSystem_t* self, const LCHAR* path, ESR_BOOL littleEndian, PFile** file); /** * Creates a new directory. * * @param self PFileSystem handle * @param path Fully qualified directory path * @return ESR_INVALID_ARGUMENT if path is null; ESR_IDENTIFIER_COLLISION if directory already exists; * ESR_NO_MATCH_ERROR if parent directory does not exist; ESR_INVALID_STATE if an internal error occurs */ ESR_ReturnCode(*mkdir)(struct PFileSystem_t* self, const LCHAR* path); /** * Sets the current working directory. * * @param self PFileSystem handle * @param path Fully qualified file path * @return ESR_SUCCESS if change of directory is allowed */ ESR_ReturnCode(*chdir)(struct PFileSystem_t* self, const LCHAR* path); } PFileSystem; /** * Initializes the portable file-system module. * * @return ESR_INVALID_STATE if calling StackTraceCreate() fails (see its documentation for more detail). */ PORTABLE_API ESR_ReturnCode PFileSystemCreate(void); /** * Indicates if the portable file-system module is initialized. * * @param isCreated [in/out] True if the module is initialized. * @return ESR_INVALID_ARGUMENT if isCreated is null */ PORTABLE_API ESR_ReturnCode PFileSystemIsCreated(ESR_BOOL* isCreated); /** * Shuts down the portable file-system module. * * @return ESR_INVALID_ARGUMENT if self is null */ PORTABLE_API ESR_ReturnCode PFileSystemDestroy(void); /** * Creates a new PFile using this file-system. * * @param path Fully qualified file path * @param littleEndian True if file is in little-endian format * @param file [out] Resulting PFile * @return ESR_OUT_OF_MEMORY if system is out of memory; ESR_INVALID_STATE if mutex could not be created */ PORTABLE_API ESR_ReturnCode PFileSystemCreatePFile(const LCHAR* path, ESR_BOOL littleEndian, PFile** file); /** * Indicates if path is absolute. * * @param path Path to be processed * @param isAbsolute True if path is absolute * @return ESR_INVALID_ARGUMENT if path or isAbsolute are null */ PORTABLE_API ESR_ReturnCode PFileSystemIsAbsolutePath(const LCHAR* path, ESR_BOOL* isAbsolute); /** * Returns the canonical pathname string of this abstract pathname. * * A canonical pathname is both absolute and unique. The precise definition of canonical * form is system-dependent. This method first converts this pathname to absolute form. * This typically involves removing redundant names such as "." and ".." from the pathname, * resolving symbolic links (on UNIX platforms), and converting drive letters to * a standard case (on Microsoft Windows platforms). * * POST-CONDITION: Path will contain only canonical slashes * * @param path Path to process * @param len [in/out] Length of path argument. If the return code is ESR_BUFFER_OVERFLOW, * the required length is returned in this variable. * @return ESR_INVALID_ARGUMENT if path or len are null */ PORTABLE_API ESR_ReturnCode PFileSystemGetAbsolutePath(LCHAR* path, size_t* len); /** * Converts all slashes in path to '/'. * * @param path [in/out] Path to process * @return ESR_INVALID_ARGUMENT if path is null */ PORTABLE_API ESR_ReturnCode PFileSystemCanonicalSlashes(LCHAR* path); /** * Returns parent directory of specified path. * If the path ends with a filename, its directory is returned. * If the path ends with a directory, its parent directory is returned. * * PRECONDITION: Directory names must end with '/' * * @param path [in/out] Path to process * @param len [in/out] Length of path argument. If the return code is ESR_BUFFER_OVERFLOW, * the required length is returned in this variable. * @return ESR_INVALID_ARGUMENT if path or len are null; ESR_BUFFER_OVERFLOW if path is too small to contain the result */ PORTABLE_API ESR_ReturnCode PFileSystemGetParentDirectory(LCHAR* path, size_t* len); /** * Creates a new directory. * * @param path Directory path * @return ESR_INVALID_ARGUMENT if path is null; ESR_IDENTIFIER_COLLISION if directory already exists; * ESR_NO_MATCH_ERROR if parent directory does not exist; ESR_INVALID_STATE if an internal error occurs */ PORTABLE_API ESR_ReturnCode PFileSystemMkdir(const LCHAR* path); /** * Returns the current working directory (always ends with '/'). * * @param path [out] The current working directory * @param len [in/out] Length of path argument. If the return code is ESR_BUFFER_OVERFLOW, * the required length is returned in this variable. * @return ESR_INVALID_ARGUMENT if path or len are null; ESR_BUFFER_OVERFLOW if path is too small to contain the result */ PORTABLE_API ESR_ReturnCode PFileSystemGetcwd(LCHAR* path, size_t* len); /** * Sets the current working directory. * * @param path Fully qualified file path * @return ESR_SUCCESS if change of directory is allowed */ PORTABLE_API ESR_ReturnCode PFileSystemChdir(const LCHAR* path); /** * Converts a linear path string to an array of path tokens. * Tokens ending with a '/' denote a directory, otherwise they are a file. * * POST-CONDITION: The array is allocated internally, but must be freed by the caller. * * @param path Command-line string to parse * @param tokenArray [out] The array used to hold the tokens * @param count [out] The number of tokens found * @return ESR_INVALID_ARGUMENT if path, tokenArray or count are null; ESR_OUT_OF_MEMORY if system is out of memory */ PORTABLE_API ESR_ReturnCode PFileSystemLinearToPathTokens(const LCHAR* path, LCHAR*** tokenArray, size_t* count); /** * @} */ #endif /* __PFILESYSTEM_H */