PCS_API PcsFileInfo *pcs_fileinfo_clone(PcsFileInfo *fi) { PcsFileInfo *res = pcs_fileinfo_create(); if (!res) return 0; res->fs_id = fi->fs_id; res->path = pcs_utils_strdup(fi->path); res->server_filename = pcs_utils_strdup(fi->server_filename); res->server_ctime = fi->server_ctime; res->server_mtime = fi->server_mtime; res->local_ctime = fi->local_ctime; res->local_mtime = fi->local_mtime; res->size = fi->size; res->category = fi->category; res->isdir = fi->isdir; res->dir_empty = fi->dir_empty; res->empty = fi->empty; res->md5 = pcs_utils_strdup(fi->md5); res->dlink = pcs_utils_strdup(fi->dlink); if (fi->block_list) { char **p = fi->block_list; int i = 0; while(*p) { i++; p++; } res->block_list = (char **)pcs_malloc((i + 1) * sizeof(char *)); if (res->block_list) { i = 0; p = fi->block_list; while(*p) { res->block_list[i++] = pcs_utils_strdup(*p); p++; } } } res->ifhassubdir = fi->ifhassubdir; if (fi->thumbs) { res->thumbs = pcs_slist2_clone(fi->thumbs); } return res; }
/*转换JSON对象为PcsFileInfo对象。 JSON对象格式为: { "fs_id": 123, "path": "/a/b", "server_filename": "b", "mtime": 1899383, "ctime": 1899383, "server_mtime": 1899383, "server_ctime": 1899383, "local_mtime": 1899383, "local_ctime": 1899383, "isdir": 1, "category": 1, "size": 0, "dir_empty": 0, "empty": 0, "ifhassubdir": 0, "md5": "", "dlink": "", "block_list": [ "/a/b/1", "a/b/2" ] } */ static PcsFileInfo *pcs_parse_fileinfo(cJSON * item) { cJSON *val, *list; PcsFileInfo *fi = pcs_fileinfo_create(); val = cJSON_GetObjectItem(item, "fs_id"); if ((val = cJSON_GetObjectItem(item, "fs_id"))) fi->fs_id = (UInt64)val->valuedouble; val = cJSON_GetObjectItem(item, "path"); if (val) fi->path = pcs_utils_strdup(val->valuestring); val = cJSON_GetObjectItem(item, "server_filename"); if (val) fi->server_filename = pcs_utils_strdup(val->valuestring); val = cJSON_GetObjectItem(item, "mtime"); if (val) fi->server_mtime = (UInt64)val->valuedouble; val = cJSON_GetObjectItem(item, "ctime"); if (val) fi->server_ctime = (UInt64)val->valuedouble; val = cJSON_GetObjectItem(item, "server_mtime"); if (val) fi->server_mtime = (UInt64)val->valuedouble; val = cJSON_GetObjectItem(item, "server_ctime"); if (val) fi->server_ctime = (UInt64)val->valuedouble; val = cJSON_GetObjectItem(item, "local_mtime"); if (val) fi->local_mtime = (UInt64)val->valuedouble; val = cJSON_GetObjectItem(item, "local_ctime"); if (val) fi->local_ctime = (UInt64)val->valuedouble; val = cJSON_GetObjectItem(item, "isdir"); if (val) fi->isdir = val->valueint ? PcsTrue : PcsFalse; val = cJSON_GetObjectItem(item, "category"); if (val) fi->category = val->valueint; val = cJSON_GetObjectItem(item, "size"); if (val) fi->size = (UInt64)val->valuedouble; val = cJSON_GetObjectItem(item, "dir_empty"); if (val) fi->dir_empty = val->valueint ? PcsTrue : PcsFalse; val = cJSON_GetObjectItem(item, "empty"); if (val) fi->empty = val->valueint ? PcsTrue : PcsFalse; val = cJSON_GetObjectItem(item, "ifhassubdir"); if (val) fi->ifhassubdir = val->valueint ? PcsTrue : PcsFalse; val = cJSON_GetObjectItem(item, "md5"); if (val) fi->md5 = pcs_utils_strdup(val->valuestring); val = cJSON_GetObjectItem(item, "dlink"); if (val) fi->dlink = pcs_utils_strdup(val->valuestring); list = cJSON_GetObjectItem(item, "block_list"); if (list) { int i, cnt = cJSON_GetArraySize(list); if (cnt > 0) { fi->block_list = (char **) pcs_malloc((cnt + 1) + sizeof(char *)); if (!fi->block_list) return fi; memset(fi->block_list, 0, (cnt + 1) + sizeof(char *)); for (i = 0; i < cnt; i++) { val = cJSON_GetArrayItem(list, i); fi->block_list[i] = pcs_utils_strdup(val->valuestring); } } } return fi; }