mirror of
https://github.com/php-win-ext/php-rar.git
synced 2026-03-24 04:52:07 +01:00
- Added tests for read_dimensions handler. - Methods/functions that receive no parameters enforce that. - Added rar_is_broken and rar_allow_broken_set. git-svn-id: http://svn.php.net/repository/pecl/rar/trunk@300009 c90b9560-bf6c-de11-be94-00142212c4b1
63 lines
3.3 KiB
Plaintext
63 lines
3.3 KiB
Plaintext
(some information is outdated)
|
|
|
|
rar_open/RarArchive::open()
|
|
gives
|
|
RarArchive object
|
|
-
|
|
. stores 2 open data structs (are used to tell the lib e.g. which file to open and the lib in return stores some data in them)
|
|
- list_open_data has open mode RAR_OM_LIST_INCSPLIT and is used to list the contents of the archive
|
|
- extract_open_data has open mode RAR_OM_EXTRACT and is used by RarEntry::extract
|
|
. stores one opened archive handle, opened with the list_open_data struct. This handle remains
|
|
open until the archive is closed or the object is destroyed
|
|
. a RarArchive object is considered closed when the opened archive handle created here is set to NULL
|
|
|
|
|
|
rar_list()/RarArchive::getEntries()
|
|
gives
|
|
RarEntry objects
|
|
-
|
|
. CALL _rar_list_files, which fills the lazy cache rar->entries by using the opened archive handle to retrieve ALL the RarHeaderDataEx headers
|
|
. CALL _rar_raw_entries_to_files to turn the rar->entries RarHeaderDataEx headers into zvals
|
|
- in turn, _rar_raw_entries_to_files creates the zval and sets the property that holds the zval reference to the RarArchive object (see below)
|
|
- calculates the packed size by summing over all the headers that concern each file (a file may have more than one header in case there are volumes)
|
|
- then CALLs _rar_entry_to_zval with the last header for each file and the packed size so that it can fill the remaining properties
|
|
. each of the RarEntry objects store a zval referencing the RarArchive object. The RarArchive object is not destroyed until all its spawned RarEntry objects are destroyed (it can however be closed)
|
|
|
|
|
|
rar_entry_get()/RarArchive::getEntry()
|
|
gives
|
|
RarEntry object
|
|
-
|
|
. CALL _rar_list_files, if it's necessary to fill the lazy cache rar->entries
|
|
. CALL _rar_raw_entries_to_files, which traverses rar->entries until it finds the request filename, the header(s) are then converted into one zval
|
|
. again, the RarEntry object stores a reference to the RarArchive object
|
|
|
|
|
|
RarArchive traversal with an iterator
|
|
gives
|
|
RarEntry objects (one at a time)
|
|
-
|
|
. iterator creation CALLs_rar_list_files, if it's necessary to fill the lazy cache rar->entries
|
|
. iterator stores the index (with respect to the rar->entries array) of the last header in rar->entries that is to be read (starts with 0)
|
|
. iterator CALLs _rar_raw_entries_to_files, which here stops after reading each file and advances the index
|
|
|
|
|
|
RarEntry::extract()
|
|
extracts the file
|
|
-
|
|
. uses the extract_open_data that's stored in the parent RarArchive object
|
|
. makes a shallow copy of parent RarArchive's rar->cb_userdata, eventually modified with the given file password.
|
|
. passes them to _rar_find_file to open the file with RAR_OM_EXTRACT and skip to the desired entry
|
|
. extracts the file
|
|
. closes the rar handle
|
|
|
|
|
|
RarEntry::getStream()
|
|
obtains stream
|
|
-
|
|
. CALL php_stream_rar_open with the archive name (obtained from parent RarArchive object's extract_open_data->ArcName), the filename of the entry and a shallow copy of parent RarArchive's rar->cb_userdata, eventually modified with the given file password.
|
|
. in turn, php_stream_rar_open CALLs _rar_find_file with a brand new rar open data struct with RAR_OM_EXTRACT. _rar_find_file opens the RAR archive and skips to the desired entry
|
|
. the resulting stream has no connection to the original RarArchive object or to the RarEntry object
|
|
. the rar archive is not closed until the stream is destroyed or closed
|
|
|