more work on meta stuff and comments and mv
This commit is contained in:
parent
06cea493e8
commit
72fea7759a
|
@ -129,6 +129,7 @@ _meta_file_write(Meta_File *mf)
|
|||
if (mf->list)
|
||||
{
|
||||
// XXX: should gain a lock!
|
||||
// XXX: should write to tmp then rename atomically
|
||||
f = fopen(meta_path, "w");
|
||||
if (!f)
|
||||
{ // can't write to dir - write to personal meta instead
|
||||
|
@ -137,7 +138,7 @@ _meta_file_write(Meta_File *mf)
|
|||
if (!meta_path) return;
|
||||
dir = ecore_file_dir_get(meta_path);
|
||||
if (!dir) return;
|
||||
ecore_file_mkpath(dir);
|
||||
if (!ecore_file_is_dir(dir)) ecore_file_mkpath(dir);
|
||||
free(dir);
|
||||
dir = NULL;
|
||||
f = fopen(meta_path, "w");
|
||||
|
@ -145,7 +146,9 @@ _meta_file_write(Meta_File *mf)
|
|||
}
|
||||
fprintf(f, "[Efm Meta]\n");
|
||||
EINA_LIST_FOREACH(mf->list, l, m)
|
||||
fprintf(f, "%s=%s\n", m->meta, m->data);
|
||||
{
|
||||
fprintf(f, "%s=%s\n", m->meta, m->data);
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
else // no meta keys - delete it
|
||||
|
@ -170,7 +173,7 @@ _cb_meta_flush_timer(void *data EINA_UNUSED)
|
|||
_meta_flush_timer = NULL;
|
||||
_meta_writes_flush();
|
||||
// XXX: if flush took too long - queue another timer and try flush again
|
||||
// in future. repeate until nothing left to flush
|
||||
// in future. repeat until nothing left to flush
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
|
@ -394,7 +397,7 @@ meta_path_prepare(const char *path)
|
|||
|
||||
Eina_Bool
|
||||
meta_path_can_write(const char *path)
|
||||
{ // can we write to the taget dir of "path" file for meta data?
|
||||
{ // can we write to the target dir of "path" file for meta data?
|
||||
// yes - this is racey. but then again anything is. we could make a
|
||||
// .efm dir then have permission removed before we make the subdiors
|
||||
// or meta files. anything that involves more than a single file and
|
||||
|
@ -410,8 +413,8 @@ meta_path_can_write(const char *path)
|
|||
|
||||
if (!dir) return ret;
|
||||
if (stat(dir, &st) == -1) goto err;
|
||||
// policy - we only cosider direst owned by the user writable. want to
|
||||
// avoid e.g. root browsing then modifying dirs owne by a user or dirs
|
||||
// policy - we only consider dirs owned by the user writeable. want to
|
||||
// avoid e.g. root browsing then modifying dirs ownee by a user or dirs
|
||||
// that might have group write access being written to by multiple users
|
||||
if ((st.st_uid == uid) && (st.st_mode & S_IWUSR))
|
||||
{
|
||||
|
@ -440,4 +443,4 @@ meta_path_can_write(const char *path)
|
|||
err:
|
||||
free(dir);
|
||||
return ret;
|
||||
}
|
||||
}
|
|
@ -18,13 +18,14 @@
|
|||
|
||||
static const char *config_dir = NULL;
|
||||
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
// mv [src] [dst]
|
||||
const char *src, *dst, *fname, *home_dir;
|
||||
char *fdir;
|
||||
Eina_Strbuf *buf = NULL, *buf2 = NULL;
|
||||
Eina_Strbuf *buf = NULL;
|
||||
|
||||
if (argc < 3) return -1;
|
||||
src = argv[1];
|
||||
|
@ -39,10 +40,10 @@ main(int argc, char **argv)
|
|||
if (!home_dir) return 77; // no $HOME? definitely an error!
|
||||
if (!config_dir)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
char sbuf[PATH_MAX];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s/.e/e", home_dir);
|
||||
config_dir = eina_stringshare_add(buf);
|
||||
snprintf(sbuf, sizeof(sbuf), "%s/.e/e", home_dir);
|
||||
config_dir = eina_stringshare_add(sbuf);
|
||||
}
|
||||
meta_init(config_dir);
|
||||
|
||||
|
@ -121,49 +122,49 @@ main(int argc, char **argv)
|
|||
break;
|
||||
case EROFS: // read only disk
|
||||
break;
|
||||
case EXDEV: // revert to cp -par
|
||||
break;
|
||||
case EXDEV: // revert t640k
|
||||
default: // WAT???
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Eina_Bool src_can_write, dst_can_write;
|
||||
const char *dstfile;
|
||||
char *src_meta, *dst_meta;
|
||||
|
||||
fprintf(stderr, "MV: OK\n");
|
||||
// XXX: use meta_path_find() or meta_path_user_find() based on
|
||||
// XXX: meta_path_can_write() and prep the dest with meta_path_prepare()
|
||||
fdir = ecore_file_dir_get(src);
|
||||
if (fdir)
|
||||
|
||||
dstfile = eina_strbuf_string_get(buf);
|
||||
|
||||
src_can_write = meta_path_can_write(src);
|
||||
dst_can_write = meta_path_can_write(eina_strbuf_string_get(buf));
|
||||
|
||||
if (src_can_write) src_meta = meta_path_find(src, "meta.efm");
|
||||
else src_meta = meta_path_user_find(src, "meta.efm");
|
||||
if (dst_can_write) dst_meta = meta_path_find(dstfile, "meta.efm");
|
||||
else dst_meta = meta_path_user_find(dstfile, "meta.efm");
|
||||
if ((src_meta) && (dst_meta) && (meta_path_prepare(dstfile)))
|
||||
{
|
||||
// mv the efm meta file if it exists...
|
||||
buf2 = eina_strbuf_new();
|
||||
|
||||
// XXX" if buf2 is null?
|
||||
eina_strbuf_append(buf2, dst);
|
||||
eina_strbuf_append(buf2, "/.efm");
|
||||
ecore_file_mkdir(eina_strbuf_string_get(buf2));
|
||||
|
||||
eina_strbuf_reset(buf2);
|
||||
eina_strbuf_append(buf2, fdir);
|
||||
eina_strbuf_append(buf2, "/.efm/");
|
||||
eina_strbuf_append(buf2, fname);
|
||||
eina_strbuf_append(buf2, ".efm");
|
||||
|
||||
eina_strbuf_reset(buf);
|
||||
eina_strbuf_append(buf, dst);
|
||||
eina_strbuf_append(buf, "/.efm/");
|
||||
eina_strbuf_append(buf, fname);
|
||||
eina_strbuf_append(buf, ".efm");
|
||||
// XXX: what if the target meta file already exists???
|
||||
rename(eina_strbuf_string_get(buf2), eina_strbuf_string_get(buf));
|
||||
free(fdir);
|
||||
// XXX: mv meta if in ~/.e/e/efm/meta
|
||||
// XXX: mv thumb files in /.e/e/efm/thumbs
|
||||
// XXX: use mv() rename wrapper than will cp
|
||||
rename(src_meta, dst_meta);
|
||||
}
|
||||
free(src_meta);
|
||||
free(dst_meta);
|
||||
if (src_can_write) src_meta = meta_path_find(src, "thumb.efm");
|
||||
else src_meta = meta_path_user_find(src, "thumb.efm");
|
||||
if (dst_can_write) dst_meta = meta_path_find(dstfile, "thumb.efm");
|
||||
else dst_meta = meta_path_user_find(dstfile, "thumb.efm");
|
||||
if ((src_meta) && (dst_meta) && (meta_path_prepare(dstfile)))
|
||||
{
|
||||
// XXX: use mv() rename wrapper than will cp
|
||||
rename(src_meta, dst_meta);
|
||||
}
|
||||
free(src_meta);
|
||||
free(dst_meta);
|
||||
}
|
||||
err:
|
||||
if (buf) eina_strbuf_free(buf);
|
||||
if (buf2) eina_strbuf_free(buf2);
|
||||
// XXX: delete status file
|
||||
|
||||
meta_shutdown();
|
||||
|
|
|
@ -538,7 +538,7 @@ _file_thumb_handle(Eina_Strbuf *strbuf, const char *path, const char *mime,
|
|||
else
|
||||
{ // add the thumb property with full path to thumb
|
||||
cmd_strbuf_append(strbuf, "thumb", thumb);
|
||||
// XXX: add if tumb has alpha or not...
|
||||
// XXX: add if thumb has alpha or not...
|
||||
free(thumb);
|
||||
}
|
||||
}
|
||||
|
@ -637,6 +637,17 @@ _mime_get(const char *file)
|
|||
return efreet_mime_type_get(file);
|
||||
}
|
||||
|
||||
static void
|
||||
_file_add_mod_meta_append(const char *path, const char *meta, const char *key,
|
||||
Eina_Strbuf *strbuf)
|
||||
{
|
||||
Eina_Stringshare *s = meta_get(path, meta);
|
||||
|
||||
if (!s) return;
|
||||
cmd_strbuf_append(strbuf, key, s);
|
||||
eina_stringshare_del(s);
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
|
||||
{ // add file metadata info on file add or modfiy
|
||||
|
@ -648,8 +659,6 @@ _file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
|
|||
const char *mime, *ext, *icon;
|
||||
Efreet_Desktop *desktop;
|
||||
Eina_Bool have_label = EINA_FALSE;
|
||||
Eina_Stringshare *s;
|
||||
// XXX: x & y pos @ wxh view
|
||||
|
||||
if (lstat(path, &st) != 0) return EINA_FALSE;
|
||||
if ((st.st_mode & S_IFMT) == S_IFLNK)
|
||||
|
@ -1051,18 +1060,9 @@ _file_add_mod_info(Eina_Strbuf *strbuf, const char *path, Eina_Bool delay)
|
|||
cmd_strbuf_append(strbuf, "mtime", buf);
|
||||
snprintf(buf, sizeof(buf), "%llu", (unsigned long long)st.st_ctime);
|
||||
cmd_strbuf_append(strbuf, "ctime", buf);
|
||||
s = meta_get(path, "xy");
|
||||
if (s)
|
||||
{
|
||||
cmd_strbuf_append(strbuf, "meta.xy", s);
|
||||
eina_stringshare_del(s);
|
||||
}
|
||||
s = meta_get(path, "wh");
|
||||
if (s)
|
||||
{
|
||||
cmd_strbuf_append(strbuf, "meta.wh", s);
|
||||
eina_stringshare_del(s);
|
||||
}
|
||||
// add extra meta keys that might be used for immediate icon/file display
|
||||
_file_add_mod_meta_append(path, "xy", "meta.xy", strbuf);
|
||||
_file_add_mod_meta_append(path, "wh", "meta.wh", strbuf);
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
@ -1197,7 +1197,7 @@ _monitor(const char *path)
|
|||
can_write = meta_path_can_write(eina_strbuf_string_get(strbuf));
|
||||
if (strbuf) eina_strbuf_free(strbuf);
|
||||
|
||||
// tell the front end out listing is beginning
|
||||
// tell the front end our listing is beginning
|
||||
strbuf = cmd_strbuf_new("list-begin");
|
||||
cmd_strbuf_print_consume(strbuf);
|
||||
|
||||
|
@ -1211,7 +1211,7 @@ _monitor(const char *path)
|
|||
EINA_ITERATOR_FOREACH(it, info) _file_add(info->path);
|
||||
eina_iterator_free(it);
|
||||
err:
|
||||
// tell the front end out listing is done
|
||||
// tell the front end our listing is done
|
||||
strbuf = cmd_strbuf_new("list-end");
|
||||
cmd_strbuf_print_consume(strbuf);
|
||||
}
|
||||
|
@ -1266,7 +1266,7 @@ _handle_drop_paste(const char *over, const char *action, const char *path)
|
|||
mondir = ecore_file_monitor_path_get(mon);
|
||||
if (!mondir) return;
|
||||
if (over)
|
||||
{ // if you are dropping over a dir then spint up a sub open and pass
|
||||
{ // if you are dropping over a dir then spin up a sub open and pass
|
||||
// the dnd to it
|
||||
Eina_Strbuf *strbuf;
|
||||
Sub *sub;
|
||||
|
@ -1285,24 +1285,24 @@ _handle_drop_paste(const char *over, const char *action, const char *path)
|
|||
fprintf(stderr, "DROP in [%s] action=[%s] > [%s]\n", mondir, action,
|
||||
path);
|
||||
if ((!action) || (!strcmp(action, "copy")))
|
||||
{
|
||||
{ // XXX: implement
|
||||
}
|
||||
else if (!strcmp(action, "move"))
|
||||
_op_run("mv", path, mondir);
|
||||
else if (!strcmp(action, "ask"))
|
||||
{
|
||||
{ // XXX: implement
|
||||
}
|
||||
else if (!strcmp(action, "list"))
|
||||
{
|
||||
{ // XXX: implement
|
||||
}
|
||||
else if (!strcmp(action, "link"))
|
||||
{
|
||||
{ // XXX: implement
|
||||
}
|
||||
else if (!strcmp(action, "description"))
|
||||
{
|
||||
{ // XXX: implement
|
||||
}
|
||||
else
|
||||
{
|
||||
{ // XXX: implement
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1407,8 +1407,7 @@ do_handle_cmd(Cmd *c)
|
|||
KEY_WALK_END
|
||||
}
|
||||
else if (!strcmp(c->command, "dnd-drop"))
|
||||
{
|
||||
// "over" key means dnd was on that dir
|
||||
{ // "over" key means dnd was on that dir
|
||||
const char *over = cmd_key_find(c, "over");
|
||||
const char *action = cmd_key_find(c, "action");
|
||||
|
||||
|
@ -1427,7 +1426,7 @@ do_handle_cmd(Cmd *c)
|
|||
KEY_WALK_END
|
||||
}
|
||||
else if (!strcmp(c->command, "cnp-paste"))
|
||||
{
|
||||
{ // XXX: implement
|
||||
}
|
||||
// cmd_dump_sterr(c);
|
||||
}
|
||||
|
@ -1453,7 +1452,7 @@ do_init(int argc EINA_UNUSED, const char **argv EINA_UNUSED)
|
|||
config_dir = eina_stringshare_add(buf);
|
||||
}
|
||||
|
||||
// maximum number of back-end thumbnailer slaves is num cores - 2
|
||||
// maximum number of back-end thumbnailer slaves is num_cores - 2
|
||||
// with a minimum of 1 (so dual core systems will be limited to 1
|
||||
// thumbnailer at once. quad core will run 2. 8 core will run 6, 16
|
||||
// core will run 14, 32 core will run 30 etc. - this can get overidden
|
||||
|
|
Loading…
Reference in New Issue