This adds functions for initializing and freeing resources used by
message storage access backend and example implementation in the dummy
(or rather - filesystem) backend.
Dummy backend uses $MAP_ROOT (if set) and falls back to
$HOME/map-messages for its message storage. This directory should at
least contain basic folders required by the MAP specification. It
represents the root as seen from the perspective of MAP client. You can
prepare it as follows:
$ mkdir -p "$MAP_ROOT/telecom/msg/inbox"
$ mkdir "$MAP_ROOT/telecom/msg/sent"
$ mkdir "$MAP_ROOT/telecom/msg/deleted"
$ mkdir "$MAP_ROOT/telecom/msg/outbox"
---
plugins/mas.c | 7 +++++++
plugins/messages-dummy.c | 22 ++++++++++++++++++++++
2 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/plugins/mas.c b/plugins/mas.c
index a84b8fd..761c23b 100644
--- a/plugins/mas.c
+++ b/plugins/mas.c
@@ -261,6 +261,10 @@ static int mas_init(void)
{
int err;
+ err = messages_init();
+ if (err < 0)
+ return err;
+
err = obex_mime_type_driver_register(&mime_map);
if (err < 0)
goto failed_mime;
@@ -275,6 +279,8 @@ failed_mas_reg:
obex_mime_type_driver_unregister(&mime_map);
failed_mime:
+ messages_exit();
+
return err;
}
@@ -282,6 +288,7 @@ static void mas_exit(void)
{
obex_service_driver_unregister(&mas);
obex_mime_type_driver_unregister(&mime_map);
+ messages_exit();
}
OBEX_PLUGIN_DEFINE(mas, mas_init, mas_exit)
diff --git a/plugins/messages-dummy.c b/plugins/messages-dummy.c
index a536d81..7b2e1a1 100644
--- a/plugins/messages-dummy.c
+++ b/plugins/messages-dummy.c
@@ -26,16 +26,38 @@
#endif
#include <errno.h>
+#include <stdlib.h>
#include "messages.h"
+static char *root_folder = NULL;
+
int messages_init(void)
{
+ char *tmp;
+
+ if (root_folder)
+ return 0;
+
+ tmp = getenv("MAP_ROOT");
+ if (tmp) {
+ root_folder = g_strdup(tmp);
+ return 0;
+ }
+
+ tmp = getenv("HOME");
+ if (!tmp)
+ return -1;
+
+ root_folder = g_build_filename(tmp, "map-messages", NULL);
+
return 0;
}
void messages_exit(void)
{
+ g_free(root_folder);
+ root_folder = NULL;
}
int messages_connect(void **session)
--
1.7.4.1
Hi Slawek,
On Mon, May 30, 2011, Slawomir Bochenski wrote:
> This adds functions for initializing and freeing resources used by
> message storage access backend and example implementation in the dummy
> (or rather - filesystem) backend.
>
> Dummy backend uses $MAP_ROOT (if set) and falls back to
> $HOME/map-messages for its message storage. This directory should at
> least contain basic folders required by the MAP specification. It
> represents the root as seen from the perspective of MAP client. You can
> prepare it as follows:
>
> $ mkdir -p "$MAP_ROOT/telecom/msg/inbox"
> $ mkdir "$MAP_ROOT/telecom/msg/sent"
> $ mkdir "$MAP_ROOT/telecom/msg/deleted"
> $ mkdir "$MAP_ROOT/telecom/msg/outbox"
> ---
> plugins/mas.c | 7 +++++++
> plugins/messages-dummy.c | 22 ++++++++++++++++++++++
> 2 files changed, 29 insertions(+), 0 deletions(-)
Thanks. Both patches have been pushed upstream.
Johan
This adds functions for initializing and freeing resources used by
message storage access backend and example implementation in the dummy
(or rather - filesystem) backend.
Dummy backend uses $MAP_ROOT (if set) and falls back to
$HOME/map-messages for its message storage. This directory should at
least contain basic folders required by the MAP specification. It
represents the root as seen from the perspective of MAP client. You can
prepare it as follows:
$ mkdir -p "$MAP_ROOT/telecom/msg/inbox"
$ mkdir "$MAP_ROOT/telecom/msg/sent"
$ mkdir "$MAP_ROOT/telecom/msg/deleted"
$ mkdir "$MAP_ROOT/telecom/msg/outbox"
---
plugins/mas.c | 7 +++++++
plugins/messages-dummy.c | 22 ++++++++++++++++++++++
2 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/plugins/mas.c b/plugins/mas.c
index a84b8fd..761c23b 100644
--- a/plugins/mas.c
+++ b/plugins/mas.c
@@ -261,6 +261,10 @@ static int mas_init(void)
{
int err;
+ err = messages_init();
+ if (err < 0)
+ return err;
+
err = obex_mime_type_driver_register(&mime_map);
if (err < 0)
goto failed_mime;
@@ -275,6 +279,8 @@ failed_mas_reg:
obex_mime_type_driver_unregister(&mime_map);
failed_mime:
+ messages_exit();
+
return err;
}
@@ -282,6 +288,7 @@ static void mas_exit(void)
{
obex_service_driver_unregister(&mas);
obex_mime_type_driver_unregister(&mime_map);
+ messages_exit();
}
OBEX_PLUGIN_DEFINE(mas, mas_init, mas_exit)
diff --git a/plugins/messages-dummy.c b/plugins/messages-dummy.c
index a536d81..3af624d 100644
--- a/plugins/messages-dummy.c
+++ b/plugins/messages-dummy.c
@@ -26,16 +26,38 @@
#endif
#include <errno.h>
+#include <stdlib.h>
#include "messages.h"
+static char *root_folder = NULL;
+
int messages_init(void)
{
+ char *tmp;
+
+ if (root_folder)
+ return 0;
+
+ tmp = getenv("MAP_ROOT");
+ if (tmp) {
+ root_folder = g_strdup(tmp);
+ return 0;
+ }
+
+ tmp = getenv("HOME");
+ if (!tmp)
+ return -ENOENT;
+
+ root_folder = g_build_filename(tmp, "map-messages", NULL);
+
return 0;
}
void messages_exit(void)
{
+ g_free(root_folder);
+ root_folder = NULL;
}
int messages_connect(void **session)
--
1.7.4.1
Hi Slawek,
On Thu, May 26, 2011, Slawomir Bochenski wrote:
> + tmp = getenv("HOME");
> + if (!tmp)
> + return -1;
Try to use return -<some suitable POSIX errno> whenever possible. This
makes error tracking easier in the long run when some higher layer in
the call stack logs the error and you don't have to figure out which of
the 10 places with "return -1" on the lower layers was the cause of it.
Yes, we might have existing places with -1 in the code, but I'd
appreciate if we didn't do it at least for new code.
Johan
---
plugins/mas.c | 16 ++++++++--
plugins/messages-dummy.c | 69 ++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 77 insertions(+), 8 deletions(-)
diff --git a/plugins/mas.c b/plugins/mas.c
index 761c23b..fb1b13a 100644
--- a/plugins/mas.c
+++ b/plugins/mas.c
@@ -88,6 +88,7 @@
struct mas_session {
struct mas_request *request;
+ void *backend_data;
};
static const uint8_t MAS_TARGET[TARGET_SIZE] = {
@@ -105,13 +106,20 @@ static void *mas_connect(struct obex_session *os, int *err)
DBG("");
- *err = 0;
-
mas = g_new0(struct mas_session, 1);
+ *err = messages_connect(&mas->backend_data);
+ if (*err < 0)
+ goto failed;
+
manager_register_session(os);
return mas;
+
+failed:
+ g_free(mas);
+
+ return NULL;
}
static void mas_disconnect(struct obex_session *os, void *user_data)
@@ -121,6 +129,7 @@ static void mas_disconnect(struct obex_session *os, void *user_data)
DBG("");
manager_unregister_session(os);
+ messages_disconnect(mas->backend_data);
mas_clean(mas);
}
@@ -178,6 +187,7 @@ static int mas_setpath(struct obex_session *os, obex_object_t *obj,
{
const char *name;
uint8_t *nonhdr;
+ struct mas_session *mas = user_data;
if (OBEX_ObjectGetNonHdrData(obj, &nonhdr) != 2) {
error("Set path failed: flag and constants not found!");
@@ -193,7 +203,7 @@ static int mas_setpath(struct obex_session *os, obex_object_t *obj,
return -EBADR;
}
- return 0;
+ return messages_set_folder(mas->backend_data, name, nonhdr[0] & 0x01);
}
static void *any_open(const char *name, int oflag, mode_t mode,
diff --git a/plugins/messages-dummy.c b/plugins/messages-dummy.c
index 7b2e1a1..3b5c98e 100644
--- a/plugins/messages-dummy.c
+++ b/plugins/messages-dummy.c
@@ -27,11 +27,17 @@
#include <errno.h>
#include <stdlib.h>
+#include <string.h>
#include "messages.h"
static char *root_folder = NULL;
+struct session {
+ char *cwd;
+ char *cwd_absolute;
+};
+
int messages_init(void)
{
char *tmp;
@@ -60,14 +66,26 @@ void messages_exit(void)
root_folder = NULL;
}
-int messages_connect(void **session)
+int messages_connect(void **s)
{
- *session = 0;
+ struct session *session;
+
+ session = g_new0(struct session, 1);
+ session->cwd = g_strdup("");
+ session->cwd_absolute = g_strdup(root_folder);
+
+ *s = session;
+
return 0;
}
-void messages_disconnect(void *session)
+void messages_disconnect(void *s)
{
+ struct session *session = s;
+
+ g_free(session->cwd);
+ g_free(session->cwd_absolute);
+ g_free(session);
}
int messages_set_notification_registration(void *session,
@@ -78,9 +96,50 @@ int messages_set_notification_registration(void *session,
return -EINVAL;
}
-int messages_set_folder(void *session, const char *name, gboolean cdup)
+int messages_set_folder(void *s, const char *name, gboolean cdup)
{
- return -EINVAL;
+ struct session *session = s;
+ char *newrel = NULL;
+ char *newabs;
+ char *tmp;
+
+ if (name && (strchr(name, '/') || strcmp(name, "..") == 0))
+ return -EBADR;
+
+ if (cdup) {
+ if (session->cwd[0] == 0)
+ return -ENOENT;
+
+ newrel = g_path_get_dirname(session->cwd);
+
+ /* We use empty string for indication of the root directory */
+ if (newrel[0] == '.' && newrel[1] == 0)
+ newrel[0] = 0;
+ }
+
+ tmp = newrel;
+ if (!cdup && (!name || name[0] == 0))
+ newrel = g_strdup("");
+ else
+ newrel = g_build_filename(newrel ? newrel : session->cwd, name,
+ NULL);
+ g_free(tmp);
+
+ newabs = g_build_filename(root_folder, newrel, NULL);
+
+ if (!g_file_test(newabs, G_FILE_TEST_IS_DIR)) {
+ g_free(newrel);
+ g_free(newabs);
+ return -ENOENT;
+ }
+
+ g_free(session->cwd);
+ session->cwd = newrel;
+
+ g_free(session->cwd_absolute);
+ session->cwd_absolute = newabs;
+
+ return 0;
}
int messages_get_folder_listing(void *session,
--
1.7.4.1