Home | History | Annotate | Download | only in objmng
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 
     18 /**
     19  * File Porting Layer.
     20  */
     21 #ifndef __DRM_FILE_H__
     22 #define __DRM_FILE_H__
     23 
     24 #ifdef __cplusplus
     25 extern "C" {
     26 #endif
     27 
     28 #include <drm_common_types.h>
     29 
     30 /** Type value of a regular file or file name. */
     31 #define DRM_FILE_ISREG 1
     32 /** Type value of a directory or directory name. */
     33 #define DRM_FILE_ISDIR 2
     34 /** Type value of a filter name */
     35 #define DRM_FILE_ISFILTER 3
     36 
     37 
     38 /** Return code that indicates successful completion of an operation. */
     39 #define DRM_FILE_SUCCESS 0
     40 /** Indicates that an operation failed. */
     41 #define DRM_FILE_FAILURE -1
     42 /** Indicates that the a DRM_file_read() call reached the end of the file. */
     43 #define DRM_FILE_EOF -2
     44 
     45 
     46 /** Open for read access. */
     47 #define DRM_FILE_MODE_READ 1
     48 /** Open for write access. */
     49 #define DRM_FILE_MODE_WRITE 2
     50 
     51 
     52 #ifndef MAX_FILENAME_LEN
     53 /** Maximum number of characters that a filename may have. By default assumes
     54  *  that the entry results of DRM_file_listNextEntry() are returned in the async state
     55  *  buffer, after the #DRM_file_result_s, and calculates the maximum name
     56  *  from that.
     57  */
     58 #define MAX_FILENAME_LEN 1024
     59 #endif
     60 
     61 
     62 /**
     63  * Performs one-time initialization of the File System (FS).
     64  * This function is called once during the lifetime of an application,
     65  * and before any call to <code>DRM_file_*</code> functions by this application.
     66  * When several applications are using the file interface, this function may be called
     67  * several times, once per application.
     68  *
     69  * @return #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
     70  */
     71 int32_t DRM_file_startup(void);
     72 
     73 /**
     74  * Returns the length of a file (by name, opened or unopened).
     75  *
     76  * @param name Name of the file, UCS-2 encoded.
     77  * @param nameChars Number characters encoded in name.
     78  * asynchronous operation returns #DRM_FILE_WOULDBLOCK.
     79  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_FAILURE or the file length.
     80  */
     81 int32_t DRM_file_getFileLength(const uint16_t* name,
     82                                int32_t nameChars);
     83 
     84 /**
     85  * Initializes a list iteration session.
     86  *
     87  * @param prefix Prefix that must be matched, UCS-2 encoded. *
     88  * @param prefixChars Number characters encoded in prefix.
     89  * @param session List session identifier.
     90  * @param iteration List iteration identifier.
     91  *
     92  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
     93  */
     94 int32_t DRM_file_listOpen(const uint16_t* prefix,
     95                           int32_t prefixChars,
     96                           int32_t* session,
     97                           int32_t* iteration);
     98 
     99 /**
    100  * Used to fetch a list of file names that match a given name prefix.
    101  *
    102  * @param prefix See DRM_file_listOpen(). This does not change during the
    103  * iteration session.
    104  * @param prefixChars See DRM_file_listOpen(). This does not change during
    105  * the iteration session.
    106  * @param entry Buffer parameter to return the next file name that matches the
    107  * #prefix parameter, if any, when the function returns a positive number of
    108  * characters.
    109  * @param entryBytes Size of entry in bytes.
    110  * @param session See DRM_file_listOpen().
    111  * @param iteration See DRM_file_listOpen().
    112  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_FAILURE or the number of
    113  * characters encoded in entry. Returns 0 when the end of the list is reached.
    114  */
    115 int32_t DRM_file_listNextEntry(const uint16_t* prefix,
    116                                int32_t prefixChars,
    117                                uint16_t* entry,
    118                                int32_t entryBytes,
    119                                int32_t* session,
    120                                int32_t* iteration);
    121 
    122 /**
    123  * Ends a list iteration session. Notifies the implementation
    124  * that the list session is over and that any session resources
    125  * can be released.
    126  *
    127  * @param session See DRM_file_listOpen().
    128  * @param iteration See DRM_file_listOpen().
    129  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
    130  */
    131 int32_t DRM_file_listClose(int32_t session, int32_t iteration);
    132 
    133 /**
    134  * Renames a file, given its old name. The file or directory is renamed
    135  * immediately on the actual file system upon invocation of this method.
    136  * Any open handles on the file specified by oldName become invalid after
    137  * this method has been called.
    138  *
    139  * @param oldName Current file name (unopened), UCS-2 encoded.
    140  * @param oldNameChars Number of characters encoded on oldName.
    141  * @param newName New name for the file (unopened), UCS-2 encoded.
    142  * @param newNameChars Number of characters encoded on newName.
    143  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE. In particular,
    144  * #DRM_FILE_FAILURE if a file or directory already exists with the new name.
    145  */
    146 int32_t DRM_file_rename(const uint16_t* oldName,
    147                         int32_t oldNameChars,
    148                         const uint16_t* newName,
    149                         int32_t newNameChars);
    150 
    151 /**
    152  * Tests if a file exists given its name.
    153  *
    154  * @param name Name of the file, UCS-2 encoded.
    155  * @param nameChars Number of characters encoded in name.
    156  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_ISREG, #DRM_FILE_ISDIR, #DRM_FILE_FAILURE. If name
    157  * exists, returns #DRM_FILE_ISREG if it is a regular file and #DRM_FILE_ISDIR if it is a directory.
    158  * Returns #DRM_FILE_FAILURE in all other cases, including those where name exists but is neither
    159  * a regular file nor a directory. Platforms that do not support directories MUST NOT return
    160  * #DRM_FILE_ISDIR.
    161  */
    162 int32_t DRM_file_exists(const uint16_t* name,
    163                         int32_t nameChars);
    164 
    165 /**
    166  * Opens a file with the given name and returns its file handle.
    167  *
    168  * @param name Name of the file, UCS-2 encoded.
    169  * @param nameChars Number of characters encoded in name.
    170  * @param mode Any combination of the #DRM_FILE_MODE_READ and
    171  * #DRM_FILE_MODE_WRITE flags. If the file does not exist and mode contains the
    172  * #DRM_FILE_MODE_WRITE flag, then the file is automatically created. If the
    173  * file exists and the mode contains the #DRM_FILE_MODE_WRITE flag, the file is
    174  * opened so it can be modified, but the data is not modified by the open call.
    175  * In all cases the current position is set to the start of the file.
    176  * The following table shows how to map the mode semantics above to UNIX
    177  * fopen-style modes.  For brevity in the table, R=#DRM_FILE_MODE_READ,
    178  * W=#DRM_FILE_MODE_WRITE, E=File exists:
    179  * <table>
    180  * <tr><td>RW</td><td>E</td><td>Maps-to</td></tr>
    181  * <tr><td>00</td><td>0</td><td>Return #DRM_FILE_FAILURE</td></tr>
    182  * <tr><td>00</td><td>1</td><td>Return #DRM_FILE_FAILURE</td></tr>
    183  * <tr><td>01</td><td>0</td><td>Use fopen mode "w"</td></tr>
    184  * <tr><td>01</td><td>1</td><td>Use fopen mode "a" and fseek to the start</td></tr>
    185  * <tr><td>10</td><td>0</td><td>Return #DRM_FILE_FAILURE</td></tr>
    186  * <tr><td>10</td><td>1</td><td>Use fopen mode "r"</td></tr>
    187  * <tr><td>11</td><td>0</td><td>Use fopen mode "w+"</td></tr>
    188  * <tr><td>11</td><td>1</td><td>Use fopen mode "r+"</td></tr>
    189  * </table>
    190  * @param handle Pointer where the result handle value is placed when the function
    191  * is called synchronously.
    192  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
    193  */
    194 int32_t DRM_file_open(const uint16_t* name,
    195                       int32_t nameChars,
    196                       int32_t mode,
    197                       int32_t* handle);
    198 
    199 /**
    200  * Deletes a file given its name, UCS-2 encoded. The file or directory is
    201  * deleted immediately on the actual file system upon invocation of this
    202  * method. Any open handles on the file specified by name become invalid
    203  * after this method has been called.
    204  *
    205  * If the port needs to ensure that a specific application does not exceed a given storage
    206  * space quota, then the bytes freed by the deletion must be added to the available space for
    207  * that application.
    208  *
    209  * @param name Name of the file, UCS-2 encoded.
    210  * @param nameChars Number of characters encoded in name.
    211  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
    212  */
    213 int32_t DRM_file_delete(const uint16_t* name,
    214                         int32_t nameChars);
    215 
    216 /**
    217  * Read bytes from a file at the current position to a buffer. Afterwards the
    218  * new file position is the byte after the last byte read.
    219  * DRM_FILE_FAILURE is returned if the handle is invalid (e.g., as a
    220  * consquence of DRM_file_delete, DRM_file_rename, or DRM_file_close).
    221  *
    222  * @param handle File handle as returned by DRM_file_open().
    223  * @param dst Buffer where the data is to be copied.
    224  * @param length Number of bytes to be copied.
    225  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE, #DRM_FILE_EOF
    226  *         or the number of bytes that were read, i.e. in the range 0..length.
    227  */
    228 int32_t DRM_file_read(int32_t handle,
    229                       uint8_t* dst,
    230                       int32_t length);
    231 
    232 /**
    233  * Write bytes from a buffer to the file at the current position.  If the
    234  * current position + number of bytes written > current size of the file,
    235  * then the file is grown.  Afterwards the new file position is the byte
    236  * after the last byte written.
    237  * DRM_FILE_FAILURE is returned if the handle is invalid (e.g., as a
    238  * consquence of DRM_file_delete, DRM_file_rename, or DRM_file_close).
    239  *
    240  * @param handle File handle as returned by DRM_file_open().
    241  * @param src Buffer that contains the bytes to be written.
    242  * @param length Number of bytes to be written.
    243  * If the port needs to ensure that a specific application does not exceed a given storage
    244  * space quota, the implementation must make sure the call does not violate that invariant.
    245  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_FAILURE or the number of bytes
    246  *         that were written. This number must be in the range 0..length.
    247  *         Returns #DRM_FILE_FAILURE when storage is full or exceeds quota.
    248  */
    249 int32_t DRM_file_write(int32_t handle,
    250                        const uint8_t* src,
    251                        int32_t length);
    252 
    253 /**
    254  * Closes a file.
    255  * DRM_FILE_SUCCESS is returned if the handle is invalid (e.g., as a
    256  * consquence of DRM_file_delete or DRM_file_rename).
    257  *
    258  * @param handle File handle as returned by DRM_file_open().
    259  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
    260  */
    261 int32_t DRM_file_close(int32_t handle);
    262 
    263 /**
    264  * Sets the current position in an opened file.
    265  * DRM_FILE_FAILURE is returned if the handle is invalid (e.g., as a
    266  * consquence of DRM_file_delete, DRM_file_rename, or DRM_file_close).
    267  *
    268  * @param handle File handle as returned by DRM_file_open().
    269  * @param value The new current position of the file. If value is greater
    270  * than the length of the file then the file should be extended. The contents
    271  * of the newly extended portion of the file is undefined.
    272  * If the port needs to ensure that a specific application does not exceed a given storage
    273  * space quota, the implementation must make sure the call does not violate that invariant.
    274  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
    275  *         Returns #DRM_FILE_FAILURE when storage is full or exceeds quota.
    276  */
    277 int32_t DRM_file_setPosition(int32_t handle, int32_t value);
    278 
    279 /**
    280  * Creates a directory with the assigned name and full file permissions on
    281  * the file system. The full path to the new directory must already exist.
    282  * The directory is created immediately on the actual file system upon
    283  * invocation of this method.
    284  *
    285  * @param name Name of the directory, UCS-2 encoded.
    286  * @param nameChars Number of characters encoded in name.
    287  * @return #DRM_FILE_WOULDBLOCK, #DRM_FILE_SUCCESS, #DRM_FILE_FAILURE.
    288  */
    289 int32_t DRM_file_mkdir(const uint16_t* name,
    290                        int32_t nameChars);
    291 
    292 #ifdef __cplusplus
    293 }
    294 #endif
    295 
    296 #endif /* __DRM_FILE_H__ */
    297