Changeset 41

Show
Ignore:
Timestamp:
03/08/07 16:22:37 (2 years ago)
Author:
inz
Message:

Add update_blogs method, fix closures.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • blog-service/trunk/bs-manager.c

    r40 r41  
    2121static void _g_value_free(gpointer pointer); 
    2222 
     23static gboolean bs_manager_update_blogs(BsManager *manager, 
     24                DBusGMethodInvocation *context); 
    2325static gboolean bs_manager_get_blogs(BsManager *manager, 
    2426                const gchar **fields, 
     
    270272                blog_post_free(post); 
    271273        } 
     274        g_free(user_data); 
    272275} 
    273276 
     
    339342        BsManagerPrivate *priv = BS_MANAGER_GET_PRIVATE(manager); 
    340343        Blog *blog; 
    341         struct CreatePostClosure clo; 
     344        struct CreatePostClosure *clo; 
    342345 
    343346        if (!(blog = g_hash_table_lookup(priv->blogs, blog_id))) { 
     
    350353        } 
    351354 
    352         clo.post = g_new0(BlogPost, 1); 
    353         clo.blog = blog; 
    354         clo.publish = TRUE; 
    355  
    356         g_hash_table_foreach(fields, _bs_manager_populate_post, &clo); 
    357  
    358         if (!clo.post->title || !clo.post->content) { 
     355        clo = g_new0(struct CreatePostClosure, 1); 
     356        clo->post = g_new0(BlogPost, 1); 
     357        clo->blog = blog; 
     358        clo->publish = TRUE; 
     359 
     360        g_hash_table_foreach(fields, _bs_manager_populate_post, clo); 
     361 
     362        if (!clo->post->title || !clo->post->content) { 
    359363                error = g_error_new(g_quark_from_string("blog-service"), 
    360364                                412, 
    361365                                "No title or content." 
    362366                                ); 
    363                 blog_post_free(clo.post); 
     367                blog_post_free(clo->post); 
     368                g_free(clo); 
    364369                dbus_g_method_return_error(context, error); 
    365370                return FALSE; 
     
    367372 
    368373        blog->plugin->newPost(blog, 
    369                         clo.post, 
    370                         clo.publish, 
     374                        clo->post, 
     375                        clo->publish, 
    371376                        _bs_manager_posted, 
    372377                        &clo); 
     
    387392        Blog *blog; 
    388393        GSList *iter; 
    389         struct CreatePostClosure clo; 
    390  
    391         if (!(clo.blog = g_hash_table_lookup(priv->blogs, blog_id))) { 
     394        struct CreatePostClosure *clo; 
     395        BlogPost *post; 
     396 
     397        if (!(blog = g_hash_table_lookup(priv->blogs, blog_id))) { 
    392398                error = g_error_new(g_quark_from_string("blog-service"), 
    393399                                404, 
     
    398404        } 
    399405 
    400         for (iter = clo.blog->posts; iter; iter = iter->next) { 
    401                 BlogPost *post = iter->data; 
    402  
    403                 if (!strcmp(post->id, post_id)) { 
    404                         clo.post = post
     406        for (iter = blog->posts; iter; iter = iter->next) { 
     407                BlogPost *posti = iter->data; 
     408 
     409                if (!strcmp(posti->id, post_id)) { 
     410                        post = posti
    405411                        break; 
    406412                } 
    407413        } 
    408414 
    409         if (!(clo.blog = g_hash_table_lookup(priv->blogs, blog_id))) { 
     415        if (!post) { 
    410416                error = g_error_new(g_quark_from_string("blog-service"), 
    411417                                404, 
     
    416422        } 
    417423 
    418         clo.publish = TRUE; 
     424        clo = g_new0(struct CreatePostClosure, 1); 
     425        clo->publish = TRUE; 
     426        clo->post = post; 
     427        clo->blog = blog; 
    419428 
    420429        g_hash_table_foreach(fields, _bs_manager_populate_post, &clo); 
    421430 
    422         if (!clo.post->title || !clo.post->content) { 
     431        if (!clo->post->title || !clo->post->content) { 
    423432                error = g_error_new(g_quark_from_string("blog-service"), 
    424433                                412, 
    425434                                "No title or content." 
    426435                                ); 
    427                 blog_post_free(clo.post); 
     436                blog_post_free(clo->post); 
     437                g_free(clo); 
    428438                dbus_g_method_return_error(context, error); 
    429439                return FALSE; 
     
    431441 
    432442        blog->plugin->editPost(blog, 
    433                         clo.post, 
    434                         clo.publish, 
     443                        clo->post, 
     444                        clo->publish, 
    435445                        _bs_manager_posted, 
    436                         &clo); 
     446                        clo); 
    437447 
    438448        *status = FALSE; 
    439449        return TRUE; 
     450} 
     451 
     452struct UpdateClosure { 
     453        guint count; 
     454        DBusGMethodInvocation *context; 
     455}; 
     456 
     457static void _bs_manager_update_done(Blog *blog, 
     458                const BlogPluginError *error, 
     459                gpointer user_data) 
     460{ 
     461        struct UpdateClosure *closure = user_data; 
     462        if (!(--closure->count)) { 
     463                dbus_g_method_return(closure->context); 
     464                g_free(user_data); 
     465        } 
     466} 
     467 
     468static void _bs_manager_update_posts(Blog *blog, 
     469                const BlogPluginError *error, 
     470                gpointer user_data) 
     471{ 
     472        blog->plugin->getRecent(blog, _bs_manager_update_done, user_data); 
     473} 
     474 
     475static void _bs_manager_update_blog(gpointer key, 
     476                gpointer blogp, 
     477                gpointer user_data) 
     478{ 
     479        Blog *blog = blogp; 
     480        GSList *posts = blog->posts; 
     481        GSList *categories = blog->categories; 
     482 
     483        blog->posts = NULL; 
     484        blog->categories = NULL; 
     485 
     486        g_slist_foreach(posts, (GFunc)blog_post_free, NULL); 
     487        g_slist_foreach(categories, (GFunc)blog_category_free, NULL); 
     488        g_slist_free(posts); 
     489        g_slist_free(categories); 
     490 
     491        blog->plugin->getCategories(blog, _bs_manager_update_posts, user_data); 
     492} 
     493 
     494static void _bs_manager_count(gpointer key, 
     495                gpointer blog, 
     496                gpointer user_data) 
     497{ 
     498        struct UpdateClosure *closure = user_data; 
     499 
     500        (void)key; 
     501        (void)blog; 
     502 
     503        closure->count++; 
     504} 
     505 
     506static gboolean bs_manager_update_blogs(BsManager *manager, 
     507                DBusGMethodInvocation *context) 
     508{ 
     509        BsManagerPrivate *priv = BS_MANAGER_GET_PRIVATE(manager); 
     510        struct UpdateClosure *clo = g_new0(struct UpdateClosure, 1); 
     511        clo->context = context; 
     512        g_hash_table_foreach(priv->blogs, _bs_manager_count, clo); 
     513        g_hash_table_foreach(priv->blogs, _bs_manager_update_blog, clo); 
     514        return 0; 
    440515} 
    441516 
  • blog-service/trunk/bs-manager.xml

    r38 r41  
    44 <interface name="org.MaemoHackers.BlogService"> 
    55  <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="BsManager" /> 
     6  <method name="update_blogs"> 
     7   <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="bs_manager_update_blogs" /> 
     8   <annotation name="org.freedesktop.DBus.GLib.ASync" value="" /> 
     9  </method> 
    610  <method name="get_blogs"> 
    711   <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="bs_manager_get_blogs" />