enlightenment/src/bin/e_fm_cmdline.c

183 lines
4.3 KiB
C

# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
#include "e.h"
static EDBus_Connection *conn = NULL;
static int retval = EXIT_SUCCESS;
static int pending = 0;
static void
fm_open_reply(void *data __UNUSED__, const EDBus_Message *msg,
EDBus_Pending *dbus_pending __UNUSED__)
{
const char *name, *txt;
if (edbus_message_error_get(msg, &name, &txt))
{
retval = EXIT_FAILURE;
ERR("%s: %s", name, txt);
}
pending--;
if (!pending) ecore_main_loop_quit();
}
static Eina_Bool
fm_error_quit_last(void *data __UNUSED__)
{
if (!pending) ecore_main_loop_quit();
return EINA_FALSE;
}
static void
fm_open(const char *path)
{
EDBus_Message *msg;
const char *method;
char *p;
if (path[0] == '/')
p = strdup(path);
else if (strstr(path, "://"))
{
Efreet_Uri *uri = efreet_uri_decode(path);
if ((!uri) || (!uri->protocol) || (strcmp(uri->protocol, "file") != 0))
{
ERR("Invalid URI '%s'", path);
ecore_idler_add(fm_error_quit_last, NULL);
if (uri)
efreet_uri_free(uri);
return;
}
p = strdup(uri->path);
efreet_uri_free(uri);
}
else
{
char buf[PATH_MAX];
if (!getcwd(buf, sizeof(buf)))
{
ERR("Could not get current working directory: %s", strerror(errno));
ecore_idler_add(fm_error_quit_last, NULL);
return;
}
if (strcmp(path, ".") == 0)
p = strdup(buf);
else
{
char tmp[PATH_MAX];
snprintf(tmp, sizeof(tmp), "%s/%s", buf, path);
p = strdup(tmp);
}
}
DBG("'%s' -> '%s'", path, p);
if ((!p) || (p[0] == '\0'))
{
ERR("Could not get path '%s'", path);
ecore_idler_add(fm_error_quit_last, NULL);
free(p);
return;
}
if (ecore_file_is_dir(p))
method = "OpenDirectory";
else
method = "OpenFile";
msg = edbus_message_method_call_new("org.enlightenment.FileManager",
"/org/enlightenment/FileManager",
"org.enlightenment.FileManager",
method);
if (!msg)
{
ERR("Could not create DBus Message");
ecore_idler_add(fm_error_quit_last, NULL);
free(p);
return;
}
edbus_message_arguments_append(msg, "s", p);
free(p);
if (!edbus_connection_send(conn, msg, fm_open_reply, NULL, -1))
{
ERR("Could not send DBus Message");
edbus_message_unref(msg);
ecore_idler_add(fm_error_quit_last, NULL);
}
else
pending++;
}
static const Ecore_Getopt options = {
"enlightenment_filemanager",
"%prog [options] [file-or-folder1] ... [file-or-folderN]",
PACKAGE_VERSION,
"(C) 2012 Gustavo Sverzut Barbieri and others",
"BSD 2-Clause",
"Opens the Enlightenment File Manager at a given folders.",
EINA_FALSE,
{
ECORE_GETOPT_VERSION('V', "version"),
ECORE_GETOPT_COPYRIGHT('C', "copyright"),
ECORE_GETOPT_LICENSE('L', "license"),
ECORE_GETOPT_HELP('h', "help"),
ECORE_GETOPT_SENTINEL
}
};
EAPI int
main(int argc, char *argv[])
{
Eina_Bool quit_option = EINA_FALSE;
Ecore_Getopt_Value values[] = {
ECORE_GETOPT_VALUE_BOOL(quit_option),
ECORE_GETOPT_VALUE_BOOL(quit_option),
ECORE_GETOPT_VALUE_BOOL(quit_option),
ECORE_GETOPT_VALUE_BOOL(quit_option),
ECORE_GETOPT_VALUE_NONE
};
int args;
args = ecore_getopt_parse(&options, values, argc, argv);
if (args < 0)
{
ERR("Could not parse command line options.");
return EXIT_FAILURE;
}
if (quit_option) return EXIT_SUCCESS;
ecore_init();
ecore_file_init();
edbus_init();
conn = edbus_connection_get(EDBUS_CONNECTION_TYPE_SESSION);
if (!conn)
{
ERR("Could not DBus SESSION bus.");
retval = EXIT_FAILURE;
goto end;
}
retval = EXIT_SUCCESS;
if (args == argc) fm_open(".");
else
{
for (; args < argc; args++)
fm_open(argv[args]);
}
ecore_main_loop_begin();
edbus_connection_unref(conn);
end:
edbus_shutdown();
ecore_file_shutdown();
ecore_shutdown();
return retval;
}