static PcsFileInfoList *get_file_list(Pcs pcs, const char *dir, const char *sort, PcsBool desc, PcsBool recursion) { PcsFileInfoList *reslist = NULL, *list = NULL, *sublist = NULL, *item = NULL; PcsFileInfo *info = NULL; int page_index = 1, page_size = 100; int cnt = 0, cnt_total = 0; while(1) { printf("List %s, Got %d Files \r", dir, cnt_total); fflush(stdout); list = pcs_list(pcs, dir, page_index, page_size, sort ? sort : "name", sort ? desc : PcsFalse); if (!list) { if (pcs_strerror(pcs)) printf("Cannot list %s: %s\n", dir, pcs_strerror(pcs)); return NULL; } cnt = list->count; cnt_total += cnt; if (recursion) { PcsFileInfoListItem *listitem; PcsFileInfoListIterater iterater; reslist = pcs_filist_create(); if (!reslist) { printf("Cannot create the PcsFileInfoList object for %s.\n", dir); pcs_filist_destroy(list); return NULL; } pcs_filist_iterater_init(list, &iterater, PcsFalse); while(pcs_filist_iterater_next(&iterater)) { info = iterater.current; listitem = iterater.cursor; pcs_filist_remove(list, listitem, &iterater); pcs_filist_add(reslist, listitem); if (info->isdir) { sublist = get_file_list(pcs, info->path, sort, desc, recursion); if (sublist) { pcs_filist_combin(reslist, sublist); pcs_filist_destroy(sublist); } } else { /* * 因为百度网盘返回的都是文件夹在前,文件在后, * 因此遇到第一个文件,则后边的都是文件。 * 所以可以跳过检查,直接合并 */ pcs_filist_combin(reslist, list); break; } } pcs_filist_destroy(list); } else { reslist = list; } if (cnt > 0) { printf("List %s, Got %d Files \r", dir, cnt_total); fflush(stdout); } if (cnt < page_size) { break; } page_index++; } return reslist; }
/* 根据传入参数,执行api函数。参数传入方法,参考pcs_build_pan_api_url()函数 action: list, search */ static PcsFileInfoList *pcs_pan_api_1(Pcs handle, const char *action, ...) { struct pcs *pcs = (struct pcs *)handle; va_list args; cJSON *json, *item, *list; char *url, *html; int error, cnt, i; PcsFileInfoList *filist = NULL; PcsFileInfoListItem *filist_item; PcsFileInfo *fi; pcs_clear_errmsg(handle); va_start(args, action); url = pcs_build_pan_api_url_v(handle, action, args); va_end(args); if (!url) { pcs_set_errmsg(handle, "Can't build url."); return NULL; } html = pcs_http_get(pcs->http, url, PcsTrue); pcs_free(url); if (!html) { pcs_set_errmsg(handle, "Can't get response from the remote server."); return NULL; } json = cJSON_Parse(html); if (!json){ //printf("%s\n", html); pcs_set_errmsg(handle, "Can't parse the response as json: %s", html); return NULL; } item = cJSON_GetObjectItem(json, "errno"); if (!item) { //printf("%s\n", html); pcs_set_errmsg(handle, "Can't read res.errno: %s", html); cJSON_Delete(json); return NULL; } error = item->valueint; if (error != 0) { //printf("%s\n", html); pcs_set_errmsg(handle, "%s, Error:%d", get_errmsg_by_errno(error), error); cJSON_Delete(json); return NULL; } list = cJSON_GetObjectItem(json, "list"); if (!list) { pcs_set_errmsg(handle, "Can't read res.list: %s", html); cJSON_Delete(json); return NULL; } cnt = cJSON_GetArraySize(list); if (cnt <= 0) { cJSON_Delete(json); return NULL; } filist = pcs_filist_create(); if (!filist) { pcs_set_errmsg(handle, "Can't create object: PcsFileInfoList"); cJSON_Delete(json); return NULL; } for (i = 0; i < cnt; i++) { item = cJSON_GetArrayItem(list, i); filist_item = pcs_filistitem_create(); if (!filist_item) { pcs_set_errmsg(handle, "Can't create object: PcsFileInfoListItem"); cJSON_Delete(json); if (filist) pcs_filist_destroy(filist); return NULL; } fi = pcs_parse_fileinfo(item); if (!fi) { pcs_set_errmsg(handle, "Can't create object: PcsFileInfo"); cJSON_Delete(json); pcs_filistitem_destroy(filist_item); if (filist) pcs_filist_destroy(filist); return NULL; } filist_item->info = fi; pcs_filist_add(filist, filist_item); } cJSON_Delete(json); return filist; }