254 } else if(cx_strsuffix(path, CX_STR(".xml"))) { |
254 } else if(cx_strsuffix(path, CX_STR(".xml"))) { |
255 type = DAV_RESOURCE_VIEW_TEXT; |
255 type = DAV_RESOURCE_VIEW_TEXT; |
256 } |
256 } |
257 } |
257 } |
258 |
258 |
259 dav_resourceviewer_new(browser, res->path, type); |
259 resourceviewer_new(browser, res->path, type); |
260 } |
260 } |
261 |
261 |
262 void davbrowser_add2navstack(DavBrowser *browser, const char *base, const char *path) { |
262 void davbrowser_add2navstack(DavBrowser *browser, const char *base, const char *path) { |
263 if (browser->navstack_enabled) { |
263 if (browser->navstack_enabled) { |
264 for (int i = 0; i < browser->navstack_pos; i++) { |
264 for (int i = 0; i < browser->navstack_pos; i++) { |
965 |
965 |
966 download->ui = ui; |
966 download->ui = ui; |
967 download->browser = browser; |
967 download->browser = browser; |
968 download->sn = reslist->session; |
968 download->sn = reslist->session; |
969 download->download_sn = dav_session_clone(download->sn); |
969 download->download_sn = dav_session_clone(download->sn); |
970 download->reslist = reslist; |
970 download->reslist = reslist; // TODO: is this safe or do we need a copy? |
971 download->local_path = strdup(local_path); |
971 download->local_path = strdup(local_path); |
972 |
972 |
973 download->queue = ui_threadpool_create(1); |
973 download->queue = ui_threadpool_create(1); |
974 |
974 |
975 // create download progress window |
975 // create download progress window |
1232 doc->text = ui_text_new(ctx, "text"); |
1232 doc->text = ui_text_new(ctx, "text"); |
1233 doc->image = ui_generic_new(ctx, "image"); |
1233 doc->image = ui_generic_new(ctx, "image"); |
1234 |
1234 |
1235 doc->properties = ui_list_new(ctx, "properties"); |
1235 doc->properties = ui_list_new(ctx, "properties"); |
1236 |
1236 |
|
1237 doc->info_url = ui_string_new(ctx, "info_url"); |
|
1238 doc->info_name = ui_string_new(ctx, "info_name"); |
|
1239 doc->info_type = ui_string_new(ctx, "info_type"); |
|
1240 doc->info_encrypted = ui_string_new(ctx, "info_encrypted"); |
|
1241 doc->info_etag = ui_string_new(ctx, "info_etag"); |
|
1242 doc->info_size = ui_string_new(ctx, "info_size"); |
|
1243 |
1237 return doc; |
1244 return doc; |
1238 } |
1245 } |
1239 |
1246 |
1240 static char* gen_tmp_download_filename(const char *name) { |
1247 static char* gen_tmp_download_filename(const char *name) { |
1241 char *dir = ui_getappdir(); |
1248 char *dir = ui_getappdir(); |
1253 |
1260 |
1254 DavResource *res = dav_resource_new(doc->sn, doc->path); |
1261 DavResource *res = dav_resource_new(doc->sn, doc->path); |
1255 doc->error = dav_load(res); |
1262 doc->error = dav_load(res); |
1256 if(!doc->error) { |
1263 if(!doc->error) { |
1257 doc->current = res; |
1264 doc->current = res; |
|
1265 |
|
1266 char *url = util_concat_path(res->session->base_url, res->href); |
|
1267 ui_set(doc->info_url, url); |
|
1268 free(url); |
|
1269 |
|
1270 ui_set(doc->info_name, res->name); |
|
1271 |
|
1272 if(res->iscollection) { |
|
1273 ui_set(doc->info_type, "Collection"); |
|
1274 } else { |
|
1275 if(res->contenttype) { |
|
1276 cxmutstr type = cx_asprintf("Resource (%s)", res->contenttype); |
|
1277 ui_set(doc->info_type, type.ptr); |
|
1278 free(type.ptr); |
|
1279 } else { |
|
1280 ui_set(doc->info_type, "Resource"); |
|
1281 } |
|
1282 } |
|
1283 |
|
1284 char *keyprop = dav_get_string_property_ns( |
|
1285 res, |
|
1286 DAV_NS, |
|
1287 "crypto-key"); |
|
1288 if(keyprop) { |
|
1289 cxmutstr info_encrypted = cx_asprintf("Yes Key: %s", keyprop); |
|
1290 ui_set(doc->info_encrypted, info_encrypted.ptr); |
|
1291 free(info_encrypted.ptr); |
|
1292 } else { |
|
1293 ui_set(doc->info_encrypted, "No"); |
|
1294 } |
|
1295 |
|
1296 char *etag = dav_get_string_property_ns( |
|
1297 res, |
|
1298 "DAV:", |
|
1299 "getetag"); |
|
1300 ui_set(doc->info_etag, etag); |
|
1301 |
|
1302 if(res->contentlength > 0) { |
|
1303 char *sz = util_size_str(FALSE, res->contentlength); |
|
1304 cxmutstr size_str = cx_asprintf("%s (%" PRIu64 " bytes)", sz, res->contentlength); |
|
1305 ui_set(doc->info_size, size_str.ptr); |
|
1306 free(size_str.ptr); |
|
1307 } else { |
|
1308 ui_set(doc->info_size, "0"); |
|
1309 } |
|
1310 |
|
1311 |
|
1312 size_t count = 0; |
|
1313 DavPropName *properties = dav_get_property_names(res, &count); |
|
1314 for(int i=0;i<count;i++) { |
|
1315 DavPropertyList *prop = ui_malloc(doc->ctx, sizeof(DavPropertyList)); |
|
1316 prop->ns = properties[i].ns ? ui_strdup(doc->ctx, properties[i].ns) : NULL; |
|
1317 prop->name = ui_strdup(doc->ctx, properties[i].name); |
|
1318 |
|
1319 DavXmlNode *xval = dav_get_property_ns(res, prop->ns, prop->name); |
|
1320 if(xval) { |
|
1321 if(dav_xml_isstring(xval)) { |
|
1322 char *value = dav_xml_getstring(xval); |
|
1323 if(value) { |
|
1324 prop->value_simplified = NULL; |
|
1325 prop->value_full = ui_strdup(doc->ctx, value); |
|
1326 } |
|
1327 } else { |
|
1328 DavXmlNode *x = xval->type == DAV_XML_ELEMENT ? xval : dav_xml_nextelm(xval); |
|
1329 cxmutstr value = cx_asprintf_a(ui_allocator(doc->ctx), "<%s>...</%s>", x->name, x->name); |
|
1330 prop->value_simplified = value.ptr; |
|
1331 } |
|
1332 } |
|
1333 |
|
1334 ui_list_append(doc->properties, prop); |
|
1335 } |
|
1336 doc->properties->update(doc->properties, 0); |
|
1337 |
1258 |
1338 |
1259 if(res->contentlength < DAV_RESOURCEVIEWER_PREVIEW_MAX_SIZE) { |
1339 if(res->contentlength < DAV_RESOURCEVIEWER_PREVIEW_MAX_SIZE) { |
1260 if(doc->type == DAV_RESOURCE_VIEW_TEXT) { |
1340 if(doc->type == DAV_RESOURCE_VIEW_TEXT) { |
1261 doc->text_content = cxBufferCreate(NULL, res->contentlength, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS); |
1341 doc->text_content = cxBufferCreate(NULL, res->contentlength, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS); |
1262 int err = dav_get_content(res, doc->text_content, (dav_write_func)cxBufferWrite); |
1342 int err = dav_get_content(res, doc->text_content, (dav_write_func)cxBufferWrite); |