forked from cory/tildefriends
		
	Import stock apps from the apk.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4210 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		@@ -357,7 +357,14 @@ static int _tf_run_task(const tf_run_args_t* args, int index)
 | 
			
		||||
	tf_task_activate(task);
 | 
			
		||||
	if (args->ssb_port)
 | 
			
		||||
	{
 | 
			
		||||
		tf_ssb_import(tf_task_get_ssb(task), "core", "apps");
 | 
			
		||||
		if (args->zip)
 | 
			
		||||
		{
 | 
			
		||||
			tf_ssb_import_from_zip(tf_task_get_ssb(task), args->zip, "core", "apps");
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			tf_ssb_import(tf_task_get_ssb(task), "core", "apps");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (tf_task_execute(task, args->script))
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										129
									
								
								src/ssb.import.c
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								src/ssb.import.c
									
									
									
									
									
								
							@@ -11,6 +11,7 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <sqlite3.h>
 | 
			
		||||
#include <unzip.h>
 | 
			
		||||
#include <uv.h>
 | 
			
		||||
 | 
			
		||||
static void _tf_ssb_import_add_app(tf_ssb_t* ssb, const char* user, const char* app)
 | 
			
		||||
@@ -237,7 +238,8 @@ void tf_ssb_import(tf_ssb_t* ssb, const char* user, const char* path)
 | 
			
		||||
			size_t len = strlen(path) + strlen(ent.name) + 2;
 | 
			
		||||
			char* full_path = tf_malloc(len);
 | 
			
		||||
			snprintf(full_path, len, "%s/%s", path, ent.name);
 | 
			
		||||
			if (strcasecmp(ent.name + strlen(ent.name) - strlen(".json"), ".json") == 0)
 | 
			
		||||
			if (strlen(ent.name) > strlen(".json") &&
 | 
			
		||||
				strcasecmp(ent.name + strlen(ent.name) - strlen(".json"), ".json") == 0)
 | 
			
		||||
			{
 | 
			
		||||
				_tf_ssb_import_app_json(ssb, tf_ssb_get_loop(ssb), tf_ssb_get_context(ssb), user, full_path);
 | 
			
		||||
			}
 | 
			
		||||
@@ -250,3 +252,128 @@ void tf_ssb_import(tf_ssb_t* ssb, const char* user, const char* path)
 | 
			
		||||
	}
 | 
			
		||||
	uv_fs_req_cleanup(&req);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char* _tf_ssb_import_read_current_file_from_zip(unzFile zip, size_t* size)
 | 
			
		||||
{
 | 
			
		||||
	char* result = NULL;
 | 
			
		||||
	unz_file_info64 info = { 0 };
 | 
			
		||||
	if (unzGetCurrentFileInfo64(zip, &info, NULL, 0, NULL, 0, NULL, 0) == UNZ_OK)
 | 
			
		||||
	{
 | 
			
		||||
		char* buffer = tf_malloc(info.uncompressed_size + 1);
 | 
			
		||||
		if (unzOpenCurrentFile(zip) == UNZ_OK)
 | 
			
		||||
		{
 | 
			
		||||
			if (unzReadCurrentFile(zip, buffer, info.uncompressed_size) == (int)info.uncompressed_size)
 | 
			
		||||
			{
 | 
			
		||||
				*size = info.uncompressed_size;
 | 
			
		||||
				buffer[info.uncompressed_size] = '\0';
 | 
			
		||||
				result = buffer;
 | 
			
		||||
				buffer = NULL;
 | 
			
		||||
			}
 | 
			
		||||
			unzCloseCurrentFile(zip);
 | 
			
		||||
		}
 | 
			
		||||
		tf_free(buffer);
 | 
			
		||||
	}
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _tf_ssb_import_recursive_add_files_from_zip(tf_ssb_t* ssb, unzFile zip, JSContext* context, JSValue files, const char* root)
 | 
			
		||||
{
 | 
			
		||||
	if (unzGoToFirstFile(zip) == UNZ_OK)
 | 
			
		||||
	{
 | 
			
		||||
		while (unzGoToNextFile(zip) == UNZ_OK)
 | 
			
		||||
		{
 | 
			
		||||
			char file_path[256];
 | 
			
		||||
			unz_file_info64 info = { 0 };
 | 
			
		||||
			if (unzGetCurrentFileInfo64(zip, &info, file_path, sizeof(file_path), NULL, 0, NULL, 0) == UNZ_OK)
 | 
			
		||||
			{
 | 
			
		||||
				if (strncmp(file_path, root, strlen(root)) == 0 &&
 | 
			
		||||
					file_path[strlen(root)] == '/')
 | 
			
		||||
				{
 | 
			
		||||
					size_t size = 0;
 | 
			
		||||
					char* blob = _tf_ssb_import_read_current_file_from_zip(zip, &size);
 | 
			
		||||
					char id[k_id_base64_len] = { 0 };
 | 
			
		||||
					bool is_new = false;
 | 
			
		||||
					if (tf_ssb_db_blob_store(ssb, (const uint8_t*)blob, size, id, sizeof(id), &is_new) && is_new)
 | 
			
		||||
					{
 | 
			
		||||
						tf_printf("Stored %s as %s.\n", file_path, id);
 | 
			
		||||
					}
 | 
			
		||||
					JS_SetPropertyStr(context, files, file_path + strlen(root) + 1, JS_NewString(context, id));
 | 
			
		||||
 | 
			
		||||
					tf_free(blob);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _tf_ssb_import_app_json_from_zip(tf_ssb_t* ssb, unzFile zip, JSContext* context, const char* user, const char* path)
 | 
			
		||||
{
 | 
			
		||||
	size_t size = 0;
 | 
			
		||||
	char* file = _tf_ssb_import_read_current_file_from_zip(zip, &size);
 | 
			
		||||
	if (file)
 | 
			
		||||
	{
 | 
			
		||||
		JSValue app = JS_ParseJSON(context, file, size, NULL);
 | 
			
		||||
		if (!tf_util_report_error(context, app))
 | 
			
		||||
		{
 | 
			
		||||
			char* dir = tf_strdup(path);
 | 
			
		||||
			dir[strlen(dir) - strlen(".json")] = '\0';
 | 
			
		||||
			JSValue files = JS_NewObject(context);
 | 
			
		||||
			_tf_ssb_import_recursive_add_files_from_zip(ssb, zip, context, files, dir);
 | 
			
		||||
			JS_SetPropertyStr(context, app, "files", files);
 | 
			
		||||
 | 
			
		||||
			JSValue json = JS_JSONStringify(context, app, JS_NULL, JS_NULL);
 | 
			
		||||
			size_t size = 0;
 | 
			
		||||
			const char* blob = JS_ToCStringLen(context, &size, json);
 | 
			
		||||
			char id[k_id_base64_len] = { 0 };
 | 
			
		||||
			if (tf_ssb_db_blob_store(ssb, (const uint8_t*)blob, size, id, sizeof(id), NULL))
 | 
			
		||||
			{
 | 
			
		||||
				const char* app = dir;
 | 
			
		||||
				char* slash = strrchr(dir, '/');
 | 
			
		||||
				app = slash ? slash + 1 : app;
 | 
			
		||||
 | 
			
		||||
				if (_tf_ssb_register_app(ssb, user, app, id))
 | 
			
		||||
				{
 | 
			
		||||
					 tf_printf("Registered %s path:%s as %s.\n", user, app, id);
 | 
			
		||||
					_tf_ssb_import_add_app(ssb, user, app);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			JS_FreeCString(context, blob);
 | 
			
		||||
			JS_FreeValue(context, json);
 | 
			
		||||
 | 
			
		||||
			tf_free(dir);
 | 
			
		||||
		}
 | 
			
		||||
		JS_FreeValue(context, app);
 | 
			
		||||
		tf_free(file);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void tf_ssb_import_from_zip(tf_ssb_t* ssb, const char* zip_path, const char* user, const char* path)
 | 
			
		||||
{
 | 
			
		||||
	unzFile zip = unzOpen(zip_path);
 | 
			
		||||
	if (zip)
 | 
			
		||||
	{
 | 
			
		||||
		tf_printf("Importing from %s.", zip_path);
 | 
			
		||||
		if (unzGoToFirstFile(zip) == UNZ_OK)
 | 
			
		||||
		{
 | 
			
		||||
			while (unzGoToNextFile(zip) == UNZ_OK)
 | 
			
		||||
			{
 | 
			
		||||
				char file_path[256];
 | 
			
		||||
				unz_file_info64 info = { 0 };
 | 
			
		||||
				if (unzGetCurrentFileInfo64(zip, &info, file_path, sizeof(file_path), NULL, 0, NULL, 0) == UNZ_OK)
 | 
			
		||||
				{
 | 
			
		||||
					if (strncmp(file_path, path, strlen(path)) == 0 &&
 | 
			
		||||
						!strchr(file_path + strlen(path) + 1, '/') &&
 | 
			
		||||
						strlen(file_path) > strlen(".json") &&
 | 
			
		||||
						strcasecmp(file_path + strlen(file_path) - strlen(".json"), ".json") == 0)
 | 
			
		||||
					{
 | 
			
		||||
						unz_file_pos pos = { 0 };
 | 
			
		||||
						unzGetFilePos(zip, &pos);
 | 
			
		||||
						_tf_ssb_import_app_json_from_zip(ssb, zip, tf_ssb_get_context(ssb), user, file_path);
 | 
			
		||||
						unzGoToFilePos(zip, &pos);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		unzClose(zip);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,3 +3,4 @@
 | 
			
		||||
typedef struct _tf_ssb_t tf_ssb_t;
 | 
			
		||||
 | 
			
		||||
void tf_ssb_import(tf_ssb_t* ssb, const char* user, const char* path);
 | 
			
		||||
void tf_ssb_import_from_zip(tf_ssb_t* ssb, const char* zip_path, const char* user, const char* path);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user