added --debug
[ptask.git] / src / tw.c
index 366a0dc..2d95614 100644 (file)
--- a/src/tw.c
+++ b/src/tw.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 jeanfi@gmail.com
+ * Copyright (C) 2012-2013 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #include <json/json.h>
 
+#include <log.h>
+#include "note.h"
 #include "tw.h"
 
-char *task_exec(char *opts)
+static int has_taskrc()
+{
+       char *home, *path;
+       int ret;
+       struct stat st;
+
+       home = getenv("HOME");
+
+       if (!home) {
+               log_err("HOME environment variable not defined");
+               return 0;
+       }
+
+       path = malloc(strlen(home) + 1 + strlen(".taskrc") + 1);
+       sprintf(path, "%s/%s", home, ".taskrc");
+
+       ret = lstat(path, &st);
+
+       free(path);
+
+       return ret == 0;
+
+}
+
+static char *task_exec(char *opts)
 {
        FILE *f;
-       int ret, s;
+       int ret;
+       size_t s;
        char *str, *tmp, *cmd, buf[1024];
 
-       str = NULL;
+       if (!has_taskrc())
+               return NULL;
 
        cmd = malloc(strlen("task rc.json.array=on ") + strlen(opts) + 1);
        strcpy(cmd, "task rc.json.array=on ");
        strcat(cmd, opts);
 
-       printf("execute: %s\n", cmd);
+       log_debug("execute: %s", cmd);
 
        f = popen(cmd, "r");
 
        if (!f) {
                perror("popen");
+               str = NULL;
                goto exit_free;
        }
 
-       str = malloc(1);
-       str[0] = '\0';
+       str = strdup("");
        while ((s = fread(buf, 1, 1024, f))) {
-               tmp = malloc(strlen(str) + s + 1);
+               tmp = malloc(strlen(str) + s + (size_t)1);
                memcpy(tmp, str, strlen(str));
                memcpy(tmp + strlen(str), buf, s);
                tmp[strlen(str) + s] = '\0';
@@ -59,10 +88,8 @@ char *task_exec(char *opts)
 
        ret = pclose(f);
 
-       if (ret == -1) {
-               printf("pclose fails\n");
-               perror("pclose");
-       }
+       if (ret == -1)
+               log_err("pclose fails");
 
  exit_free:
        free(cmd);
@@ -86,13 +113,18 @@ static struct json_object *task_exec_json(char *opts)
        return NULL;
 }
 
-struct task **get_all_tasks()
+struct task **tw_get_all_tasks(const char *status)
 {
        int i, n;
        struct json_object *jtasks, *jtask, *json;
        struct task **tasks;
+       char *opts;
 
-       jtasks = task_exec_json("export");
+       opts = malloc(strlen("export status:") + strlen(status) + 1);
+       sprintf(opts, "export status:%s", status);
+
+       jtasks = task_exec_json(opts);
+       free(opts);
 
        if (!jtasks)
                return NULL;
@@ -122,10 +154,17 @@ struct task **get_all_tasks()
                else
                        tasks[i]->project = NULL;
 
+               json = json_object_object_get(jtask, "priority");
+               if (json)
+                       tasks[i]->priority
+                               = strdup(json_object_get_string(json));
+               else
+                       tasks[i]->priority = strdup("");
+
                json = json_object_object_get(jtask, "uuid");
                tasks[i]->uuid = strdup(json_object_get_string(json));
 
-               tasks[i]->note = NULL;
+               tasks[i]->note = note_get(tasks[i]->uuid);
        }
 
        tasks[n] = NULL;
@@ -135,7 +174,7 @@ struct task **get_all_tasks()
        return tasks;
 }
 
-char *escape(const char *txt)
+static char *escape(const char *txt)
 {
        char *result;
        char *c;
@@ -143,8 +182,8 @@ char *escape(const char *txt)
        result = malloc(2*strlen(txt)+1);
        c = result;
 
-       while(*txt) {
-               switch(*txt) {
+       while (*txt) {
+               switch (*txt) {
                case '"':
                        *c = '\\'; c++;
                        *c = '"';
@@ -169,3 +208,128 @@ char *escape(const char *txt)
        return result;
 }
 
+void tw_modify_description(const char *uuid, const char *newdesc)
+{
+       char *str;
+       char *opts;
+
+       str = escape(newdesc);
+
+       opts = malloc(1
+                     + strlen(uuid)
+                     + strlen(" modify :\"")
+                     + strlen(str)
+                     + strlen("\"")
+                     + 1);
+       sprintf(opts, " %s modify \"%s\"", uuid, str);
+
+       task_exec(opts);
+
+       free(str);
+       free(opts);
+}
+
+void tw_modify_project(const char *uuid, const char *newproject)
+{
+       char *str;
+       char *opts;
+
+       str = escape(newproject);
+
+       opts = malloc(1
+                     + strlen(uuid)
+                     + strlen(" modify project:\"")
+                     + strlen(str)
+                     + strlen("\"")
+                     + 1);
+       sprintf(opts, " %s modify project:\"%s\"", uuid, str);
+
+       task_exec(opts);
+
+       free(str);
+       free(opts);
+}
+
+void tw_modify_priority(const char *uuid, const char *priority)
+{
+       char *str;
+       char *opts;
+
+       str = escape(priority);
+
+       opts = malloc(1
+                     + strlen(uuid)
+                     + strlen(" modify priority:\"")
+                     + strlen(str)
+                     + strlen("\"")
+                     + 1);
+       sprintf(opts, " %s modify priority:\"%s\"", uuid, str);
+
+       task_exec(opts);
+
+       free(str);
+       free(opts);
+}
+
+void tw_add(const char *newdesc)
+{
+       char *str;
+       char *opts;
+
+       str = escape(newdesc);
+
+       opts = malloc(1
+                     + strlen(" add \"")
+                     + strlen(str)
+                     + strlen("\"")
+                     + 1);
+       sprintf(opts, " add \"%s\"", str);
+
+       task_exec(opts);
+
+       free(str);
+       free(opts);
+}
+
+void tw_done(const char *uuid)
+{
+       char *opts;
+
+       opts = malloc(1
+                     + strlen(uuid)
+                     + strlen(" done")
+                     + 1);
+       sprintf(opts, " %s done", uuid);
+
+       task_exec(opts);
+
+       free(opts);
+}
+
+static void task_free(struct task *task)
+{
+       if (!task)
+               return ;
+
+       free(task->description);
+       free(task->status);
+       free(task->uuid);
+       free(task->note);
+       free(task->project);
+       free(task->priority);
+
+       free(task);
+}
+
+void tw_task_list_free(struct task **tasks)
+{
+       struct task **cur;
+
+       if (!tasks)
+               return ;
+
+       for (cur = tasks; *cur; cur++)
+               task_free(*cur);
+
+       free(tasks);
+}