Imported Upstream version 0.0.7
[ptask-pkg-ubuntu.git] / src / note.c
1 /*
2  * Copyright (C) 2012-2013 jeanfi@gmail.com
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301 USA
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <sys/stat.h>
24 #include <sys/types.h>
25
26 #include <log.h>
27 #include <note.h>
28 #include <pio.h>
29 #include <settings.h>
30
31 static const char *NOTE_SUF = ".note";
32
33 static char *get_default_path()
34 {
35         char *home, *dir;
36
37         home = getenv("HOME");
38
39         if (!home) {
40                 log_err("HOME environment variable not defined");
41                 return NULL;
42         }
43
44         dir = malloc(strlen(home) + 1 + strlen(".task") + 1);
45         sprintf(dir, "%s/%s", home, ".task");
46         mkdir(dir, 0777);
47
48         return dir;
49 }
50
51 static char *get_path(const char *uuid)
52 {
53         const char *sdir;
54         char *path, *dir;
55
56         sdir = settings_get_notes_dir();
57
58         if (sdir == NULL || *sdir == '\0') {
59                 dir = get_default_path();
60                 settings_set_notes_dir(dir);
61         } else {
62                 dir = strdup(sdir);
63         }
64
65         mkdirs(dir, 0777);
66
67         path = malloc(strlen(dir) + 1 + strlen(uuid) + strlen(NOTE_SUF) + 1);
68         sprintf(path, "%s/%s%s", dir, uuid, NOTE_SUF);
69
70         free(dir);
71
72         return path;
73 }
74
75 void note_put(const char *uuid, const char *note)
76 {
77         char *path;
78         FILE *f;
79
80         path = get_path(uuid);
81
82         if (!path)
83                 return ;
84
85         log_debug("note_put %s %s %s", path, uuid, note);
86
87         f = fopen(path, "w");
88
89         if (f) {
90                 fwrite(note, 1, strlen(note), f);
91                 fclose(f);
92         } else {
93                 log_err("Failed to open %s", path);
94         }
95
96         free(path);
97 }
98
99 char *note_get(const char *uuid)
100 {
101         char *str, *tmp, *path;
102         FILE *f;
103         char buf[1024];
104         size_t s;
105
106         path = get_path(uuid);
107
108         if (!path)
109                 return NULL;
110
111         str = strdup("");
112
113         f = fopen(path, "r");
114
115         if (f) {
116                 while ((s = fread(buf, 1, 1024, f))) {
117                         tmp = malloc(strlen(str) + s + (size_t)1);
118                         memcpy(tmp, str, strlen(str));
119                         memcpy(tmp + strlen(str), buf, s);
120                         tmp[strlen(str) + s] = '\0';
121                         free(str);
122                         str = tmp;
123                 }
124                 fclose(f);
125         } else {
126                 log_debug("%s does not exist or cannot be opened", path);
127         }
128
129         return str;
130 }