예제 #1
0
void install_update_package(char* filename) {
	char* extension = (filename+strlen(filename)-3);
	char* boot_extension = (filename+strlen(filename)-8);
	char* rec_extension = (filename+strlen(filename)-7);
	if (strcmp(extension, "zip") == 0 ) {
		ui_print("\nZIP detected.\n");
		remove("/block_update");
		install_update_zip(filename);
		return;
	} 
	if (strcmp(extension, "tar") == 0 || strcmp(extension, "tgz") == 0 ) { 
		ui_print("\nTAR detected.\n");
		install_rom_from_tar(filename);
		return;
	}
	if (strcmp(rec_extension, "rec.img") == 0 ) {
		ui_print("\nRECOVERY IMAGE detected.\n");
		install_img(filename, "recovery");
		return;
	}
	if (strcmp(boot_extension, "boot.img") == 0 ) {
		ui_print("\nBOOT IMAGE detected.\n");
		install_img(filename, "boot");
		return;
	}
}
void show_choose_tar_menu()
{
    static char* headers[] = { "Choose a ROM or press POWER to return",
			       "",
			       NULL };
    
    char path[PATH_MAX] = "";
    DIR *dir;
    struct dirent *de;
    int total = 0;
    int i;
    char** files;
    char** list;

    if (ensure_root_path_mounted("SDCARD:") != 0) {
	LOGE ("Can't mount /sdcard\n");
	return;
    }

    dir = opendir("/sdcard");
    if (dir == NULL) {
	LOGE("Couldn't open /sdcard");
	return;
    }
    
    while ((de=readdir(dir)) != NULL) {
	if (de->d_name[0] != '.' && strlen(de->d_name) > 4 && (strcmp(de->d_name+strlen(de->d_name)-8,".rom.tar")==0 || strcmp(de->d_name+strlen(de->d_name)-11,".rom.tar.gz")==0) || strcmp(de->d_name+strlen(de->d_name)-8,".rom.tgz")==0) {
	    total++;
	}
    }

    if (total==0) {
	LOGE("No tar archives found\n");
	if(closedir(dir) < 0) {
	    LOGE("Failed to close directory /sdcard");
	    return;
	}
    }
    else {
	files = (char**) malloc((total+1)*sizeof(char*));
	files[total]=NULL;

	list = (char**) malloc((total+1)*sizeof(char*));
	list[total]=NULL;
	
	rewinddir(dir);

	i = 0;
	while ((de = readdir(dir)) != NULL) {
	    if (de->d_name[0] != '.' && strlen(de->d_name) > 4 && (strcmp(de->d_name+strlen(de->d_name)-8,".rom.tar")==0 || strcmp(de->d_name+strlen(de->d_name)-11,".rom.tar.gz")==0) || strcmp(de->d_name+strlen(de->d_name)-8,".rom.tgz")==0) {
		files[i] = (char*) malloc(strlen("/sdcard/")+strlen(de->d_name)+1);
		strcpy(files[i], "/sdcard/");
		strcat(files[i], de->d_name);
		
		list[i] = (char*) malloc(strlen(de->d_name)+1);
		strcpy(list[i], de->d_name);

		i++;
	    }
	}

	if (closedir(dir) <0) {
	    LOGE("Failure closing directory /sdcard\n");
	    return;
	}

	int chosen_item = -1;
	while (chosen_item < 0) {
	    chosen_item = get_menu_selection(headers, list, 1, chosen_item<0?0:chosen_item);
	    if (chosen_item >= 0 && chosen_item != ITEM_BACK) {
		install_rom_from_tar(files[chosen_item]);
	    }
	}
    }
}