| 15 | | |
|---|
| 16 | | static gboolean _event_loop(gpointer user_data) |
|---|
| 17 | | { |
|---|
| 18 | | struct BloggerPluginData *data = user_data; |
|---|
| 19 | | |
|---|
| 20 | | xmlrpc_client_event_loop_finish_timeout(data->client, 20); |
|---|
| 21 | | |
|---|
| 22 | | return TRUE; |
|---|
| 23 | | } |
|---|
| 24 | | |
|---|
| 25 | | /* We're a command-line utility, so we abort if an error occurs. */ |
|---|
| 26 | | static void die_if_fault_occurred (xmlrpc_env *env) |
|---|
| 27 | | { |
|---|
| 28 | | if (env->fault_occurred) { |
|---|
| 29 | | fprintf(stderr, "XML-RPC Fault #%d: %s\n", |
|---|
| 30 | | env->fault_code, env->fault_string); |
|---|
| 31 | | exit(1); |
|---|
| 32 | | } |
|---|
| 33 | | } |
|---|
| 113 | | memset(&transportParms, 0, sizeof(transportParms)); |
|---|
| 114 | | memset(&clientParms, 0, sizeof(clientParms)); |
|---|
| 115 | | |
|---|
| 116 | | clientParms.transport = "curl"; |
|---|
| 117 | | clientParms.transportparmsP = (struct xmlrpc_xportparms *)&transportParms; |
|---|
| 118 | | clientParms.transportparm_size = XMLRPC_CXPSIZE(no_ssl_verifyhost); |
|---|
| 119 | | |
|---|
| 120 | | transportParms.no_ssl_verifypeer = 1; |
|---|
| 121 | | transportParms.no_ssl_verifyhost = 1; |
|---|
| 122 | | |
|---|
| 123 | | xmlrpc_env_init(&data->env); |
|---|
| 124 | | xmlrpc_client_setup_global_const(&data->env); |
|---|
| 125 | | xmlrpc_client_create(&data->env, XMLRPC_CLIENT_NO_FLAGS, (char *)"maemo-blog", (char *)"0.0.1", &clientParms, XMLRPC_CPSIZE(transportparm_size), &data->client); |
|---|
| | 81 | if (!g_thread_supported()) { |
|---|
| | 82 | g_thread_init(NULL); |
|---|
| | 83 | } |
|---|
| | 84 | |
|---|
| | 85 | data->session = soup_session_async_new(); |
|---|
| 139 | | guint i, size; |
|---|
| 140 | | |
|---|
| 141 | | (void)server_url; |
|---|
| 142 | | (void)method_name; |
|---|
| 143 | | (void)param_array; |
|---|
| 144 | | |
|---|
| 145 | | die_if_fault_occurred(fault); |
|---|
| 146 | | |
|---|
| 147 | | if (xmlrpc_value_type(blogs) == XMLRPC_TYPE_ARRAY) { |
|---|
| 148 | | size = xmlrpc_array_size(fault, blogs); |
|---|
| 149 | | die_if_fault_occurred(fault); |
|---|
| 150 | | |
|---|
| 151 | | retval = g_new0(Blog *, size + 1); |
|---|
| 152 | | |
|---|
| 153 | | for (i = 0; i < size; i++) { |
|---|
| 154 | | xmlrpc_value *blog = xmlrpc_array_get_item(fault, blogs, i); |
|---|
| 155 | | gchar *blogid = NULL, *name = NULL; |
|---|
| 156 | | xmlrpc_parse_value(fault, blog, "{s:s,s:s,*}", |
|---|
| 157 | | "blogid", &blogid, |
|---|
| 158 | | "blogName", &name); |
|---|
| 159 | | retval[i] = g_new0(Blog, 1); |
|---|
| 160 | | retval[i]->url = g_strdup(clo->uri); |
|---|
| 161 | | retval[i]->user = g_strdup(clo->user); |
|---|
| 162 | | retval[i]->pass = g_strdup(clo->pass); |
|---|
| 163 | | retval[i]->id = g_strdup(blogid); |
|---|
| 164 | | retval[i]->name = g_strdup(name); |
|---|
| 165 | | retval[i]->plugin = clo->self; |
|---|
| 166 | | retval[i]->posts = NULL; |
|---|
| 167 | | } |
|---|
| 168 | | retval[i] = NULL; |
|---|
| | 95 | SoupXmlrpcResponse *response = soup_xmlrpc_message_parse_response( |
|---|
| | 96 | SOUP_XMLRPC_MESSAGE(message)); |
|---|
| | 97 | SoupXmlrpcValue *value = soup_xmlrpc_response_get_value(response); |
|---|
| | 98 | GSList *blogs = NULL; |
|---|
| | 99 | guint count = 0; |
|---|
| | 100 | SoupXmlrpcValueArrayIterator *iter; |
|---|
| | 101 | |
|---|
| | 102 | if (soup_xmlrpc_value_array_get_iterator(value, &iter)) { |
|---|
| | 103 | while (iter) { |
|---|
| | 104 | Blog *blog = g_new0(Blog, 1); |
|---|
| | 105 | GHashTable *hash; |
|---|
| | 106 | SoupXmlrpcValue *val; |
|---|
| | 107 | SoupXmlrpcValue *array_val; |
|---|
| | 108 | |
|---|
| | 109 | soup_xmlrpc_value_array_iterator_get_value(iter, |
|---|
| | 110 | &array_val); |
|---|
| | 111 | |
|---|
| | 112 | soup_xmlrpc_value_get_struct(array_val, &hash); |
|---|
| | 113 | |
|---|
| | 114 | val = g_hash_table_lookup(hash, "blogid"); |
|---|
| | 115 | soup_xmlrpc_value_get_string(val, &blog->id); |
|---|
| | 116 | val = g_hash_table_lookup(hash, "blogName"); |
|---|
| | 117 | soup_xmlrpc_value_get_string(val, &blog->name); |
|---|
| | 118 | g_hash_table_destroy(hash); |
|---|
| | 119 | blog->url = g_strdup(clo->uri); |
|---|
| | 120 | blog->user = g_strdup(clo->user); |
|---|
| | 121 | blog->pass = g_strdup(clo->pass); |
|---|
| | 122 | blog->plugin = clo->self; |
|---|
| | 123 | |
|---|
| | 124 | blogs = g_slist_prepend(blogs, blog); |
|---|
| | 125 | count++; |
|---|
| | 126 | |
|---|
| | 127 | iter = soup_xmlrpc_value_array_iterator_next(iter); |
|---|
| | 128 | } |
|---|
| 170 | | retval = g_new0(Blog *, 2); |
|---|
| 171 | | gchar *blogid = NULL, *name = NULL; |
|---|
| 172 | | xmlrpc_parse_value(fault, blogs, "{s:s,s:s,*}", |
|---|
| 173 | | "blogid", &blogid, |
|---|
| 174 | | "blogName", &name); |
|---|
| 175 | | retval[0] = g_new0(Blog, 1); |
|---|
| 176 | | retval[0]->url = g_strdup(clo->uri); |
|---|
| 177 | | retval[0]->user = g_strdup(clo->user); |
|---|
| 178 | | retval[0]->pass = g_strdup(clo->pass); |
|---|
| 179 | | retval[0]->id = g_strdup(blogid); |
|---|
| 180 | | retval[0]->name = g_strdup(name); |
|---|
| 181 | | retval[0]->plugin = clo->self; |
|---|
| 182 | | retval[0]->posts = NULL; |
|---|
| 183 | | retval[1] = NULL; |
|---|
| | 130 | Blog *blog = g_new0(Blog, 1); |
|---|
| | 131 | GHashTable *hash; |
|---|
| | 132 | SoupXmlrpcValue *val; |
|---|
| | 133 | soup_xmlrpc_value_get_struct(value, &hash); |
|---|
| | 134 | |
|---|
| | 135 | val = g_hash_table_lookup(hash, "blogid"); |
|---|
| | 136 | soup_xmlrpc_value_get_string(val, &blog->id); |
|---|
| | 137 | val = g_hash_table_lookup(hash, "blogName"); |
|---|
| | 138 | soup_xmlrpc_value_get_string(val, &blog->name); |
|---|
| | 139 | g_hash_table_destroy(hash); |
|---|
| | 140 | blog->url = g_strdup(clo->uri); |
|---|
| | 141 | blog->user = g_strdup(clo->user); |
|---|
| | 142 | blog->pass = g_strdup(clo->pass); |
|---|
| | 143 | blog->plugin = clo->self; |
|---|
| | 144 | |
|---|
| | 145 | blogs = g_slist_prepend(blogs, blog); |
|---|
| | 146 | count++; |
|---|
| | 147 | } |
|---|
| | 148 | |
|---|
| | 149 | retval = g_new0(Blog *, count + 1); |
|---|
| | 150 | retval[count] = NULL; |
|---|
| | 151 | |
|---|
| | 152 | while (blogs) { |
|---|
| | 153 | retval[--count] = blogs->data; |
|---|
| | 154 | blogs = g_slist_delete_link(blogs, blogs); |
|---|
| 207 | | xmlrpc_client_start_rpcf(&data->env, |
|---|
| 208 | | data->client, |
|---|
| 209 | | (gchar *)uri, |
|---|
| 210 | | (char *)"blogger.getUsersBlogs", |
|---|
| 211 | | _blog_blogger_connected, |
|---|
| 212 | | clo, |
|---|
| 213 | | (char *)"(sss)", |
|---|
| 214 | | "0123456789ABCDEF", |
|---|
| 215 | | user, |
|---|
| | 178 | msg = soup_xmlrpc_message_new(uri); |
|---|
| | 179 | soup_xmlrpc_message_start_call(msg, |
|---|
| | 180 | "blogger.getUsersBlogs"); |
|---|
| | 181 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 182 | soup_xmlrpc_message_write_string(msg, |
|---|
| | 183 | "0123456789ABCDEF"); |
|---|
| | 184 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 185 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 186 | soup_xmlrpc_message_write_string(msg, |
|---|
| | 187 | user); |
|---|
| | 188 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 189 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 190 | soup_xmlrpc_message_write_string(msg, |
|---|
| 290 | | xmlrpc_client_start_rpcf(&data->env, |
|---|
| 291 | | data->client, |
|---|
| 292 | | blog->url, |
|---|
| 293 | | (char *)"blogger.newPost", |
|---|
| 294 | | _blog_blogger_posted, |
|---|
| 295 | | clo, |
|---|
| 296 | | (char *)"(sssssb)", |
|---|
| 297 | | "0123456789ABCDEF", |
|---|
| 298 | | blog->id, |
|---|
| 299 | | blog->user, |
|---|
| 300 | | blog->pass, |
|---|
| 301 | | content, |
|---|
| 302 | | publish); |
|---|
| | 268 | msg = soup_xmlrpc_message_new(blog->url); |
|---|
| | 269 | soup_xmlrpc_message_start_call(msg, "blogger.newPost"); |
|---|
| | 270 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 271 | soup_xmlrpc_message_write_string(msg, "0123456789ABCDEF"); |
|---|
| | 272 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 273 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 274 | soup_xmlrpc_message_write_string(msg, blog->id); |
|---|
| | 275 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 276 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 277 | soup_xmlrpc_message_write_string(msg, blog->user); |
|---|
| | 278 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 279 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 280 | soup_xmlrpc_message_write_string(msg, blog->pass); |
|---|
| | 281 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 282 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 283 | soup_xmlrpc_message_write_string(msg, content); |
|---|
| | 284 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 285 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 286 | soup_xmlrpc_message_write_boolean(msg, publish); |
|---|
| | 287 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 288 | soup_xmlrpc_message_end_call(msg); |
|---|
| | 289 | soup_xmlrpc_message_persist(msg); |
|---|
| | 290 | |
|---|
| | 291 | soup_session_queue_message(data->session, SOUP_MESSAGE(msg), |
|---|
| | 292 | _blog_blogger_posted, clo); |
|---|
| | 293 | |
|---|
| 333 | | xmlrpc_client_start_rpcf(&data->env, |
|---|
| 334 | | data->client, |
|---|
| 335 | | blog->url, (char *)"blogger.editPost", |
|---|
| 336 | | _blog_blogger_posted, |
|---|
| 337 | | clo, |
|---|
| 338 | | (char *)"(sssssb)", |
|---|
| 339 | | "0123456789ABCDEF", |
|---|
| 340 | | post->id, |
|---|
| 341 | | blog->user, |
|---|
| 342 | | blog->pass, |
|---|
| 343 | | content, |
|---|
| 344 | | publish); |
|---|
| | 322 | msg = soup_xmlrpc_message_new(blog->url); |
|---|
| | 323 | soup_xmlrpc_message_start_call(msg, "blogger.editPost"); |
|---|
| | 324 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 325 | soup_xmlrpc_message_write_string(msg, "0123456789ABCDEF"); |
|---|
| | 326 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 327 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 328 | soup_xmlrpc_message_write_string(msg, post->id); |
|---|
| | 329 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 330 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 331 | soup_xmlrpc_message_write_string(msg, blog->user); |
|---|
| | 332 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 333 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 334 | soup_xmlrpc_message_write_string(msg, blog->pass); |
|---|
| | 335 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 336 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 337 | soup_xmlrpc_message_write_string(msg, content); |
|---|
| | 338 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 339 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 340 | soup_xmlrpc_message_write_boolean(msg, publish); |
|---|
| | 341 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 342 | soup_xmlrpc_message_end_call(msg); |
|---|
| | 343 | soup_xmlrpc_message_persist(msg); |
|---|
| | 344 | |
|---|
| | 345 | soup_session_queue_message(data->session, SOUP_MESSAGE(msg), |
|---|
| | 346 | _blog_blogger_posted, clo); |
|---|
| | 347 | |
|---|
| 382 | | size_t size, i; |
|---|
| 383 | | |
|---|
| 384 | | (void)server_url; |
|---|
| 385 | | (void)method_name; |
|---|
| 386 | | (void)param_array; |
|---|
| 387 | | |
|---|
| 388 | | size = xmlrpc_array_size(fault, retval); |
|---|
| 389 | | die_if_fault_occurred(fault); |
|---|
| 390 | | |
|---|
| 391 | | for (i = 0; i < size; i++) { |
|---|
| | 379 | SoupXmlrpcResponse *response = soup_xmlrpc_message_parse_response( |
|---|
| | 380 | SOUP_XMLRPC_MESSAGE(message)); |
|---|
| | 381 | SoupXmlrpcValue *array = soup_xmlrpc_response_get_value(response); |
|---|
| | 382 | SoupXmlrpcValue *value; |
|---|
| | 383 | SoupXmlrpcValueArrayIterator *iter; |
|---|
| | 384 | |
|---|
| | 385 | for (soup_xmlrpc_value_array_get_iterator(array, &iter); |
|---|
| | 386 | iter; |
|---|
| | 387 | iter = soup_xmlrpc_value_array_iterator_next(iter)) { |
|---|
| 396 | | |
|---|
| 397 | | xmlrpc_parse_value(fault, post, "{s:s,s:s,*}", |
|---|
| 398 | | "postid", &id, |
|---|
| 399 | | "content", &content); |
|---|
| 400 | | |
|---|
| 401 | | new_post->id = g_strdup(id); |
|---|
| | 392 | GHashTable *table; |
|---|
| | 393 | |
|---|
| | 394 | soup_xmlrpc_value_get_struct(value, &table); |
|---|
| | 395 | value = g_hash_table_lookup(table, "postid"); |
|---|
| | 396 | if (value) { |
|---|
| | 397 | soup_xmlrpc_value_get_string(value, &id); |
|---|
| | 398 | } |
|---|
| | 399 | value = g_hash_table_lookup(table, "content"); |
|---|
| | 400 | if (value) { |
|---|
| | 401 | soup_xmlrpc_value_get_string(value, &content); |
|---|
| | 402 | } |
|---|
| | 403 | |
|---|
| | 404 | new_post->id = id; |
|---|
| 432 | | xmlrpc_client_start_rpcf(&data->env, |
|---|
| 433 | | data->client, |
|---|
| 434 | | blog->url, |
|---|
| 435 | | (char *)"blogger.getRecentPosts", |
|---|
| 436 | | _blog_blogger_got_recent, |
|---|
| 437 | | clo, |
|---|
| 438 | | (char *)"(ssssi)", |
|---|
| 439 | | "0123456789ABCDEF", |
|---|
| 440 | | blog->id, |
|---|
| 441 | | blog->user, |
|---|
| 442 | | blog->pass, |
|---|
| 443 | | 15); |
|---|
| 444 | | |
|---|
| 445 | | clo->timeout_id = g_timeout_add(500, _event_loop, data); |
|---|
| | 438 | msg = soup_xmlrpc_message_new(blog->url); |
|---|
| | 439 | soup_xmlrpc_message_start_call(msg, "metaWeblog.getRecentPosts"); |
|---|
| | 440 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 441 | soup_xmlrpc_message_write_string(msg, "0123456789ABCDEF"); |
|---|
| | 442 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 443 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 444 | soup_xmlrpc_message_write_string(msg, blog->id); |
|---|
| | 445 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 446 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 447 | soup_xmlrpc_message_write_string(msg, blog->user); |
|---|
| | 448 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 449 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 450 | soup_xmlrpc_message_write_string(msg, blog->pass); |
|---|
| | 451 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 452 | soup_xmlrpc_message_start_param(msg); |
|---|
| | 453 | soup_xmlrpc_message_write_int(msg, 15); |
|---|
| | 454 | soup_xmlrpc_message_end_param(msg); |
|---|
| | 455 | soup_xmlrpc_message_end_call(msg); |
|---|
| | 456 | soup_xmlrpc_message_persist(msg); |
|---|
| | 457 | |
|---|
| | 458 | soup_session_queue_message(data->session, SOUP_MESSAGE(msg), |
|---|
| | 459 | _blog_blogger_got_recent, clo); |
|---|