<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>callback_libsoup.c</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="search/search.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="search/search.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body onload='searchBox.OnSelectItem(0);'> <!-- Generated by Doxygen 1.7.4 --> <script type="text/javascript"><!-- var searchBox = new SearchBox("searchBox", "search",false,'Search'); --></script> <div id="top"> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="files.html"><span>Files</span></a></li> <li><a href="examples.html"><span>Examples</span></a></li> <li id="searchli"> <div id="MSearchBox" class="MSearchBoxInactive"> <span class="left"> <img id="MSearchSelect" src="search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/> <input type="text" id="MSearchField" value="Search" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/> </span><span class="right"> <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> </span> </div> </li> </ul> </div> </div> <div class="header"> <div class="headertitle"> <div class="title">callback_libsoup.c</div> </div> </div> <div class="contents"> <div class="fragment"><pre class="fragment"><span class="comment">/* quvi</span> <span class="comment"> * Copyright (C) 2011 Toni Gundogdu <legatvs@gmail.com></span> <span class="comment"> *</span> <span class="comment"> * This library is free software; you can redistribute it and/or</span> <span class="comment"> * modify it under the terms of the GNU Lesser General Public</span> <span class="comment"> * License as published by the Free Software Foundation; either</span> <span class="comment"> * version 2.1 of the License, or (at your option) any later version.</span> <span class="comment"> *</span> <span class="comment"> * This library is distributed in the hope that it will be useful,</span> <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span> <span class="comment"> * Lesser General Public License for more details.</span> <span class="comment"> *</span> <span class="comment"> * You should have received a copy of the GNU Lesser General Public</span> <span class="comment"> * License along with this library; if not, write to the Free Software</span> <span class="comment"> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA</span> <span class="comment"> * 02110-1301 USA</span> <span class="comment"> */</span> <span class="comment">/* callback_libsoup.c -- Use libsoup (async) instead of libcurl (easy) */</span> <span class="preprocessor">#include "config.h"</span> <span class="preprocessor">#include <stdio.h></span> <span class="preprocessor">#include <string.h></span> <span class="preprocessor">#include <<a class="code" href="quvi_8h.html">quvi/quvi.h</a>></span> <span class="preprocessor">#include <<a class="code" href="net_8h.html">quvi/net.h</a>></span> <span class="preprocessor">#ifdef HAVE_LIBSOUP_GNOME</span> <span class="preprocessor"></span><span class="preprocessor">#include <libsoup/soup-gnome.h></span> <span class="preprocessor">#else</span> <span class="preprocessor"></span><span class="preprocessor">#include <libsoup/soup.h></span> <span class="preprocessor">#endif</span> <span class="preprocessor"></span> <span class="preprocessor">#include "common.h"</span> <span class="keyword">static</span> <a class="code" href="group__libquvi__types.html#ga9a17038aa41a6f1585b541a56a9d4744">QUVIcode</a> status_callback(<span class="keywordtype">long</span> param, <span class="keywordtype">void</span> *data) { <a class="code" href="group__libquvi__types.html#gac2712a9057f1dd9d79d0460d4b4c63b1" title="Word type.">quvi_word</a> status, type; status = <a name="a0"></a><a class="code" href="group__libquvi__macros.html#ga77f1d48f6ff37506211b7fce94a255d3" title="Return a low word from a long type variable.">quvi_loword</a>(param); type = <a name="a1"></a><a class="code" href="group__libquvi__macros.html#gaba151a3eff5cc7acf733484ec54576fa" title="Return a high word from a long type variable.">quvi_hiword</a>(param); <span class="keywordflow">switch</span> (status) { <span class="keywordflow">case</span> <a name="a2"></a><a class="code" href="group__libquvi__types.html#gga9a06c68a7230b058e483fc931cf86f15a9d613d7f108b87ca34e7cf9f93ea6fd2">QUVISTATUS_RESOLVE</a>: handle_resolve_status(type); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <a name="a3"></a><a class="code" href="group__libquvi__types.html#gga9a06c68a7230b058e483fc931cf86f15a9dfe1f8cc6b7704371d01b751be2e8ef">QUVISTATUS_FETCH</a>: handle_fetch_status(type, data); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <a name="a4"></a><a class="code" href="group__libquvi__types.html#gga9a06c68a7230b058e483fc931cf86f15adb08cf208475fd5017ebb148079584e9">QUVISTATUS_VERIFY</a>: handle_verify_status(type); <span class="keywordflow">break</span>; } fflush(stderr); <span class="keywordflow">return</span> (<a name="a5"></a><a class="code" href="group__libquvi__types.html#gga9a17038aa41a6f1585b541a56a9d4744ad5c802d9e04e5b25f52392b73bed4f24">QUVI_OK</a>); } <span class="keyword">static</span> <span class="keywordtype">void</span> set_feat(<a class="code" href="group__libquvi__net__if.html#ga8bf5b22ecd8ba98acd930eb4f072d842" title="Network handle.">quvi_net_t</a> n, SoupMessage *m, <a class="code" href="group__libquvi__net__if.html#ga893f48b84dcf65c0c3ef802dcb51d81c">QUVInetPropertyFeatureName</a> feature, <span class="keyword">const</span> <span class="keywordtype">char</span> *hdr) { <span class="keywordtype">char</span> *s = <a name="a6"></a><a class="code" href="group__libquvi__net__if.html#ga62693008a5c9d1e9ad85d80cf5f6d22a" title="Convenience function that wraps quvi_net_getprop_feat()">quvi_net_get_one_prop_feat</a>(n, feature); <span class="keywordflow">if</span> (s) soup_message_headers_append(m->request_headers, hdr, s); } <span class="keyword">static</span> <span class="keywordtype">void</span> set_feats_from_lua_script(<a class="code" href="group__libquvi__net__if.html#ga8bf5b22ecd8ba98acd930eb4f072d842" title="Network handle.">quvi_net_t</a> n, SoupMessage *m) { set_feat(n, m, <a name="a7"></a><a class="code" href="group__libquvi__net__if.html#gga893f48b84dcf65c0c3ef802dcb51d81ca5ac5cf4fd501dda5255aba245b3503c9">QUVI_NET_PROPERTY_FEATURE_ARBITRARYCOOKIE</a>, <span class="stringliteral">"Cookie"</span>); set_feat(n, m, <a name="a8"></a><a class="code" href="group__libquvi__net__if.html#gga893f48b84dcf65c0c3ef802dcb51d81ca43749657051b04228cf1e097ad3bf352">QUVI_NET_PROPERTY_FEATURE_USERAGENT</a>, <span class="stringliteral">"User-Agent"</span>); } <span class="preprocessor">#ifdef _0</span> <span class="preprocessor"></span><span class="comment">/* Same as set_feats_from_lua_script above. quvi_net_get_one_prop_feat</span> <span class="comment"> * is a convinience function that can be used instead unless the</span> <span class="comment"> * application is expected handle >1 of the same features (e.g. multiple</span> <span class="comment"> * instances of QUVI_NET_PROPERTY_FEATURE_ARBITRARYCOOKIE in the</span> <span class="comment"> * features list. */</span> <span class="keyword">static</span> <span class="keywordtype">void</span> set_feats_from_lua_script_alt(<a class="code" href="group__libquvi__net__if.html#ga8bf5b22ecd8ba98acd930eb4f072d842" title="Network handle.">quvi_net_t</a> n, SoupMessage *m) { <a class="code" href="group__libquvi__llst.html#gad3231946dd74d8fea18c7fe48ee77278" title="Linked list node handle.">quvi_llst_node_t</a> feature; <a name="a9"></a><a class="code" href="group__libquvi__net__if.html#gab74a136b6f5160719a620451804b02c0" title="Get network property.">quvi_net_getprop</a>(n, <a name="a10"></a><a class="code" href="group__libquvi__net__if.html#gga2e8c7bacf0cb4e99df868b922d2d1efcab97a03fd24907af5aacb125fd3d44bf5">QUVI_NET_PROPERTY_FEATURES</a>, &feature); <span class="keywordflow">while</span> (feature) { <span class="keywordtype">char</span> *feature_name, *feature_value; <a class="code" href="group__libquvi__net__if.html#ga34e687d6eaafcdf10ea0cc51caec1dea" title="Network property feature handle.">quvi_net_propfeat_t</a> pfeat; pfeat = (<a name="a11"></a><a class="code" href="group__libquvi__net__if.html#ga34e687d6eaafcdf10ea0cc51caec1dea" title="Network property feature handle.">quvi_net_propfeat_t</a>) <a name="a12"></a><a class="code" href="group__libquvi__llst.html#gaa7ff7a95fcb7143973e4b7f691fc6c32" title="Return data of the linked list node.">quvi_llst_data</a>(feature); <a name="a13"></a><a class="code" href="group__libquvi__net__if.html#ga139b904b17335eab3cfbacdbaa5ba0a2" title="Get network property feature.">quvi_net_getprop_feat</a>(pfeat, <a name="a14"></a><a class="code" href="group__libquvi__net__if.html#ggaf1ea51fb3d9169a1cd2a5976b400c920a897f02a7c62b2496333c80c48926e623">QUVI_NET_PROPERTY_FEATURE_NAME</a>, &feature_name); <a class="code" href="group__libquvi__net__if.html#ga139b904b17335eab3cfbacdbaa5ba0a2" title="Get network property feature.">quvi_net_getprop_feat</a>(pfeat, <a name="a15"></a><a class="code" href="group__libquvi__net__if.html#ggaf1ea51fb3d9169a1cd2a5976b400c920a571a9c2a0a0055ca0254a87d63ba6ea8">QUVI_NET_PROPERTY_FEATURE_VALUE</a>, &feature_value); <span class="keywordflow">if</span> (strcmp(feature_name, <span class="stringliteral">"arbitrary_cookie"</span>) == 0) { soup_message_headers_append( m->request_headers, <span class="stringliteral">"Cookie"</span>, feature_value); } <span class="keywordflow">if</span> (strcmp(feature_name, <span class="stringliteral">"user_agent"</span>) == 0) { soup_message_headers_append( m->request_headers, <span class="stringliteral">"User-Agent"</span>, feature_value); } feature = <a name="a16"></a><a class="code" href="group__libquvi__llst.html#gacaf5b1a085c933d307d8f7765bb98f1a" title="Return next linked node.">quvi_llst_next</a>(feature); } } <span class="preprocessor">#endif</span> <span class="preprocessor"></span> <span class="keyword">static</span> SoupSession *session = NULL; <span class="keyword">static</span> <span class="keywordtype">void</span> send_message(<a class="code" href="group__libquvi__net__if.html#ga8bf5b22ecd8ba98acd930eb4f072d842" title="Network handle.">quvi_net_t</a> n, SoupMessage **message, guint *status, SoupMessageFlags msg_flags, <span class="keyword">const</span> <span class="keywordtype">int</span> head_flag, <span class="keyword">const</span> <span class="keywordtype">int</span> lua_feats) { <span class="keywordtype">char</span> *url = NULL; <a class="code" href="group__libquvi__net__if.html#gab74a136b6f5160719a620451804b02c0" title="Get network property.">quvi_net_getprop</a>(n, <a name="a17"></a><a class="code" href="group__libquvi__net__if.html#gga2e8c7bacf0cb4e99df868b922d2d1efca195905fbe95b432a9a76edf29b408b63">QUVI_NET_PROPERTY_URL</a>, &url); *message = soup_message_new(head_flag ? <span class="stringliteral">"HEAD"</span>:<span class="stringliteral">"GET"</span>, url); <span class="keywordflow">if</span> (msg_flags) soup_message_set_flags(*message, msg_flags); <span class="comment">/* In reality, the library sets these only for quvi.fetch. */</span> <span class="keywordflow">if</span> (lua_feats) set_feats_from_lua_script(n, *message); *status = soup_session_send_message(session, *message); <a name="a18"></a><a class="code" href="group__libquvi__net__if.html#ga8d3004ccaeca529a38be7ae92ac2578b" title="Set network property.">quvi_net_setprop</a>(n, <a name="a19"></a><a class="code" href="group__libquvi__net__if.html#gga2e8c7bacf0cb4e99df868b922d2d1efca90b00183af51ce8284e18463a66bd3eb">QUVI_NET_PROPERTY_RESPONSECODE</a>, *status); } <span class="keyword">static</span> <a class="code" href="group__libquvi__types.html#ga9a17038aa41a6f1585b541a56a9d4744">QUVIcode</a> fetch_callback(<a class="code" href="group__libquvi__net__if.html#ga8bf5b22ecd8ba98acd930eb4f072d842" title="Network handle.">quvi_net_t</a> n) { SoupMessage *m; guint status; send_message(n, &m, &status, 0, <span class="comment">/* Session flags */</span> 0, <span class="comment">/* 'HEAD' flag */</span> 1); <span class="comment">/* Set features from quvi.fetch */</span> <span class="keywordflow">if</span> (SOUP_STATUS_IS_SUCCESSFUL(status)) { <a class="code" href="group__libquvi__net__if.html#ga8d3004ccaeca529a38be7ae92ac2578b" title="Set network property.">quvi_net_setprop</a>(n, <a name="a20"></a><a class="code" href="group__libquvi__net__if.html#gga2e8c7bacf0cb4e99df868b922d2d1efcad6ec329695ceeb7107acdbf43f6c8459">QUVI_NET_PROPERTY_CONTENT</a>, m->response_body->data); <span class="keywordflow">return</span> (<a class="code" href="group__libquvi__types.html#gga9a17038aa41a6f1585b541a56a9d4744ad5c802d9e04e5b25f52392b73bed4f24">QUVI_OK</a>); } <a name="a21"></a><a class="code" href="group__libquvi__net__if.html#ga24ff549091b3fe3aa2ae2597872b61b6" title="Set network error message.">quvi_net_seterr</a>(n, <span class="stringliteral">"%s (http/%d)"</span>, m->reason_phrase, status); <span class="keywordflow">return</span> (<a name="a22"></a><a class="code" href="group__libquvi__types.html#gga9a17038aa41a6f1585b541a56a9d4744a4a312999c422f13f02f104ec4fd0ab79">QUVI_CALLBACK</a>); } <span class="keyword">static</span> <a class="code" href="group__libquvi__types.html#ga9a17038aa41a6f1585b541a56a9d4744">QUVIcode</a> resolve_callback(<a class="code" href="group__libquvi__net__if.html#ga8bf5b22ecd8ba98acd930eb4f072d842" title="Network handle.">quvi_net_t</a> n) { SoupMessage *m; guint status; send_message(n, &m, &status, SOUP_MESSAGE_NO_REDIRECT, <span class="comment">/* Session flags */</span> 0, <span class="comment">/* 'HEAD' flag */</span> 0); <span class="comment">/* Set features from quvi.fetch */</span> <span class="keywordflow">if</span> (SOUP_STATUS_IS_REDIRECTION(status)) { <span class="keyword">const</span> <span class="keywordtype">char</span> *r_url = soup_message_headers_get_one(m->response_headers, <span class="stringliteral">"Location"</span>); <a class="code" href="group__libquvi__net__if.html#ga8d3004ccaeca529a38be7ae92ac2578b" title="Set network property.">quvi_net_setprop</a>(n, <a name="a23"></a><a class="code" href="group__libquvi__net__if.html#gga2e8c7bacf0cb4e99df868b922d2d1efcaedfff18c40416472205af8405170008b">QUVI_NET_PROPERTY_REDIRECTURL</a>, r_url); } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!SOUP_STATUS_IS_SUCCESSFUL(status)) { <a class="code" href="group__libquvi__net__if.html#ga24ff549091b3fe3aa2ae2597872b61b6" title="Set network error message.">quvi_net_seterr</a>(n, <span class="stringliteral">"%s (http/%d)"</span>, m->reason_phrase, status); <span class="keywordflow">return</span> (<a class="code" href="group__libquvi__types.html#gga9a17038aa41a6f1585b541a56a9d4744a4a312999c422f13f02f104ec4fd0ab79">QUVI_CALLBACK</a>); } <span class="keywordflow">return</span> (<a class="code" href="group__libquvi__types.html#gga9a17038aa41a6f1585b541a56a9d4744ad5c802d9e04e5b25f52392b73bed4f24">QUVI_OK</a>); } <span class="keyword">static</span> <a class="code" href="group__libquvi__types.html#ga9a17038aa41a6f1585b541a56a9d4744">QUVIcode</a> verify_callback(<a class="code" href="group__libquvi__net__if.html#ga8bf5b22ecd8ba98acd930eb4f072d842" title="Network handle.">quvi_net_t</a> n) { SoupMessage *m; guint status; send_message(n, &m, &status, 0, <span class="comment">/* Session flags */</span> 1, <span class="comment">/* 'HEAD' flag */</span> 0); <span class="comment">/* Set features from quvi.fetch */</span> <span class="keywordflow">if</span> (SOUP_STATUS_IS_SUCCESSFUL(status)) { goffset cl = soup_message_headers_get_content_length(m->response_headers); <span class="keyword">const</span> <span class="keywordtype">char</span> *ct = soup_message_headers_get_content_type(m->response_headers, NULL); <a class="code" href="group__libquvi__net__if.html#ga8d3004ccaeca529a38be7ae92ac2578b" title="Set network property.">quvi_net_setprop</a>(n, <a name="a24"></a><a class="code" href="group__libquvi__net__if.html#gga2e8c7bacf0cb4e99df868b922d2d1efca8dcc508fbc0af9ff2559bca6c4dc0d64">QUVI_NET_PROPERTY_CONTENTTYPE</a>, ct); <a class="code" href="group__libquvi__net__if.html#ga8d3004ccaeca529a38be7ae92ac2578b" title="Set network property.">quvi_net_setprop</a>(n, <a name="a25"></a><a class="code" href="group__libquvi__net__if.html#gga2e8c7bacf0cb4e99df868b922d2d1efcae07aad7bce484675d1c169eea73fe820">QUVI_NET_PROPERTY_CONTENTLENGTH</a>, cl); <span class="keywordflow">return</span> (<a class="code" href="group__libquvi__types.html#gga9a17038aa41a6f1585b541a56a9d4744ad5c802d9e04e5b25f52392b73bed4f24">QUVI_OK</a>); } <a class="code" href="group__libquvi__net__if.html#ga24ff549091b3fe3aa2ae2597872b61b6" title="Set network error message.">quvi_net_seterr</a>(n, <span class="stringliteral">"%s (http/%d)"</span>, m->reason_phrase, status); <span class="keywordflow">return</span> (<a class="code" href="group__libquvi__types.html#gga9a17038aa41a6f1585b541a56a9d4744a4a312999c422f13f02f104ec4fd0ab79">QUVI_CALLBACK</a>); } <span class="keyword">static</span> <span class="keywordtype">void</span> dump_media(<a class="code" href="group__libquvi__types.html#ga038af195c7db11b73115e4c76b474bc5" title="Media parsing session handle.">quvi_media_t</a> m) { <span class="keywordtype">char</span> *m_url, *m_ct, *m_suffix; <span class="keywordtype">double</span> m_cl; <a name="a26"></a><a class="code" href="group__libquvi__getprop.html#gadb29c49e7d58fc408c991975a6aea612" title="Get media property information from a media session handle.">quvi_getprop</a>(m, <a name="a27"></a><a class="code" href="group__libquvi__types.html#gga7de3498b1882ad7026fc169a8bc345ccabc375a5d33913389250414f26f2632e8">QUVIPROP_MEDIAURL</a>, &m_url); <a class="code" href="group__libquvi__getprop.html#gadb29c49e7d58fc408c991975a6aea612" title="Get media property information from a media session handle.">quvi_getprop</a>(m, <a name="a28"></a><a class="code" href="group__libquvi__types.html#gga7de3498b1882ad7026fc169a8bc345ccae8e3568b77436692aba8eb91a2fe4d3f">QUVIPROP_MEDIACONTENTTYPE</a>, &m_ct); <a class="code" href="group__libquvi__getprop.html#gadb29c49e7d58fc408c991975a6aea612" title="Get media property information from a media session handle.">quvi_getprop</a>(m, <a name="a29"></a><a class="code" href="group__libquvi__types.html#gga7de3498b1882ad7026fc169a8bc345ccae8b9d59836f4b14eb7fd9f120070529b">QUVIPROP_MEDIACONTENTLENGTH</a>, &m_cl); <a class="code" href="group__libquvi__getprop.html#gadb29c49e7d58fc408c991975a6aea612" title="Get media property information from a media session handle.">quvi_getprop</a>(m, <a name="a30"></a><a class="code" href="group__libquvi__types.html#gga7de3498b1882ad7026fc169a8bc345ccaf6744ad3bdc6607bfeefc52e6240edb8">QUVIPROP_FILESUFFIX</a>, &m_suffix); spew_e( <span class="stringliteral">"%s\n"</span> <span class="stringliteral">"url: %s\n"</span> <span class="stringliteral">"content-type: %s\n"</span> <span class="stringliteral">"content-length: %.0f\n"</span> <span class="stringliteral">"file suffix: %s\n"</span>, __func__, m_url, m_ct, m_cl, m_suffix); } <span class="keyword">static</span> <span class="keywordtype">void</span> help() { printf( <span class="stringliteral">"Usage: callback_libsoup [--help|--log] [URL]\n\n"</span> <span class="stringliteral">" -h,--help .. Print help and exit\n"</span> <span class="stringliteral">" -l,--logger .. Enable logger\n\n"</span> <span class="stringliteral">"Note: Unless URL is specified, the default URL will be used\n"</span>); exit(0); } <span class="keywordtype">int</span> main (<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[]) { <span class="keywordtype">char</span> *url = <span class="stringliteral">"http://is.gd/yFNPMR"</span>; <a class="code" href="group__libquvi__types.html#ga038af195c7db11b73115e4c76b474bc5" title="Media parsing session handle.">quvi_media_t</a> m; <span class="keywordtype">int</span> log_flag; <a class="code" href="group__libquvi__types.html#ga9a17038aa41a6f1585b541a56a9d4744">QUVIcode</a> rc; <a class="code" href="group__libquvi__types.html#gabe8d4dbff4b3bf3fc89377c34d0e089b" title="libquvi session handle">quvi_t</a> q; log_flag = 0; <span class="keywordflow">if</span> (argc > 1) { <span class="keywordtype">int</span> i; <span class="keywordflow">for</span> (i=1; i<argc; ++i) { <span class="keywordflow">if</span> (strcmp(argv[i], <span class="stringliteral">"-l"</span>) == 0 || strcmp(argv[i], <span class="stringliteral">"--logger"</span>) == 0) { log_flag = 1; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strcmp(argv[i], <span class="stringliteral">"-h"</span>) == 0 || strcmp(argv[i], <span class="stringliteral">"--help"</span>) == 0) { help(); } <span class="keywordflow">else</span> url = argv[i]; } } rc = <a name="a31"></a><a class="code" href="group__libquvi__init.html#gab05fb31e4bd01cb0a0d544089388c77e" title="Start a new libquvi session.">quvi_init</a>(&q); check_error(q,rc); <a name="a32"></a><a class="code" href="group__libquvi__setup.html#gaad1abc4a83c22f53e11b086dd418eac2" title="Set options for a libquvi session handle.">quvi_setopt</a>(q, <a name="a33"></a><a class="code" href="group__libquvi__types.html#gga4b18c016f0c446f4e5c6b21773ddc7e5a8cd1fce0d705df25d0eade4c6fe59944">QUVIOPT_STATUSFUNCTION</a>, &status_callback); <a class="code" href="group__libquvi__setup.html#gaad1abc4a83c22f53e11b086dd418eac2" title="Set options for a libquvi session handle.">quvi_setopt</a>(q, <a name="a34"></a><a class="code" href="group__libquvi__types.html#gga4b18c016f0c446f4e5c6b21773ddc7e5a01819407acb047e6484e87c3d87e259d">QUVIOPT_FETCHFUNCTION</a>, &fetch_callback); <a class="code" href="group__libquvi__setup.html#gaad1abc4a83c22f53e11b086dd418eac2" title="Set options for a libquvi session handle.">quvi_setopt</a>(q, <a name="a35"></a><a class="code" href="group__libquvi__types.html#gga4b18c016f0c446f4e5c6b21773ddc7e5a51f6fdb37299c048d6a0aa1d680437ab">QUVIOPT_RESOLVEFUNCTION</a>, &resolve_callback); <a class="code" href="group__libquvi__setup.html#gaad1abc4a83c22f53e11b086dd418eac2" title="Set options for a libquvi session handle.">quvi_setopt</a>(q, <a name="a36"></a><a class="code" href="group__libquvi__types.html#gga4b18c016f0c446f4e5c6b21773ddc7e5a374023b9a5cdc8931cf16793bbb7986a">QUVIOPT_VERIFYFUNCTION</a>, &verify_callback); g_type_init(); <span class="preprocessor">#ifdef HAVE_LIBSOUP_GNOME</span> <span class="preprocessor"></span> session = soup_session_async_new_with_options( SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_PROXY_RESOLVER_GNOME, NULL ); <span class="preprocessor">#else</span> <span class="preprocessor"></span> session = soup_session_async_new(); <span class="preprocessor">#endif</span> <span class="preprocessor"></span> <span class="keywordflow">if</span> (log_flag) { SoupLogger *log = soup_logger_new(SOUP_LOGGER_LOG_HEADERS, -1); soup_session_add_feature(session, SOUP_SESSION_FEATURE(log)); g_object_unref(log); } rc = <a name="a37"></a><a class="code" href="group__libquvi__parse.html#gaff86521371cf2fb49e690060b4e50908" title="Start a new media parsing session.">quvi_parse</a>(q, url, &m); check_error(q, rc); dump_media(m); <a name="a38"></a><a class="code" href="group__libquvi__getprop.html#gad20d3c7f0d543ee050c3f7533efd211d" title="End a media parsing session.">quvi_parse_close</a>(&m); <a name="a39"></a><a class="code" href="group__libquvi__release.html#ga25854269807bc004cf4718053803265e" title="End a libquvi session.">quvi_close</a>(&q); <span class="keywordflow">return</span> (0); } <span class="comment">/* vim: set ts=2 sw=2 tw=72 expandtab: */</span> </pre></div> </div> </div> <!-- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> <a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Defines</a></div> <!-- iframe showing the search results (closed by default) --> <div id="MSearchResultsWindow"> <iframe src="javascript:void(0)" frameborder="0" name="MSearchResults" id="MSearchResults"> </iframe> </div> <hr class="footer"/><address class="footer"><small>Generated on Thu Aug 18 2011 by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address> </body> </html>