android源码分析2--5.0 PackageExtractFileFn

// package_extract_file(package_path, destination_path)
//   or
// package_extract_file(package_path)
//   to return the entire contents of the file as the result of this
//   function (the char* returned is actually a FileContents*).
package_extract_file("system.transfer.list")
package_extract_file("patch/boot.img.p")
package_extract_file("META-INF/com/miui/miui_update", "/cache/miui_update");
run_program("/cache/miui_update")

Value* PackageExtractFileFn( const   char * name, State* state,
                            int   argc, Expr* argv[]) {
// argc就代表脚本中package_extract_file 函数的参数个数
     if   (argc < 1 || argc > 2) {
         return   ErrorAbort(state,  "%s() expects 1 or 2 args, got %d" ,
                           name, argc);
     }
     bool   success =  false ;
  // 在updater开始将updater_info 保存到了 state->cookie
UpdaterInfo updater_info;
updater_info.cmd_pipe = cmd_pipe;
updater_info.package_zip = &za;
updater_info.version = atoi(version);
updater_info.package_zip_addr = map.addr;
updater_info.package_zip_len = map.length;
State state;
state.cookie = &updater_info;
     UpdaterInfo* ui = (UpdaterInfo*)(state->cookie);
 
     if   (argc == 2) {
         // The two-argument version extracts to a file.
 
         ZipArchive* za = ((UpdaterInfo*)(state->cookie))->package_zip;
 
         char * zip_path;
         char * dest_path;
         if   (ReadArgs(state, argv, 2, &zip_path, &dest_path) < 0)  return   NULL;
 
         const   ZipEntry* entry = mzFindZipEntry(za, zip_path);
         if   (entry == NULL) {
             printf ( "%s: no %s in package\n" , name, zip_path);
             goto   done2;
         }
 
         FILE * f =  fopen (dest_path,  "wb" );
         if   (f == NULL) {
             printf ( "%s: can't open %s for write: %s\n" ,
                     name, dest_path,  strerror ( errno ));
             goto   done2;
         }
         success = mzExtractZipEntryToFile(za, entry, fileno(f));
         fclose (f);
 
       done2:
         free (zip_path);
         free (dest_path);
         return   StringValue(strdup(success ?  "t"   "" ));
     else   {
         // The one-argument version returns the contents of the file
         // as the result.
 
         char * zip_path;
         Value* v =  malloc ( sizeof (Value));
         v->type = VAL_BLOB;
         v->size = -1;
         v->data = NULL;
 
// 调用 ReadArgs从 package_extract_file("system.transfer.list")中取出system.transfer.list作为 zip_path
         if   (ReadArgs(state, argv, 1, &zip_path) < 0)  return   NULL;
 
         ZipArchive* za = ((UpdaterInfo*)(state->cookie))->package_zip;
//从映射到内存中的zip压缩包中找到zip_path
         const   ZipEntry* entry = mzFindZipEntry(za, zip_path);
         if   (entry == NULL) {
             printf ( "%s: no %s in package\n" , name, zip_path);
             goto   done1;
         }
 
         v->size = mzGetZipEntryUncompLen(entry);
         v->data =  malloc (v->size);
         if   (v->data == NULL) {
             printf ( "%s: failed to allocate %ld bytes for %s\n" ,
                     name, ( long )v->size, zip_path);
             goto   done1;
         }
  //将 zip_path system.transfer.list )的内容从zip包中解压缩到 v->data
* Uncompress "pEntry" in "pArchive" to buffer, which must be large
* enough to hold mzGetZipEntryUncomplen(pEntry) bytes.
*/
bool mzExtractZipEntryToBuffer(const ZipArchive *pArchive,
const ZipEntry *pEntry, unsigned char *buffer)
         success = mzExtractZipEntryToBuffer(za, entry,
                                             (unsigned  char   *)v->data);
 
       done1:
         free (zip_path);
         if   (!success) {
             free (v->data);
//如果 mzExtractZipEntryToBuffer 执行失败就将 v->data 重新设为空
             v->data = NULL;
             v->size = -1;
         }
         return   v;
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值