/// return current path if a directory, path to file if file, also handles x-caja-desktop /// on failure (smb:///, sftp, ...) returns empty string inline std::string get_path(CajaFileInfo* file_info){ if(caja_file_info_is_directory(file_info)){ const gchar_handle uri(caja_file_info_get_uri(file_info)); const std::size_t len = std::strlen(uri.get()); if(len >= caja_desktop.size() && caja_desktop.compare(0, caja_desktop.size(), uri.get(), caja_desktop.size()) == 0){ const char* home = g_get_home_dir(); return to_string(home); } const gchar_handle path(g_filename_from_uri(uri.get(), nullptr, nullptr)); return to_string(path.get()); } const gchar_handle uri(caja_file_info_get_parent_uri(file_info)); const gchar_handle path(g_filename_from_uri(uri.get(), nullptr, nullptr)); return to_string(path.get()); }
static GList* get_file_items (CajaMenuProvider *provider, GtkWidget *window, GList *files) { CajaShares *shares; gboolean one_item, is_local, is_dir; CajaFileInfo *info; CajaMenuItem *menu_item; shares = CAJA_SHARES (provider); one_item = (files && !files->next); if (!one_item) return NULL; info = files->data; is_dir = caja_file_info_is_directory (info); if (!is_dir) return NULL; is_local = is_directory_local (info); if (!is_local) return NULL; menu_item = caja_menu_item_new ("CajaShares::share", _("_Share Folder..."), _("Share this folder with other computers"), "mate-fs-share"); /* do not allow running more than one instance from caja at the same time */ g_object_set (menu_item, "sensitive", (shares->pid == 0), NULL); g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (on_menu_item_activate), NULL); g_object_set_data (G_OBJECT (menu_item), "file", info); g_object_set_data (G_OBJECT (menu_item), "shares", provider); return g_list_append (NULL, menu_item); }
static gboolean file_get_share_status_file (CajaShares *shares, CajaFileInfo *file) { char *path; gboolean status; if (!caja_file_info_is_directory(file) || !is_directory_local (file)) status = FALSE; else { path = get_path_from_file_info (file); g_return_val_if_fail (path != NULL, FALSE); status = (g_hash_table_lookup (shares->paths, path) != NULL); g_free (path); } return status; }
static void do_file_info_command(GIOChannel *chan, DropboxFileInfoCommand *dfic, GError **gerr) { /* we need to send two requests to dropbox: file status, and folder_tags */ GError *tmp_gerr = NULL; DropboxFileInfoCommandResponse *dficr; GHashTable *file_status_response = NULL, *args, *folder_tag_response = NULL, *emblems_response = NULL; gchar *filename = NULL; { gchar *filename_un, *uri; uri = caja_file_info_get_uri(dfic->file); filename_un = uri ? g_filename_from_uri(uri, NULL, NULL): NULL; g_free(uri); if (filename_un) { filename = g_filename_to_utf8(filename_un, -1, NULL, NULL, NULL); g_free(filename_un); if (filename == NULL) { /* oooh, filename wasn't correctly encoded. mark as */ debug("file wasn't correctly encoded %s", filename_un); } } } if (filename == NULL) { /* We couldn't get the filename. Just return empty. */ goto exit; } args = g_hash_table_new_full((GHashFunc) g_str_hash, (GEqualFunc) g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_strfreev); { gchar **path_arg; path_arg = g_new(gchar *, 2); path_arg[0] = g_strdup(filename); path_arg[1] = NULL; g_hash_table_insert(args, g_strdup("path"), path_arg); } emblems_response = send_command_to_db(chan, "get_emblems", args, NULL); if (emblems_response) { /* Don't need to do the other calls. */ g_hash_table_unref(args); goto exit; } /* send status command to server */ file_status_response = send_command_to_db(chan, "icon_overlay_file_status", args, &tmp_gerr); g_hash_table_unref(args); args = NULL; if (tmp_gerr != NULL) { g_free(filename); g_assert(file_status_response == NULL); g_propagate_error(gerr, tmp_gerr); return; } if (caja_file_info_is_directory(dfic->file)) { args = g_hash_table_new_full((GHashFunc) g_str_hash, (GEqualFunc) g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_strfreev); { gchar **paths_arg; paths_arg = g_new(gchar *, 2); paths_arg[0] = g_strdup(filename); paths_arg[1] = NULL; g_hash_table_insert(args, g_strdup("path"), paths_arg); } folder_tag_response = send_command_to_db(chan, "get_folder_tag", args, &tmp_gerr); g_hash_table_unref(args); args = NULL; if (tmp_gerr != NULL) { if (file_status_response != NULL) g_hash_table_destroy(file_status_response); g_assert(folder_tag_response == NULL); g_propagate_error(gerr, tmp_gerr); return; } }