RSSyl: Allow use of .netrc by libcurl. Bug/enhancement #3309, by Vincent Pelletier
[claws.git] / src / plugins / python / foldertype.c
index 3b578c5ac0c5ff81e81c7b5e416e2a21a1af11e3..c11c701b78ee347fe35aa55ed940b7f686f644c2 100644 (file)
 #include "claws-features.h"
 #endif
 
-#include <glib/gi18n.h>
-
 #include "foldertype.h"
 #include "folderpropertiestype.h"
 #include "messageinfotype.h"
+#include "mailboxtype.h"
+
+#include <glib/gi18n.h>
 
 #include <structmember.h>
 
 
 typedef struct {
     PyObject_HEAD
-    PyObject *name;
-    PyObject *path;
-    PyObject *mailbox_name;
     PyObject *properties;
     FolderItem *folderitem;
 } clawsmail_FolderObject;
@@ -41,28 +39,10 @@ typedef struct {
 
 static void Folder_dealloc(clawsmail_FolderObject* self)
 {
-  Py_XDECREF(self->name);
-  Py_XDECREF(self->path);
-  Py_XDECREF(self->mailbox_name);
   Py_XDECREF(self->properties);
   self->ob_type->tp_free((PyObject*)self);
 }
 
-#define FOLDERITEM_STRING_TO_PYTHON_FOLDER_MEMBER(self,fis, pms)    \
-  do {                                                              \
-    if(fis) {                                                       \
-      PyObject *str;                                                \
-      str = PyString_FromString(fis);                               \
-      if(str) {                                                     \
-        int retval;                                                 \
-        retval = PyObject_SetAttrString((PyObject*)self, pms, str); \
-        Py_DECREF(str);                                             \
-        if(retval == -1)                                            \
-          goto err;                                                 \
-      }                                                             \
-    }                                                               \
-  } while(0)
-
 static int Folder_init(clawsmail_FolderObject *self, PyObject *args, PyObject *kwds)
 {
   const char *ss = NULL;
@@ -73,15 +53,6 @@ static int Folder_init(clawsmail_FolderObject *self, PyObject *args, PyObject *k
   if(!PyArg_ParseTuple(args, "|sb", &ss, &create))
     return -1;
 
-  Py_INCREF(Py_None);
-  self->name = Py_None;
-
-  Py_INCREF(Py_None);
-  self->path = Py_None;
-
-  Py_INCREF(Py_None);
-  self->mailbox_name = Py_None;
-
   if(ss) {
     if(create == 0) {
       folderitem = folder_find_item_from_identifier(ss);
@@ -99,30 +70,20 @@ static int Folder_init(clawsmail_FolderObject *self, PyObject *args, PyObject *k
     }
   }
 
-  if(folderitem) {
-    FOLDERITEM_STRING_TO_PYTHON_FOLDER_MEMBER(self, folderitem->name, "name");
-    FOLDERITEM_STRING_TO_PYTHON_FOLDER_MEMBER(self, folderitem->path, "path");
-    FOLDERITEM_STRING_TO_PYTHON_FOLDER_MEMBER(self, folderitem->folder->name, "mailbox_name");
-    self->folderitem = folderitem;
+  self->folderitem = folderitem;
+  if(folderitem)
     self->properties = clawsmail_folderproperties_new(folderitem->prefs);
-  }
   else {
     Py_INCREF(Py_None);
     self->properties = Py_None;
   }
 
   return 0;
-
- err:
-  return -1;
 }
 
-static PyObject* Folder_str(PyObject *self)
+static PyObject* Folder_str(clawsmail_FolderObject *self)
 {
-  PyObject *str;
-  str = PyString_FromString("Folder: ");
-  PyString_ConcatAndDel(&str, PyObject_GetAttrString(self, "name"));
-  return str;
+  return PyString_FromFormat("Folder: %s", self->folderitem->name);
 }
 
 static PyObject* Folder_get_identifier(clawsmail_FolderObject *self, PyObject *args)
@@ -164,41 +125,200 @@ static PyObject* Folder_get_messages(clawsmail_FolderObject *self, PyObject *arg
   return retval;
 }
 
+static PyObject* get_name(clawsmail_FolderObject *self, void *closure)
+{
+  if(self->folderitem && self->folderitem->name)
+    return PyString_FromString(self->folderitem->name);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_mailbox_name(clawsmail_FolderObject *self, void *closure)
+{
+  if(self->folderitem && self->folderitem->folder && self->folderitem->folder->name)
+    return PyString_FromString(self->folderitem->folder->name);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_mailbox(clawsmail_FolderObject *self, void *closure)
+{
+  if(self->folderitem && self->folderitem->folder)
+    return clawsmail_mailbox_new(self->folderitem->folder);
+  Py_RETURN_NONE;
+}
+
+
+static PyObject* get_identifier(clawsmail_FolderObject *self, void *closure)
+{
+  if(self->folderitem) {
+    gchar *id;
+    id = folder_item_get_identifier(self->folderitem);
+    if(id) {
+      PyObject *retval;
+      retval = PyString_FromString(id);
+      g_free(id);
+      return retval;
+    }
+  }
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_path(clawsmail_FolderObject *self, void *closure)
+{
+  if(self->folderitem) {
+    gchar *path;
+    path = folder_item_get_path(self->folderitem);
+    if(path) {
+      PyObject *retval;
+      retval = PyString_FromString(path);
+      g_free(path);
+      return retval;
+    }
+  }
+  Py_RETURN_NONE;
+}
+
+
 static PyObject* get_properties(clawsmail_FolderObject *self, void *closure)
 {
   Py_INCREF(self->properties);
   return self->properties;
 }
 
+static PyObject* get_num_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->total_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_new_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->new_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_unread_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->unread_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_marked_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->marked_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_locked_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->locked_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_unread_marked_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->unreadmarked_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_ignored_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->ignored_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_watched_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->watched_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_replied_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->replied_msgs);
+  Py_RETURN_NONE;
+}
+
+static PyObject* get_num_forwarded_messages(clawsmail_FolderObject *self, void *closure)
+{
+  if(self && self->folderitem)
+    return PyInt_FromLong(self->folderitem->forwarded_msgs);
+  Py_RETURN_NONE;
+}
+
 static PyMethodDef Folder_methods[] = {
     {"get_identifier", (PyCFunction)Folder_get_identifier, METH_NOARGS,
      "get_identifier() - get identifier\n"
      "\n"
-     "Get identifier for folder as a string (e.g. #mh/foo/bar)."},
+     "Get identifier for folder as a string (e.g. #mh/foo/bar).\n\n"
+     "DEPRECATED: Use identifier property instead."},
+
     {"get_messages", (PyCFunction)Folder_get_messages, METH_NOARGS,
      "get_messages() - get a tuple of messages in folder\n"
      "\n"
      "Get a tuple of MessageInfos for the folder."},
-    {NULL}
+
+     {NULL}
 };
 
-static PyMemberDef Folder_members[] = {
-  {"name", T_OBJECT_EX, offsetof(clawsmail_FolderObject, name), 0,
-   "name - name of folder"},
+static PyGetSetDef Folder_getset[] = {
+    {"name", (getter)get_name, (setter)NULL,
+     "name - name of folder", NULL},
+
+    {"path", (getter)get_path, (setter)NULL,
+     "path - path of folder", NULL},
 
-  {"path", T_OBJECT_EX, offsetof(clawsmail_FolderObject, path), 0,
-   "path - path of folder"},
+    {"identifier", (getter)get_identifier, (setter)NULL,
+     "identifier - identifier of folder", NULL},
 
-  {"mailbox_name", T_OBJECT_EX, offsetof(clawsmail_FolderObject, mailbox_name), 0,
-   "mailbox_name - name of the corresponding mailbox"},
+    {"mailbox", (getter)get_mailbox, (setter)NULL,
+     "mailbox - corresponding mailbox", NULL},
 
-  {NULL}
-};
+    {"mailbox_name", (getter)get_mailbox_name, (setter)NULL,
+     "mailbox_name - name of the corresponding mailbox\n\n"
+     "DEPRECATED: Use folder.mailbox.name instead", NULL},
 
-static PyGetSetDef Folder_getset[] = {
     {"properties", (getter)get_properties, (setter)NULL,
      "properties - folder properties object", NULL},
 
+    {"num_messages", (getter)get_num_messages, (setter)NULL,
+     "num_messages - total number of messages in folder", NULL},
+
+    {"num_new_messages", (getter)get_num_new_messages, (setter)NULL,
+     "num_new_messages - number of new messages in folder", NULL},
+
+    {"num_unread_messages", (getter)get_num_unread_messages, (setter)NULL,
+     "num_unread_messages - number of unread messages in folder", NULL},
+
+    {"num_marked_messages", (getter)get_num_marked_messages, (setter)NULL,
+     "num_marked_messages - number of marked messages in folder", NULL},
+
+    {"num_locked_messages", (getter)get_num_locked_messages, (setter)NULL,
+     "num_locked_messages - number of locked messages in folder", NULL},
+
+    {"num_unread_marked_messages", (getter)get_num_unread_marked_messages, (setter)NULL,
+     "num_unread_marked_messages - number of unread marked messages in folder", NULL},
+
+    {"num_ignored_messages", (getter)get_num_ignored_messages, (setter)NULL,
+     "num_ignored_messages - number of ignored messages in folder", NULL},
+
+    {"num_watched_messages", (getter)get_num_watched_messages, (setter)NULL,
+     "num_watched_messages - number of watched messages in folder", NULL},
+
+    {"num_replied_messages", (getter)get_num_replied_messages, (setter)NULL,
+     "num_replied_messages - number of replied messages in folder", NULL},
+
+    {"num_forwarded_messages", (getter)get_num_forwarded_messages, (setter)NULL,
+     "num_forwarded_messages - number of forwarded messages in folder", NULL},
+
     {NULL}
 };
 
@@ -220,7 +340,7 @@ static PyTypeObject clawsmail_FolderType = {
     0,                         /* tp_as_mapping*/
     0,                         /* tp_hash */
     0,                         /* tp_call*/
-    Folder_str,                /* tp_str*/
+    (reprfunc)Folder_str,      /* tp_str*/
     0,                         /* tp_getattro*/
     0,                         /* tp_setattro*/
     0,                         /* tp_as_buffer*/
@@ -237,7 +357,7 @@ static PyTypeObject clawsmail_FolderType = {
     0,                         /* tp_iter */
     0,                         /* tp_iternext */
     Folder_methods,            /* tp_methods */
-    Folder_members,            /* tp_members */
+    0,                         /* tp_members */
     Folder_getset,             /* tp_getset */
     0,                         /* tp_base */
     0,                         /* tp_dict */
@@ -269,11 +389,14 @@ PyObject* clawsmail_folder_new(FolderItem *folderitem)
     return NULL;
 
   id = folder_item_get_identifier(folderitem);
-  arglist = Py_BuildValue("(s)", id);
-  g_free(id);
-  ff = (clawsmail_FolderObject*) PyObject_CallObject((PyObject*) &clawsmail_FolderType, arglist);
-  Py_DECREF(arglist);
-  return (PyObject*)ff;
+  if(id) {
+    arglist = Py_BuildValue("(s)", id);
+    g_free(id);
+    ff = (clawsmail_FolderObject*) PyObject_CallObject((PyObject*) &clawsmail_FolderType, arglist);
+    Py_DECREF(arglist);
+    return (PyObject*)ff;
+  }
+  Py_RETURN_NONE;
 }
 
 FolderItem* clawsmail_folder_get_item(PyObject *self)