1
0
Fork 0
mirror of https://github.com/deltachat/deltachat-core.git synced 2025-10-06 03:50:08 +02:00
deltachat-core/docs/user/html/mrmailbox_8c_source.html
2017-11-14 02:47:49 +01:00

192 lines
694 KiB
HTML

<!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"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>Delta Chat Core C-Library: /home/bpetersen/projects/deltachat-core/src/mrmailbox.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="user.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Delta Chat Core C-Library
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<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 id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</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>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">mrmailbox.c</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * Delta Chat Core</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * Copyright (C) 2017 Björn Petersen</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * Contact: r10s@b44t.com, http://b44t.com</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * This program is free software: you can redistribute it and/or modify it under</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * the terms of the GNU General Public License as published by the Free Software</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * Foundation, either version 3 of the License, or (at your option) any later</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * version.</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * This program is distributed in the hope that it will be useful, but WITHOUT</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * details.</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> * You should have received a copy of the GNU General Public License along with</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> * this program. If not, see http://www.gnu.org/licenses/ .</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &lt;sys/stat.h&gt;</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &lt;sys/types.h&gt;</span> <span class="comment">/* for getpid() */</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span> <span class="comment">/* for getpid() */</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &lt;openssl/opensslv.h&gt;</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &quot;mrmailbox_internal.h&quot;</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &quot;mrimap.h&quot;</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;mrsmtp.h&quot;</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;mrmimeparser.h&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;mrmimefactory.h&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;mrtools.h&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;mrjob.h&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;mrloginparam.h&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;mrkey.h&quot;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &quot;mrpgp.h&quot;</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &quot;mrapeerstate.h&quot;</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment"> * Handle groups for received messages</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="preprocessor">#define MR_CREATE_GROUP_AS_NEEDED 0x01</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="keyword">static</span> uint32_t lookup_group_by_grpid__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, mrmimeparser_t* mime_parser, <span class="keywordtype">int</span> create_flags,</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; uint32_t from_id, carray* to_ids)</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;{</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="comment">/* search the grpid in the header */</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; uint32_t chat_id = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; clistiter* cur;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keyword">struct </span>mailimf_field* field;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordtype">char</span>* grpid1 = NULL, *grpid2 = NULL, *grpid3 = NULL, *grpid4 = NULL;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span>* grpid = NULL; <span class="comment">/* must not be freed, just one of the others */</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordtype">char</span>* grpname = NULL;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordtype">int</span> i, to_ids_cnt = carray_count(to_ids);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keywordtype">char</span>* self_addr = NULL;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keywordtype">int</span> recreate_member_list = 0;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordtype">int</span> send_EVENT_CHAT_MODIFIED = 0;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="comment">/* special commands */</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keywordtype">char</span>* X_MrRemoveFromGrp = NULL; <span class="comment">/* pointer somewhere into mime_parser, must not be freed */</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordtype">char</span>* X_MrAddToGrp = NULL; <span class="comment">/* pointer somewhere into mime_parser, must not be freed */</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordtype">int</span> X_MrGrpNameChanged = 0;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keywordtype">int</span> X_MrGrpImageChanged = 0;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">for</span>( cur = clist_begin(mime_parser-&gt;m_header-&gt;fld_list); cur!=NULL ; cur=clist_next(cur) )</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; field = (<span class="keyword">struct </span>mailimf_field*)clist_content(cur);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">if</span>( field )</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; {</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_OPTIONAL_FIELD )</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; {</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keyword">struct </span>mailimf_optional_field* optional_field = field-&gt;fld_data.fld_optional_field;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keywordflow">if</span>( optional_field &amp;&amp; optional_field-&gt;fld_name ) {</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordflow">if</span>( strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;X-MrGrpId&quot;</span>)==0 || strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;Chat-Group-ID&quot;</span>)==0 ) {</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; grpid1 = safe_strdup(optional_field-&gt;fld_value);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; }</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;X-MrGrpName&quot;</span>)==0 || strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;Chat-Group-Name&quot;</span>)==0 ) {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; grpname = mr_decode_header_string(optional_field-&gt;fld_value); <span class="comment">/* this is no changed groupname message */</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;X-MrRemoveFromGrp&quot;</span>)==0 || strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;Chat-Group-Member-Removed&quot;</span>)==0 ) {</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; X_MrRemoveFromGrp = optional_field-&gt;fld_value;</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; mime_parser-&gt;m_is_system_message = MR_SYSTEM_MEMBER_REMOVED_FROM_GROUP;</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; }</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;X-MrAddToGrp&quot;</span>)==0 || strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;Chat-Group-Member-Added&quot;</span>)==0 ) {</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; X_MrAddToGrp = optional_field-&gt;fld_value;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; mime_parser-&gt;m_is_system_message = MR_SYSTEM_MEMBER_ADDED_TO_GROUP;</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; }</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;X-MrGrpNameChanged&quot;</span>)==0 || strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;Chat-Group-Name-Changed&quot;</span>)==0 ) {</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; X_MrGrpNameChanged = 1;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; mime_parser-&gt;m_is_system_message = MR_SYSTEM_GROUPNAME_CHANGED;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; }</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;Chat-Group-Image&quot;</span>)==0 ) {</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; X_MrGrpImageChanged = 1;</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; mime_parser-&gt;m_is_system_message = MR_SYSTEM_GROUPIMAGE_CHANGED;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; }</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; }</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_MESSAGE_ID )</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; {</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keyword">struct </span>mailimf_message_id* fld_message_id = field-&gt;fld_data.fld_message_id;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">if</span>( fld_message_id ) {</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; grpid2 = mr_extract_grpid_from_rfc724_mid(fld_message_id-&gt;mid_value);</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; }</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_IN_REPLY_TO )</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; {</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keyword">struct </span>mailimf_in_reply_to* fld_in_reply_to = field-&gt;fld_data.fld_in_reply_to;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordflow">if</span>( fld_in_reply_to ) {</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; grpid3 = mr_extract_grpid_from_rfc724_mid_list(fld_in_reply_to-&gt;mid_list);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; }</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_REFERENCES )</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keyword">struct </span>mailimf_references* fld_references = field-&gt;fld_data.fld_references;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keywordflow">if</span>( fld_references ) {</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; grpid4 = mr_extract_grpid_from_rfc724_mid_list(fld_references-&gt;mid_list);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; }</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; }</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; }</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; grpid = grpid1? grpid1 : (grpid2? grpid2 : (grpid3? grpid3 : grpid4));</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">if</span>( grpid == NULL ) {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; }</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="comment">/* check, if we have a chat with this group ID */</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_CHATS_WHERE_grpid,</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="stringliteral">&quot;SELECT id FROM chats WHERE grpid=?;&quot;</span>);</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; sqlite3_bind_text (stmt, 1, grpid, -1, SQLITE_STATIC);</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt)==SQLITE_ROW ) {</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; chat_id = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; }</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="comment">/* check if the sender is a member of the existing group -</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="comment"> if not, the message does not go to the group chat but to the normal chat with the sender */</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">if</span>( chat_id!=0 &amp;&amp; !mrmailbox_is_contact_in_chat__(mailbox, chat_id, from_id) ) {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; chat_id = 0;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="comment">/* check if the group does not exist but should be created */</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordtype">int</span> group_explicitly_left = mrmailbox_group_explicitly_left__(mailbox, grpid);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; self_addr = mrsqlite3_get_config__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured_addr&quot;</span>, <span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">if</span>( chat_id == 0</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; &amp;&amp; (create_flags&amp;MR_CREATE_GROUP_AS_NEEDED)</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; &amp;&amp; grpname</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; &amp;&amp; X_MrRemoveFromGrp==NULL <span class="comment">/*otherwise, a pending &quot;quit&quot; message may pop up*/</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; &amp;&amp; (!group_explicitly_left || (X_MrAddToGrp&amp;&amp;strcasecmp(self_addr,X_MrAddToGrp)==0) ) <span class="comment">/*re-create explicitly left groups only if ourself is re-added*/</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; )</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; {</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql,</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="stringliteral">&quot;INSERT INTO chats (type, name, grpid) VALUES(?, ?, ?);&quot;</span>);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; sqlite3_bind_int (stmt, 1, MR_CHAT_TYPE_GROUP);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; sqlite3_bind_text(stmt, 2, grpname, -1, SQLITE_STATIC);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; sqlite3_bind_text(stmt, 3, grpid, -1, SQLITE_STATIC);</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt)!=SQLITE_DONE ) {</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; }</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; chat_id = sqlite3_last_insert_rowid(mailbox-&gt;m_sql-&gt;m_cobj);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; recreate_member_list = 1;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; }</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="comment">/* again, check chat_id */</span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keywordflow">if</span>( chat_id &lt;= MR_CHAT_ID_LAST_SPECIAL ) {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; chat_id = 0;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">if</span>( group_explicitly_left ) {</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; chat_id = MR_CHAT_ID_TRASH; <span class="comment">/* we got a message for a chat we&#39;ve deleted - do not show this even as a normal chat */</span></div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; }</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="comment">/* execute group commands */</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">if</span>( X_MrAddToGrp || X_MrRemoveFromGrp )</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; {</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; recreate_member_list = 1;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; }</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( X_MrGrpNameChanged &amp;&amp; grpname &amp;&amp; strlen(grpname) &lt; 200 )</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; {</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, <span class="stringliteral">&quot;UPDATE chats SET name=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; sqlite3_bind_text(stmt, 1, grpname, -1, SQLITE_STATIC);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; sqlite3_bind_int (stmt, 2, chat_id);</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CHAT_MODIFIED, chat_id, 0);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; }</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordflow">if</span>( X_MrGrpImageChanged )</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordtype">int</span> ok = 0;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keywordtype">char</span>* grpimage = NULL;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keywordflow">if</span>( carray_count(mime_parser-&gt;m_parts)&gt;=1 ) {</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; mrmimepart_t* textpart = (mrmimepart_t*)carray_get(mime_parser-&gt;m_parts, 0);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">if</span>( textpart-&gt;m_type == MR_MSG_TEXT ) {</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">if</span>( carray_count(mime_parser-&gt;m_parts)&gt;=2 ) {</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; mrmimepart_t* imgpart = (mrmimepart_t*)carray_get(mime_parser-&gt;m_parts, 1);</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span>( imgpart-&gt;m_type == MR_MSG_IMAGE ) {</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; grpimage = <a class="code" href="structmrparam__t.html#a23e24e8700e17ede6dd385fc90330f76">mrparam_get</a>(imgpart-&gt;m_param, MRP_FILE, NULL);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; ok = 1;</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; }</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; }</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; ok = 1;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; }</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; }</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keywordflow">if</span>( ok ) {</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat = mrchat_new(mailbox);</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; mrmailbox_log_info(mailbox, 0, <span class="stringliteral">&quot;New group image set to %s.&quot;</span>, grpimage? <span class="stringliteral">&quot;DELETED&quot;</span> : grpimage);</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; mrchat_load_from_db__(chat, chat_id);</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a>(chat-&gt;<a class="code" href="structmrchat__t.html#ad2792ee7df778521de61087bc79795a7">m_param</a>, MRP_PROFILE_IMAGE, grpimage<span class="comment">/*may be NULL*/</span>);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; mrchat_update_param__(chat);</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; free(grpimage);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; send_EVENT_CHAT_MODIFIED = 1;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; }</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="comment">/* add members to group/check members</span></div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;<span class="comment"> for recreation: we should add a timestamp */</span></div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">if</span>( recreate_member_list )</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; {</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span>* skip = X_MrRemoveFromGrp? X_MrRemoveFromGrp : NULL;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM chats_contacts WHERE chat_id=?;&quot;</span>);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; sqlite3_bind_int (stmt, 1, chat_id);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160;</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="keywordflow">if</span>( skip==NULL || strcasecmp(self_addr, skip) != 0 ) {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; mrmailbox_add_contact_to_chat__(mailbox, chat_id, MR_CONTACT_ID_SELF);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; }</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">if</span>( from_id &gt; MR_CONTACT_ID_LAST_SPECIAL ) {</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">if</span>( mrmailbox_contact_addr_equals__(mailbox, from_id, self_addr)==0</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; &amp;&amp; (skip==NULL || mrmailbox_contact_addr_equals__(mailbox, from_id, skip)==0) ) {</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; mrmailbox_add_contact_to_chat__(mailbox, chat_id, from_id);</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; }</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; to_ids_cnt; i++ )</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; {</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; uint32_t to_id = (uint32_t)(uintptr_t)carray_get(to_ids, i); <span class="comment">/* to_id is only once in to_ids and is non-special */</span></div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">if</span>( mrmailbox_contact_addr_equals__(mailbox, to_id, self_addr)==0</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; &amp;&amp; (skip==NULL || mrmailbox_contact_addr_equals__(mailbox, to_id, skip)==0) ) {</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; mrmailbox_add_contact_to_chat__(mailbox, chat_id, to_id);</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; }</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; }</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; send_EVENT_CHAT_MODIFIED = 1;</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keywordflow">if</span>( send_EVENT_CHAT_MODIFIED ) {</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CHAT_MODIFIED, chat_id, 0);</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; }</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">/* check the number of receivers -</span></div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;<span class="comment"> the only critical situation is if the user hits &quot;Reply&quot; instead of &quot;Reply all&quot; in a non-messenger-client */</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">if</span>( to_ids_cnt == 1 &amp;&amp; mime_parser-&gt;m_is_send_by_messenger==0 ) {</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keywordtype">int</span> is_contact_cnt = mrmailbox_get_chat_contact_count__(mailbox, chat_id);</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">if</span>( is_contact_cnt &gt; 3 <span class="comment">/* to_ids_cnt==1 may be &quot;From: A, To: B, SELF&quot; as SELF is not counted in to_ids_cnt. So everything up to 3 is no error. */</span> ) {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; chat_id = 0;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; }</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160;cleanup:</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; free(grpid1);</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; free(grpid2);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; free(grpid3);</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; free(grpid4);</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; free(grpname);</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; free(self_addr);</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordflow">return</span> chat_id;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;}</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;<span class="comment"> * Receive a message and add it to the database</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> receive_imf(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, <span class="keyword">const</span> <span class="keywordtype">char</span>* imf_raw_not_terminated, <span class="keywordtype">size_t</span> imf_raw_bytes,</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span>* server_folder, uint32_t server_uid, uint32_t flags)</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160;{</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="comment">/* the function returns the number of created messages in the database */</span></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keywordtype">int</span> incoming = 0;</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keywordtype">int</span> incoming_origin = MR_ORIGIN_UNSET;</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160;<span class="preprocessor"> #define outgoing (!incoming)</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; carray* to_ids = NULL;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; uint32_t from_id = 0;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keywordtype">int</span> from_id_blocked = 0;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; uint32_t to_id = 0;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; uint32_t chat_id = 0;</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordtype">int</span> state = MR_STATE_UNDEFINED;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="keywordtype">size_t</span> i, icnt;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; uint32_t first_dblocal_id = 0;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keywordtype">char</span>* rfc724_mid = NULL; <span class="comment">/* Message-ID from the header */</span></div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; time_t message_timestamp = MR_INVALID_TIMESTAMP;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; mrmimeparser_t* mime_parser = mrmimeparser_new(ths-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>, ths);</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keywordtype">int</span> db_locked = 0;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordtype">int</span> transaction_pending = 0;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; clistiter* cur1;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keyword">const</span> <span class="keyword">struct </span>mailimf_field* field;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; carray* created_db_entries = carray_new(16);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordtype">int</span> create_event_to_send = MR_EVENT_MSGS_CHANGED;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; carray* rr_event_to_send = carray_new(16);</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160;</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keywordtype">int</span> has_return_path = 0;</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordtype">char</span>* txt_raw = NULL;</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Receive message #%lu from %s.&quot;</span>, server_uid, server_folder? server_folder:<span class="stringliteral">&quot;?&quot;</span>);</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; to_ids = carray_new(16);</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">if</span>( to_ids==NULL || created_db_entries==NULL || rr_event_to_send==NULL || mime_parser == NULL ) {</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Bad param.&quot;</span>);</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; }</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="comment">/* parse the imf to mailimf_message {</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160;<span class="comment"> mailimf_fields* msg_fields {</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;<span class="comment"> clist* fld_list; // list of mailimf_field</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;<span class="comment"> }</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;<span class="comment"> mailimf_body* msg_body { // != NULL</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;<span class="comment"> const char * bd_text; // != NULL</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160;<span class="comment"> size_t bd_size;</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;<span class="comment"> }</span></div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;<span class="comment"> };</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160;<span class="comment"> normally, this is done by mailimf_message_parse(), however, as we also need the MIME data,</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;<span class="comment"> we use mailmime_parse() through MrMimeParser (both call mailimf_struct_multiple_parse() somewhen, I did not found out anything</span></div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160;<span class="comment"> that speaks against this approach yet) */</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; mrmimeparser_parse(mime_parser, imf_raw_not_terminated, imf_raw_bytes);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="keywordflow">if</span>( mime_parser-&gt;m_header == NULL ) {</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;No header.&quot;</span>);</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* Error - even adding an empty record won&#39;t help as we do not know the message ID */</span></div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; mrsqlite3_lock(ths-&gt;m_sql);</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; db_locked = 1;</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; mrsqlite3_begin_transaction__(ths-&gt;m_sql);</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; transaction_pending = 1;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="comment">/* Check, if the mail comes from extern, resp. is not send by us. This is a _really_ important step</span></div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160;<span class="comment"> as messages send by us are used to validate other mail senders and receivers.</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160;<span class="comment"> For this purpose, we assume, the `Return-Path:`-header is never present if the message is send by us.</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;<span class="comment"> The `Received:`-header may be another idea, however, this is also set if mails are transfered from other accounts via IMAP.</span></div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;<span class="comment"> Using `From:` alone is no good idea, as mailboxes may use different sending-addresses - moreover, they may change over the years.</span></div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160;<span class="comment"> However, we use `From:` as an additional hint below. */</span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordflow">for</span>( cur1 = clist_begin(mime_parser-&gt;m_header-&gt;fld_list); cur1!=NULL ; cur1=clist_next(cur1) )</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; field = (<span class="keyword">struct </span>mailimf_field*)clist_content(cur1);</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span>( field )</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; {</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_RETURN_PATH )</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; {</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; has_return_path = 1;</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; }</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_OPTIONAL_FIELD )</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; {</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keyword">struct </span>mailimf_optional_field* optional_field = field-&gt;fld_data.fld_optional_field;</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keywordflow">if</span>( optional_field &amp;&amp; strcasecmp(optional_field-&gt;fld_name, <span class="stringliteral">&quot;Return-Path&quot;</span>)==0 )</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; {</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; has_return_path = 1; <span class="comment">/* &quot;MAILIMF_FIELD_OPTIONAL_FIELD.Return-Path&quot; should be &quot;MAILIMF_FIELD_RETURN_PATH&quot;, however, this is not always the case */</span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; }</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; }</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; }</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">if</span>( has_return_path ) {</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; incoming = 1;</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; }</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="comment">/* for incoming messages, get From: and check if it is known (for known From:&#39;s we add the other To:/Cc:/Bcc: in the 3rd pass) */</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keywordflow">if</span>( incoming</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; &amp;&amp; (field=mr_find_mailimf_field(mime_parser-&gt;m_header, MAILIMF_FIELD_FROM ))!=NULL )</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; {</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keyword">struct </span>mailimf_from* fld_from = field-&gt;fld_data.fld_from;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">if</span>( fld_from )</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; {</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="keywordtype">int</span> check_self;</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; carray* from_list = carray_new(16);</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; mrmailbox_add_or_lookup_contacts_by_mailbox_list__(ths, fld_from-&gt;frm_mb_list, MR_ORIGIN_INCOMING_UNKNOWN_FROM, from_list, &amp;check_self);</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="keywordflow">if</span>( check_self )</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; {</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; incoming = 0; <span class="comment">/* The `Return-Path:`-approach above works well, however, there may be messages outgoing messages which we also receive -</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160;<span class="comment"> for these messages, the `Return-Path:` is set although we&#39;re the sender. To correct these cases, we add an</span></div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;<span class="comment"> additional From: check - which, however, will not work for older From:-addresses used on the mailbox. */</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; }</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">if</span>( carray_count(from_list)&gt;=1 ) <span class="comment">/* if there is no from given, from_id stays 0 which is just fine. These messages are very rare, however, we have to add the to the database (they to to the &quot;deaddrop&quot; chat) to avoid a re-download from the server. See also [**] */</span></div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; {</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; from_id = (uint32_t)(uintptr_t)carray_get(from_list, 0);</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; incoming_origin = mrmailbox_get_contact_origin__(ths, from_id, &amp;from_id_blocked);</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; }</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; }</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; carray_free(from_list);</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; }</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="comment">/* Make sure, to_ids starts with the first To:-address (Cc: and Bcc: are added in the loop below pass) */</span></div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="keywordflow">if</span>( (field=mr_find_mailimf_field(mime_parser-&gt;m_header, MAILIMF_FIELD_TO))!=NULL )</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; {</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keyword">struct </span>mailimf_to* fld_to = field-&gt;fld_data.fld_to; <span class="comment">/* can be NULL */</span></div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="keywordflow">if</span>( fld_to )</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; {</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; mrmailbox_add_or_lookup_contacts_by_address_list__(ths, fld_to-&gt;to_addr_list ,</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; outgoing? MR_ORIGIN_OUTGOING_TO : (incoming_origin&gt;=MR_ORIGIN_MIN_VERIFIED? MR_ORIGIN_INCOMING_TO : MR_ORIGIN_INCOMING_UNKNOWN_TO), to_ids, NULL);</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; }</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; }</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160;</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="keywordflow">if</span>( mrmimeparser_has_nonmeta(mime_parser) )</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; {</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160;</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="comment">/**********************************************************************</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160;<span class="comment"> * Add parts</span></div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;<span class="comment"> *********************************************************************/</span></div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160;</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="comment">/* collect the rest information */</span></div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keywordflow">for</span>( cur1 = clist_begin(mime_parser-&gt;m_header-&gt;fld_list); cur1!=NULL ; cur1=clist_next(cur1) )</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; {</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; field = (<span class="keyword">struct </span>mailimf_field*)clist_content(cur1);</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">if</span>( field )</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; {</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_MESSAGE_ID )</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; {</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="keyword">struct </span>mailimf_message_id* fld_message_id = field-&gt;fld_data.fld_message_id;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordflow">if</span>( fld_message_id ) {</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; rfc724_mid = safe_strdup(fld_message_id-&gt;mid_value);</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; }</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_CC )</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; {</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="keyword">struct </span>mailimf_cc* fld_cc = field-&gt;fld_data.fld_cc;</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keywordflow">if</span>( fld_cc ) {</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; mrmailbox_add_or_lookup_contacts_by_address_list__(ths, fld_cc-&gt;cc_addr_list,</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; outgoing? MR_ORIGIN_OUTGOING_CC : (incoming_origin&gt;=MR_ORIGIN_MIN_VERIFIED? MR_ORIGIN_INCOMING_CC : MR_ORIGIN_INCOMING_UNKNOWN_CC), to_ids, NULL);</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; }</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; }</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_BCC )</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; {</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keyword">struct </span>mailimf_bcc* fld_bcc = field-&gt;fld_data.fld_bcc;</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keywordflow">if</span>( outgoing &amp;&amp; fld_bcc ) {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; mrmailbox_add_or_lookup_contacts_by_address_list__(ths, fld_bcc-&gt;bcc_addr_list,</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; MR_ORIGIN_OUTGOING_BCC, to_ids, NULL);</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; }</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; }</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( field-&gt;fld_type == MAILIMF_FIELD_ORIG_DATE )</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; {</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keyword">struct </span>mailimf_orig_date* orig_date = field-&gt;fld_data.fld_orig_date;</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="keywordflow">if</span>( orig_date ) {</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; message_timestamp = mr_timestamp_from_date(orig_date-&gt;dt_date_time); <span class="comment">/* is not yet checked against bad times! */</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; }</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; }</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; }</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; } <span class="comment">/* for */</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160;</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160;</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="comment">/* check if the message introduces a new chat:</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160;<span class="comment"> - outgoing messages introduce a chat with the first to: address if they are send by a messenger</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160;<span class="comment"> - incoming messages introduce a chat only for known contacts if they are send by a messenger</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160;<span class="comment"> (of course, the user can add other chats manually later) */</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keywordflow">if</span>( incoming )</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; state = (flags&amp;MR_IMAP_SEEN)? MR_STATE_IN_SEEN : MR_STATE_IN_FRESH;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; to_id = MR_CONTACT_ID_SELF;</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160;</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="comment">/* test if there is a normal chat with the sender - if so, this allows us to create groups in the next step */</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keywordtype">int</span> test_normal_chat_id = mrmailbox_lookup_real_nchat_by_contact_id__(ths, from_id); <span class="comment">/* note that the test_normal_chat_id is also used below (saves one lookup call) */</span></div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="comment">/* check for a group chat */</span></div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; chat_id = lookup_group_by_grpid__(ths, mime_parser, (test_normal_chat_id || incoming_origin&gt;=MR_ORIGIN_MIN_START_NEW_NCHAT<span class="comment">/*always false, for now*/</span>)? MR_CREATE_GROUP_AS_NEEDED : 0, from_id, to_ids);</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keywordflow">if</span>( chat_id == 0 )</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; {</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="keywordflow">if</span>( mrmimeparser_is_mailinglist_message(mime_parser) )</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; {</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; chat_id = MR_CHAT_ID_TRASH;</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Message belongs to a mailing list and is ignored.&quot;</span>);</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="comment">/* currently we do not show mailing list messages as the would result in lots of unwanted mesages:</span></div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;<span class="comment"> (NB: typical mailing list header: `From: sender@gmx.net To: list@address.net)</span></div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160;<span class="comment"> - even if we know the sender, it does not make sense, to extract an mailing list message from the context and</span></div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;<span class="comment"> show it in the thread</span></div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160;<span class="comment"> - if we do not know the sender, it may be &quot;known&quot; by the is_reply_to_known_message__() function -</span></div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160;<span class="comment"> this would be even more irritating as the sender may be unknown to the user</span></div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160;<span class="comment"> (typical scenario: the users posts a message to a mailing list and an formally unknown user answers -</span></div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160;<span class="comment"> this message would pop up in Delta Chat as it is a reply to a sent message)</span></div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160;<span class="comment"> &quot;Mailing lists messages&quot; in this sense are messages marked by List-Id or Precedence headers.</span></div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160;<span class="comment"> For the future, we might want to show mailing lists as groups.</span></div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160;<span class="comment"> NB: MR_CHAT_ID_TRASH does not remove the message on IMAP, it simply copies it to an invisible chat</span></div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160;<span class="comment"> (we have to track the message-id as otherwise the message pops up again and again) */</span></div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; }</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; {</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; chat_id = test_normal_chat_id;</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordflow">if</span>( chat_id == 0 )</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">if</span>( incoming_origin&gt;=MR_ORIGIN_MIN_START_NEW_NCHAT<span class="comment">/*always false, for now*/</span> )</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; {</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; chat_id = mrmailbox_create_or_lookup_nchat_by_contact_id__(ths, from_id);</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; }</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( mrmailbox_is_reply_to_known_message__(ths, mime_parser) )</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; {</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; mrmailbox_scaleup_contact_origin__(ths, from_id, MR_ORIGIN_INCOMING_REPLY_TO);</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="comment">//chat_id = mrmailbox_create_or_lookup_nchat_by_contact_id__(ths, from_id); -- we do not want any chat to be created implicitly. Because of the origin-scale-up, the contact requests will pop up and this should be just fine.</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Message is a reply to a known message, mark sender as known.&quot;</span>);</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; }</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; }</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="keywordflow">if</span>( chat_id == 0 ) {</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; chat_id = MR_CHAT_ID_DEADDROP;</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="keywordflow">if</span>( state == MR_STATE_IN_FRESH ) {</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="keywordflow">if</span>( incoming_origin&lt;MR_ORIGIN_MIN_VERIFIED &amp;&amp; mime_parser-&gt;m_is_send_by_messenger==0 ) {</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; state = MR_STATE_IN_NOTICED; <span class="comment">/* degrade state for unknown senders and non-delta messages (the latter may be removed if we run into spam problems, currently this is fine) (noticed messages do count as being unread; therefore, the deaddrop will not popup in the chatlist) */</span></div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; }</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; }</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; }</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; }</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; }</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">else</span> <span class="comment">/* outgoing */</span></div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; {</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; state = MR_STATE_OUT_DELIVERED; <span class="comment">/* the mail is on the IMAP server, probably it is also deliverd. We cannot recreate other states (read, error). */</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; from_id = MR_CONTACT_ID_SELF;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordflow">if</span>( carray_count(to_ids) &gt;= 1 ) {</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; to_id = (uint32_t)(uintptr_t)carray_get(to_ids, 0);</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; chat_id = lookup_group_by_grpid__(ths, mime_parser, MR_CREATE_GROUP_AS_NEEDED, from_id, to_ids);</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">if</span>( chat_id == 0 )</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; {</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; chat_id = mrmailbox_lookup_real_nchat_by_contact_id__(ths, to_id);</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keywordflow">if</span>( chat_id == 0 &amp;&amp; mime_parser-&gt;m_is_send_by_messenger &amp;&amp; !mrmailbox_is_contact_blocked__(ths, to_id) ) {</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; chat_id = mrmailbox_create_or_lookup_nchat_by_contact_id__(ths, to_id);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; }</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; }</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; }</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">if</span>( chat_id == 0 ) {</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; chat_id = MR_CHAT_ID_TO_DEADDROP;</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; }</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; }</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160;</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="comment">/* correct message_timestamp, it should not be used before,</span></div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160;<span class="comment"> however, we cannot do this earlier as we need from_id to be set */</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; message_timestamp = mrmailbox_correct_bad_timestamp__(ths, chat_id, from_id, message_timestamp, (flags&amp;MR_IMAP_SEEN)? 0 : 1 <span class="comment">/*fresh message?*/</span>);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160;</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="comment">/* unarchive chat */</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; mrmailbox_unarchive_chat__(ths, chat_id);</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="comment">/* check, if the mail is already in our database - if so, there&#39;s nothing more to do</span></div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160;<span class="comment"> (we may get a mail twice eg. it it is moved between folders) */</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <span class="keywordflow">if</span>( rfc724_mid == NULL ) {</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="comment">/* header is lacking a Message-ID - this may be the case, if the message was sent from this account and the mail client</span></div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160;<span class="comment"> the the SMTP-server set the ID (true eg. for the Webmailer used in all-inkl-KAS)</span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;<span class="comment"> in these cases, we build a message ID based on some useful header fields that do never change (date, to)</span></div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160;<span class="comment"> we do not use the folder-local id, as this will change if the mail is moved to another folder. */</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; rfc724_mid = mr_create_incoming_rfc724_mid(message_timestamp, from_id, to_ids);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keywordflow">if</span>( rfc724_mid == NULL ) {</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Cannot create Message-ID.&quot;</span>);</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; }</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; }</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; {</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordtype">char</span>* old_server_folder = NULL;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; uint32_t old_server_uid = 0;</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keywordflow">if</span>( mrmailbox_rfc724_mid_exists__(ths, rfc724_mid, &amp;old_server_folder, &amp;old_server_uid) ) {</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="comment">/* The message is already added to our database; rollback. If needed, update the server_uid which may have changed if the message was moved around on the server. */</span></div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keywordflow">if</span>( strcmp(old_server_folder, server_folder)!=0 || old_server_uid!=server_uid ) {</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; mrsqlite3_rollback__(ths-&gt;m_sql);</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; transaction_pending = 0;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; mrmailbox_update_server_uid__(ths, rfc724_mid, server_folder, server_uid);</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; }</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; free(old_server_folder);</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Message already in DB.&quot;</span>);</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; }</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="comment">/* if the message is not send by a messenger, check if it sent at least a reply to a messenger message</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160;<span class="comment"> (later, we move these replies to the Chats-folder) */</span></div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <span class="keywordtype">int</span> msgrmsg = mime_parser-&gt;m_is_send_by_messenger; <span class="comment">/* 1 or 0 for yes/no */</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="keywordflow">if</span>( msgrmsg )</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; {</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Message sent by another messenger (will be moved to Chats-folder).&quot;</span>);</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; }</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; {</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="keywordflow">if</span>( mrmailbox_is_reply_to_messenger_message__(ths, mime_parser) )</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; {</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Message is a reply to a messenger message (will be moved to Chats-folder).&quot;</span>);</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; msgrmsg = 2; <span class="comment">/* 2=no, but is reply to messenger message */</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; }</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; }</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="comment">/* fine, so far. now, split the message into simple parts usable as &quot;short messages&quot;</span></div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160;<span class="comment"> and add them to the database (mails send by other messenger clients should result</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160;<span class="comment"> into only one message; mails send by other clients may result in several messages (eg. one per attachment)) */</span></div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; icnt = carray_count(mime_parser-&gt;m_parts); <span class="comment">/* should be at least one - maybe empty - part */</span></div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; icnt; i++ )</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; {</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; mrmimepart_t* part = (mrmimepart_t*)carray_get(mime_parser-&gt;m_parts, i);</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; <span class="keywordflow">if</span>( part-&gt;m_is_meta ) {</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; }</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="keywordflow">if</span>( part-&gt;m_type == MR_MSG_TEXT ) {</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; txt_raw = mr_mprintf(<span class="stringliteral">&quot;%s\n\n%s&quot;</span>, mime_parser-&gt;m_subject? mime_parser-&gt;m_subject : <span class="stringliteral">&quot;&quot;</span>, part-&gt;m_msg_raw);</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <span class="keywordflow">if</span>( mime_parser-&gt;m_is_system_message ) {</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(part-&gt;m_param, MRP_SYSTEM_CMD, mime_parser-&gt;m_is_system_message);</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; }</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; }</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160;</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; stmt = mrsqlite3_predefine__(ths-&gt;m_sql, INSERT_INTO_msgs_msscftttsmttpb,</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="stringliteral">&quot;INSERT INTO msgs (rfc724_mid,server_folder,server_uid,chat_id,from_id, to_id,timestamp,type, state,msgrmsg,txt,txt_raw,param,bytes)&quot;</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <span class="stringliteral">&quot; VALUES (?,?,?,?,?, ?,?,?, ?,?,?,?,?,?);&quot;</span>);</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; sqlite3_bind_text (stmt, 1, rfc724_mid, -1, SQLITE_STATIC);</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; sqlite3_bind_text (stmt, 2, server_folder, -1, SQLITE_STATIC);</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; sqlite3_bind_int (stmt, 3, server_uid);</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; sqlite3_bind_int (stmt, 4, chat_id);</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; sqlite3_bind_int (stmt, 5, from_id);</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; sqlite3_bind_int (stmt, 6, to_id);</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; sqlite3_bind_int64(stmt, 7, message_timestamp);</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; sqlite3_bind_int (stmt, 8, part-&gt;m_type);</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; sqlite3_bind_int (stmt, 9, state);</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; sqlite3_bind_int (stmt, 10, msgrmsg);</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; sqlite3_bind_text (stmt, 11, part-&gt;m_msg? part-&gt;m_msg : <span class="stringliteral">&quot;&quot;</span>, -1, SQLITE_STATIC);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; sqlite3_bind_text (stmt, 12, txt_raw? txt_raw : <span class="stringliteral">&quot;&quot;</span>, -1, SQLITE_STATIC);</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; sqlite3_bind_text (stmt, 13, part-&gt;m_param-&gt;m_packed, -1, SQLITE_STATIC);</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; sqlite3_bind_int (stmt, 14, part-&gt;m_bytes);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_DONE ) {</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Cannot write DB.&quot;</span>);</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* i/o error - there is nothing more we can do - in other cases, we try to write at least an empty record */</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; }</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160;</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; free(txt_raw);</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; txt_raw = NULL;</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160;</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="keywordflow">if</span>( first_dblocal_id == 0 ) {</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; first_dblocal_id = sqlite3_last_insert_rowid(ths-&gt;m_sql-&gt;m_cobj);</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; }</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; carray_add(created_db_entries, (<span class="keywordtype">void</span>*)(uintptr_t)chat_id, NULL);</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; carray_add(created_db_entries, (<span class="keywordtype">void</span>*)(uintptr_t)first_dblocal_id, NULL);</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; }</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160;</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <span class="comment">/* check event to send */</span></div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <span class="keywordflow">if</span>( chat_id == MR_CHAT_ID_TRASH )</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; {</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; create_event_to_send = 0;</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; }</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( incoming &amp;&amp; state==MR_STATE_IN_FRESH )</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; {</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; <span class="keywordflow">if</span>( from_id_blocked ) {</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; create_event_to_send = 0;</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; }</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( chat_id == MR_CHAT_ID_DEADDROP ) {</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; create_event_to_send = MR_EVENT_MSGS_CHANGED;</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; <span class="comment">/*if( mrsqlite3_get_config_int__(ths-&gt;m_sql, &quot;show_deaddrop&quot;, 0)!=0 ) {</span></div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160;<span class="comment"> create_event_to_send = MR_EVENT_INCOMING_MSG;</span></div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160;<span class="comment"> }*/</span></div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; }</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; create_event_to_send = MR_EVENT_INCOMING_MSG;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; }</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; }</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; }</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160;</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; <span class="keywordflow">if</span>( carray_count(mime_parser-&gt;m_reports) &gt; 0 )</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; {</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="comment">/******************************************************************</span></div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160;<span class="comment"> * Handle reports (mainly MDNs)</span></div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160;<span class="comment"> *****************************************************************/</span></div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160;</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="keywordtype">int</span> mdns_enabled = mrsqlite3_get_config_int__(ths-&gt;m_sql, <span class="stringliteral">&quot;mdns_enabled&quot;</span>, MR_MDNS_DEFAULT_ENABLED);</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; icnt = carray_count(mime_parser-&gt;m_reports);</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; icnt; i++ )</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; {</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="keywordtype">int</span> mdn_consumed = 0;</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keyword">struct </span>mailmime* report_root = carray_get(mime_parser-&gt;m_reports, i);</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keyword">struct </span>mailmime_parameter* report_type = mr_find_ct_parameter(report_root, <span class="stringliteral">&quot;report-type&quot;</span>);</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">if</span>( report_root==NULL || report_type==NULL || report_type-&gt;pa_value==NULL ) {</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160;</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <span class="keywordflow">if</span>( strcmp(report_type-&gt;pa_value, <span class="stringliteral">&quot;disposition-notification&quot;</span>) == 0</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; &amp;&amp; clist_count(report_root-&gt;mm_data.mm_multipart.mm_mp_list) &gt;= 2 <span class="comment">/* the first part is for humans, the second for machines */</span> )</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; {</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordflow">if</span>( mdns_enabled <span class="comment">/*to get a clear functionality, do not show incoming MDNs if the options is disabled*/</span> )</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; {</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="keyword">struct </span>mailmime* report_data = (<span class="keyword">struct </span>mailmime*)clist_content(clist_next(clist_begin(report_root-&gt;mm_data.mm_multipart.mm_mp_list)));</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <span class="keywordflow">if</span>( report_data</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; &amp;&amp; report_data-&gt;mm_content_type-&gt;ct_type-&gt;tp_type==MAILMIME_TYPE_COMPOSITE_TYPE</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; &amp;&amp; report_data-&gt;mm_content_type-&gt;ct_type-&gt;tp_data.tp_composite_type-&gt;ct_type==MAILMIME_COMPOSITE_TYPE_MESSAGE</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; &amp;&amp; strcmp(report_data-&gt;mm_content_type-&gt;ct_subtype, <span class="stringliteral">&quot;disposition-notification&quot;</span>)==0 )</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; {</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <span class="comment">/* we received a MDN (although the MDN is only a header, we parse it as a complete mail) */</span></div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span>* report_body = NULL;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="keywordtype">size_t</span> report_body_bytes = 0;</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <span class="keywordtype">char</span>* to_mmap_string_unref = NULL;</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="keywordflow">if</span>( mr_mime_transfer_decode(report_data, &amp;report_body, &amp;report_body_bytes, &amp;to_mmap_string_unref) )</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; {</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; <span class="keyword">struct </span>mailmime* report_parsed = NULL;</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="keywordtype">size_t</span> dummy = 0;</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="keywordflow">if</span>( mailmime_parse(report_body, report_body_bytes, &amp;dummy, &amp;report_parsed)==MAIL_NO_ERROR</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; &amp;&amp; report_parsed!=NULL )</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; {</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="keyword">struct </span>mailimf_fields* report_fields = mr_find_mailimf_fields(report_parsed);</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; <span class="keywordflow">if</span>( report_fields )</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; {</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="keyword">struct </span>mailimf_optional_field* of_disposition = mr_find_mailimf_field2(report_fields, <span class="stringliteral">&quot;Disposition&quot;</span>); <span class="comment">/* MUST be preset, _if_ preset, we assume a sort of attribution and do not go into details */</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keyword">struct </span>mailimf_optional_field* of_org_msgid = mr_find_mailimf_field2(report_fields, <span class="stringliteral">&quot;Original-Message-ID&quot;</span>); <span class="comment">/* can&#39;t live without */</span></div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="keywordflow">if</span>( of_disposition &amp;&amp; of_disposition-&gt;fld_value &amp;&amp; of_org_msgid &amp;&amp; of_org_msgid-&gt;fld_value )</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; {</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <span class="keywordtype">char</span>* rfc724_mid = NULL;</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; dummy = 0;</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <span class="keywordflow">if</span>( mailimf_msg_id_parse(of_org_msgid-&gt;fld_value, strlen(of_org_msgid-&gt;fld_value), &amp;dummy, &amp;rfc724_mid)==MAIL_NO_ERROR</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; &amp;&amp; rfc724_mid!=NULL )</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; {</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; uint32_t chat_id = 0;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; uint32_t msg_id = 0;</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; <span class="keywordflow">if</span>( mrmailbox_mdn_from_ext__(ths, from_id, rfc724_mid, &amp;chat_id, &amp;msg_id) ) {</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; carray_add(rr_event_to_send, (<span class="keywordtype">void</span>*)(uintptr_t)chat_id, NULL);</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; carray_add(rr_event_to_send, (<span class="keywordtype">void</span>*)(uintptr_t)msg_id, NULL);</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; }</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; mdn_consumed = (msg_id!=0);</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; free(rfc724_mid);</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; }</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; }</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; }</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; mailmime_free(report_parsed);</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; }</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160;</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; <span class="keywordflow">if</span>( to_mmap_string_unref ) { mmap_string_unref(to_mmap_string_unref); }</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; }</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; }</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; }</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160;</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; <span class="comment">/* Move the MDN away to the chats folder. We do this for:</span></div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160;<span class="comment"> - Consumed or not consumed MDNs from other messengers</span></div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160;<span class="comment"> - Consumed MDNs from normal MUAs</span></div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160;<span class="comment"> Unconsumed MDNs from normal MUAs are _not_ moved.</span></div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160;<span class="comment"> NB: we do not delete the MDN as it may be used by other clients</span></div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160;<span class="comment"> CAVE: we rely on mrimap_markseen_msg() not to move messages that are aready in the correct folder.</span></div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160;<span class="comment"> otherwiese, the moved message get a new server_uid and is &quot;fresh&quot; again and we will be here again to move it away -</span></div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160;<span class="comment"> a classical deadlock, see also (***) */</span></div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <span class="keywordflow">if</span>( mime_parser-&gt;m_is_send_by_messenger || mdn_consumed ) {</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <span class="keywordtype">char</span>* jobparam = mr_mprintf(<span class="stringliteral">&quot;%c=%s\n%c=%lu&quot;</span>, MRP_SERVER_FOLDER, server_folder, MRP_SERVER_UID, server_uid);</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; mrjob_add__(ths, MRJ_MARKSEEN_MDN_ON_IMAP, 0, jobparam);</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; free(jobparam);</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; }</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; }</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160;</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; } <span class="comment">/* for() */</span></div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160;</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; }</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160;</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; <span class="comment">/* debug print? */</span></div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <span class="keywordflow">if</span>( mrsqlite3_get_config_int__(ths-&gt;m_sql, <span class="stringliteral">&quot;save_eml&quot;</span>, 0) ) {</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <span class="keywordtype">char</span>* emlname = mr_mprintf(<span class="stringliteral">&quot;%s/%s-%i.eml&quot;</span>, ths-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>, server_folder, (<span class="keywordtype">int</span>)first_dblocal_id <span class="comment">/*may be 0 for MDNs*/</span>);</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; FILE* emlfileob = fopen(emlname, <span class="stringliteral">&quot;w&quot;</span>);</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; <span class="keywordflow">if</span>( emlfileob ) {</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; fwrite(imf_raw_not_terminated, 1, imf_raw_bytes, emlfileob);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; fclose(emlfileob);</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; }</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; free(emlname);</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; }</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160; <span class="comment">/* end sql-transaction */</span></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; mrsqlite3_commit__(ths-&gt;m_sql);</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; transaction_pending = 0;</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160;</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; <span class="comment">/* done */</span></div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160;cleanup:</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; <span class="keywordflow">if</span>( transaction_pending ) {</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; mrsqlite3_rollback__(ths-&gt;m_sql);</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; }</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160;</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <span class="keywordflow">if</span>( db_locked ) {</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; mrsqlite3_unlock(ths-&gt;m_sql);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; }</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160;</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <span class="keywordflow">if</span>( mime_parser ) {</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; mrmimeparser_unref(mime_parser);</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; }</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160;</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; <span class="keywordflow">if</span>( rfc724_mid ) {</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; free(rfc724_mid);</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; }</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160;</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <span class="keywordflow">if</span>( to_ids ) {</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; carray_free(to_ids);</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; }</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160;</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <span class="keywordflow">if</span>( created_db_entries ) {</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="keywordflow">if</span>( create_event_to_send ) {</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="keywordtype">size_t</span> i, icnt = carray_count(created_db_entries);</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; icnt; i += 2 ) {</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; ths-&gt;m_cb(ths, create_event_to_send, (uintptr_t)carray_get(created_db_entries, i), (uintptr_t)carray_get(created_db_entries, i+1));</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; }</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; }</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; carray_free(created_db_entries);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; }</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160;</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">if</span>( rr_event_to_send ) {</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="keywordtype">size_t</span> i, icnt = carray_count(rr_event_to_send);</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; icnt; i += 2 ) {</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; ths-&gt;m_cb(ths, MR_EVENT_MSG_READ, (uintptr_t)carray_get(rr_event_to_send, i), (uintptr_t)carray_get(rr_event_to_send, i+1));</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; }</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; carray_free(rr_event_to_send);</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; }</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160;</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; free(txt_raw);</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160;}</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160;</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160;</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160;<span class="comment"> * Main interface</span></div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160;</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160;</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160;<span class="keyword">static</span> uintptr_t cb_dummy(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keywordtype">int</span> event, uintptr_t data1, uintptr_t data2)</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160;{</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160;}</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160;<span class="keyword">static</span> int32_t cb_get_config_int(mrimap_t* imap, <span class="keyword">const</span> <span class="keywordtype">char</span>* key, int32_t value)</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160;{</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox = (<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>*)imap-&gt;m_userData;</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; int32_t ret = mrsqlite3_get_config_int__(mailbox-&gt;m_sql, key, value);</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160;}</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> cb_set_config_int(mrimap_t* imap, <span class="keyword">const</span> <span class="keywordtype">char</span>* key, int32_t def)</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160;{</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox = (<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>*)imap-&gt;m_userData;</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; mrsqlite3_set_config_int__(mailbox-&gt;m_sql, key, def);</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160;}</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> cb_receive_imf(mrimap_t* imap, <span class="keyword">const</span> <span class="keywordtype">char</span>* imf_raw_not_terminated, <span class="keywordtype">size_t</span> imf_raw_bytes, <span class="keyword">const</span> <span class="keywordtype">char</span>* server_folder, uint32_t server_uid, uint32_t flags)</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160;{</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox = (<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>*)imap-&gt;m_userData;</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; receive_imf(mailbox, imf_raw_not_terminated, imf_raw_bytes, server_folder, server_uid, flags);</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160;}</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160;</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160;</div><div class="line"><a name="l00897"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a32825e3e0a1b16679580704a4b43db1a"> 897</a></span>&#160;<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* <a class="code" href="structmrmailbox__t.html#a32825e3e0a1b16679580704a4b43db1a">mrmailbox_new</a>(<a class="code" href="structmrmailbox__t.html#a957f0bbae60f389bac40acf42b68b134">mrmailboxcb_t</a> cb, <span class="keywordtype">void</span>* userdata, <span class="keyword">const</span> <span class="keywordtype">char</span>* os_name)</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160;{</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; mrmailbox_get_thread_index(); <span class="comment">/* make sure, the main thread has the index #1, only for a nicer look of the logs */</span></div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160;</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; <a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths = NULL;</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160;</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <span class="keywordflow">if</span>( (ths=calloc(1, <span class="keyword">sizeof</span>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>)))==NULL ) {</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; exit(23); <span class="comment">/* cannot allocate little memory, unrecoverable error */</span></div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; }</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160;</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; pthread_mutex_init(&amp;ths-&gt;m_log_ringbuf_critical, NULL);</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160;</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; pthread_mutex_init(&amp;ths-&gt;m_wake_lock_critical, NULL);</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160;</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; ths-&gt;m_sql = mrsqlite3_new(ths);</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; ths-&gt;m_cb = cb? cb : cb_dummy;</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; ths-&gt;<a class="code" href="structmrmailbox__t.html#a6c557153209e128b69301246dbf9e230">m_userdata</a> = userdata;</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; ths-&gt;m_imap = mrimap_new(cb_get_config_int, cb_set_config_int, cb_receive_imf, (<span class="keywordtype">void</span>*)ths, ths);</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; ths-&gt;m_smtp = mrsmtp_new(ths);</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; ths-&gt;m_os_name = safe_strdup(os_name);</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160;</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; mrjob_init_thread(ths);</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160;</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; mrpgp_init(ths);</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160;</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="comment">/* Random-seed. An additional seed with more random data is done just before key generation</span></div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160;<span class="comment"> (the timespan between this call and the key generation time is typically random.</span></div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160;<span class="comment"> Moreover, later, we add a hash of the first message data to the random-seed</span></div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160;<span class="comment"> (it would be okay to seed with even more sensible data, the seed values cannot be recovered from the PRNG output, see OpenSSL&#39;s RAND_seed() ) */</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; {</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; uintptr_t seed[5];</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; seed[0] = (uintptr_t)time(NULL); <span class="comment">/* time */</span></div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; seed[1] = (uintptr_t)seed; <span class="comment">/* stack */</span></div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; seed[2] = (uintptr_t)ths; <span class="comment">/* heap */</span></div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; seed[3] = (uintptr_t)pthread_self(); <span class="comment">/* thread ID */</span></div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; seed[4] = (uintptr_t)getpid(); <span class="comment">/* process ID */</span></div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; mrpgp_rand_seed(ths, seed, <span class="keyword">sizeof</span>(seed));</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; }</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160;</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; <span class="keywordflow">if</span>( s_localize_mb_obj==NULL ) {</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; s_localize_mb_obj = ths;</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; }</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160;</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="keywordflow">return</span> ths;</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160;}</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160;</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160;</div><div class="line"><a name="l00954"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a825cec4a85da05335674eae221d51374"> 954</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a825cec4a85da05335674eae221d51374">mrmailbox_unref</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160;{</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL ) {</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; }</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160;</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; mrpgp_exit(mailbox);</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160;</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; mrjob_exit_thread(mailbox);</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160;</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; <span class="keywordflow">if</span>( <a class="code" href="structmrmailbox__t.html#aace7cd8b68f45b869956d5c7476a1da0">mrmailbox_is_open</a>(mailbox) ) {</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; <a class="code" href="structmrmailbox__t.html#a75011d103515e088e950a64d0706ec86">mrmailbox_close</a>(mailbox);</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; }</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160;</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; mrimap_unref(mailbox-&gt;m_imap);</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; mrsmtp_unref(mailbox-&gt;m_smtp);</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; mrsqlite3_unref(mailbox-&gt;m_sql);</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; pthread_mutex_destroy(&amp;mailbox-&gt;m_wake_lock_critical);</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160;</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; pthread_mutex_destroy(&amp;mailbox-&gt;m_log_ringbuf_critical);</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i &lt; MR_LOG_RINGBUF_SIZE; i++ ) {</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; free(mailbox-&gt;m_log_ringbuf[i]);</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; }</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160;</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; free(mailbox-&gt;m_os_name);</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; free(mailbox);</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160;</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; <span class="keywordflow">if</span>( s_localize_mb_obj==mailbox ) {</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; s_localize_mb_obj = NULL;</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; }</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160;}</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160;</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160;</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> update_config_cache__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, <span class="keyword">const</span> <span class="keywordtype">char</span>* key)</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160;{</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; <span class="keywordflow">if</span>( key==NULL || strcmp(key, <span class="stringliteral">&quot;e2ee_enabled&quot;</span>)==0 ) {</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; ths-&gt;m_e2ee_enabled = mrsqlite3_get_config_int__(ths-&gt;m_sql, <span class="stringliteral">&quot;e2ee_enabled&quot;</span>, MR_E2EE_DEFAULT_ENABLED);</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; }</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160;}</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160;</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160;</div><div class="line"><a name="l01010"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#ae4c9c9f9ce4b3de82b3ce7fc582cbc5b"> 1010</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#ae4c9c9f9ce4b3de82b3ce7fc582cbc5b">mrmailbox_open</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* dbfile, <span class="keyword">const</span> <span class="keywordtype">char</span>* blobdir)</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;{</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; <span class="keywordtype">int</span> success = 0;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; <span class="keywordtype">int</span> db_locked = 0;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || dbfile == NULL ) {</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; }</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; db_locked = 1;</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <span class="comment">/* Open() sets up the object and connects to the given database</span></div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;<span class="comment"> from which all configuration is read/written to. */</span></div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; <span class="comment">/* Create/open sqlite database */</span></div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; <span class="keywordflow">if</span>( !mrsqlite3_open__(mailbox-&gt;m_sql, dbfile, 0) ) {</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; }</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; mrjob_kill_action__(mailbox, MRJ_CONNECT_TO_IMAP);</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; <span class="comment">/* backup dbfile name */</span></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; mailbox-&gt;<a class="code" href="structmrmailbox__t.html#aab18660500768b611373190720439956">m_dbfile</a> = safe_strdup(dbfile);</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; <span class="comment">/* set blob-directory</span></div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;<span class="comment"> (to avoid double slashed, the given directory should not end with an slash) */</span></div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; <span class="keywordflow">if</span>( blobdir &amp;&amp; blobdir[0] ) {</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a> = safe_strdup(blobdir);</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; }</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a> = mr_mprintf(<span class="stringliteral">&quot;%s-blobs&quot;</span>, dbfile);</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; mr_create_folder(mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>, mailbox);</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; }</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="comment">/* cache some settings */</span></div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; update_config_cache__(mailbox, NULL);</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; <span class="comment">/* success */</span></div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; success = 1;</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <span class="comment">/* cleanup */</span></div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;cleanup:</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; <span class="keywordflow">if</span>( !success ) {</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; <span class="keywordflow">if</span>( mrsqlite3_is_open(mailbox-&gt;m_sql) ) {</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; mrsqlite3_close__(mailbox-&gt;m_sql);</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; }</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; }</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <span class="keywordflow">if</span>( db_locked ) {</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; }</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; <span class="keywordflow">return</span> success;</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;}</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;</div><div class="line"><a name="l01075"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a75011d103515e088e950a64d0706ec86"> 1075</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a75011d103515e088e950a64d0706ec86">mrmailbox_close</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;{</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; }</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; mrimap_disconnect(mailbox-&gt;m_imap);</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; mrsmtp_disconnect(mailbox-&gt;m_smtp);</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="keywordflow">if</span>( mrsqlite3_is_open(mailbox-&gt;m_sql) ) {</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; mrsqlite3_close__(mailbox-&gt;m_sql);</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; }</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; free(mailbox-&gt;<a class="code" href="structmrmailbox__t.html#aab18660500768b611373190720439956">m_dbfile</a>);</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; mailbox-&gt;<a class="code" href="structmrmailbox__t.html#aab18660500768b611373190720439956">m_dbfile</a> = NULL;</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; free(mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>);</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a> = NULL;</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;}</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;</div><div class="line"><a name="l01109"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#aace7cd8b68f45b869956d5c7476a1da0"> 1109</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#aace7cd8b68f45b869956d5c7476a1da0">mrmailbox_is_open</a>(<span class="keyword">const</span> <a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;{</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="keywordflow">return</span> 0; <span class="comment">/* error - database not opened */</span></div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; }</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; <span class="keywordflow">return</span> mrsqlite3_is_open(mailbox-&gt;m_sql);</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;}</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;<span class="keywordtype">int</span> mrmailbox_poke_eml_file(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, <span class="keyword">const</span> <span class="keywordtype">char</span>* filename)</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;{</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; <span class="comment">/* mainly for testing, may be called by mrmailbox_import_spec() */</span></div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; <span class="keywordtype">int</span> success = 0;</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; <span class="keywordtype">char</span>* data = NULL;</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; <span class="keywordtype">size_t</span> data_bytes;</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; <span class="keywordflow">if</span>( ths == NULL ) {</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; }</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; <span class="keywordflow">if</span>( mr_read_file(filename, (<span class="keywordtype">void</span>**)&amp;data, &amp;data_bytes, ths) == 0 ) {</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; }</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; receive_imf(ths, data, data_bytes, <span class="stringliteral">&quot;import&quot;</span>, 0, 0); <span class="comment">/* this static function is the reason why this function is not moved to mrmailbox_imex.c */</span></div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; success = 1;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;cleanup:</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; free(data);</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; <span class="keywordflow">return</span> success;</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;}</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;<span class="comment"> * INI-handling, Information</span></div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;</div><div class="line"><a name="l01176"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a19b3e9f5209bc326fc77f3944522e8ad"> 1176</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a19b3e9f5209bc326fc77f3944522e8ad">mrmailbox_set_config</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, <span class="keyword">const</span> <span class="keywordtype">char</span>* key, <span class="keyword">const</span> <span class="keywordtype">char</span>* value)</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;{</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; <span class="keywordtype">int</span> ret;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; <span class="keywordflow">if</span>( ths == NULL || key == NULL ) { <span class="comment">/* &quot;value&quot; may be NULL */</span></div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; }</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; mrsqlite3_lock(ths-&gt;m_sql);</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; ret = mrsqlite3_set_config__(ths-&gt;m_sql, key, value);</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; update_config_cache__(ths, key);</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; mrsqlite3_unlock(ths-&gt;m_sql);</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;}</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;</div><div class="line"><a name="l01207"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#aeb12e9631508fd76e3e9828a82031767"> 1207</a></span>&#160;<span class="keywordtype">char</span>* <a class="code" href="structmrmailbox__t.html#aeb12e9631508fd76e3e9828a82031767">mrmailbox_get_config</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, <span class="keyword">const</span> <span class="keywordtype">char</span>* key, <span class="keyword">const</span> <span class="keywordtype">char</span>* def)</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;{</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160; <span class="keywordtype">char</span>* ret;</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; <span class="keywordflow">if</span>( ths == NULL || key == NULL ) { <span class="comment">/* &quot;def&quot; may be NULL */</span></div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; <span class="keywordflow">return</span> strdup_keep_null(def);</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160; }</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160; mrsqlite3_lock(ths-&gt;m_sql);</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160; ret = mrsqlite3_get_config__(ths-&gt;m_sql, key, def);</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160; mrsqlite3_unlock(ths-&gt;m_sql);</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160; <span class="keywordflow">return</span> ret; <span class="comment">/* the returned string must be free()&#39;d, returns NULL only if &quot;def&quot; is NULL and &quot;key&quot; is unset */</span></div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;}</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;</div><div class="line"><a name="l01229"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a889aea3b38561016ffa2343d5106c38d"> 1229</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a889aea3b38561016ffa2343d5106c38d">mrmailbox_set_config_int</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, <span class="keyword">const</span> <span class="keywordtype">char</span>* key, int32_t value)</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;{</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160; <span class="keywordtype">int</span> ret;</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; <span class="keywordflow">if</span>( ths == NULL || key == NULL ) {</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160; }</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160; mrsqlite3_lock(ths-&gt;m_sql);</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160; ret = mrsqlite3_set_config_int__(ths-&gt;m_sql, key, value);</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160; update_config_cache__(ths, key);</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160; mrsqlite3_unlock(ths-&gt;m_sql);</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;}</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;</div><div class="line"><a name="l01251"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#afba149fcbcb5a069113aed4336f4bcc7"> 1251</a></span>&#160;int32_t <a class="code" href="structmrmailbox__t.html#afba149fcbcb5a069113aed4336f4bcc7">mrmailbox_get_config_int</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, <span class="keyword">const</span> <span class="keywordtype">char</span>* key, int32_t def)</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;{</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160; int32_t ret;</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160; <span class="keywordflow">if</span>( ths == NULL || key == NULL ) {</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160; <span class="keywordflow">return</span> def;</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160; }</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160; mrsqlite3_lock(ths-&gt;m_sql);</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160; ret = mrsqlite3_get_config_int__(ths-&gt;m_sql, key, def);</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160; mrsqlite3_unlock(ths-&gt;m_sql);</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;}</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;</div><div class="line"><a name="l01276"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a011705ea76c8f9017b999eb009eec9ce"> 1276</a></span>&#160;<span class="keywordtype">char</span>* <a class="code" href="structmrmailbox__t.html#a011705ea76c8f9017b999eb009eec9ce">mrmailbox_get_blobdir</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;{</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160; <span class="keywordflow">return</span> safe_strdup(mailbox? mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a> : NULL);</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;}</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;</div><div class="line"><a name="l01292"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a4b3257b21c3c9ff539fc6a9315be1164"> 1292</a></span>&#160;<span class="keywordtype">char</span>* <a class="code" href="structmrmailbox__t.html#a4b3257b21c3c9ff539fc6a9315be1164">mrmailbox_get_info</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;{</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span>* unset = <span class="stringliteral">&quot;0&quot;</span>;</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160; <span class="keywordtype">char</span> *displayname = NULL, *temp = NULL, *l_readable_str = NULL, *l2_readable_str = NULL, *fingerprint_str = NULL;</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160; mrloginparam_t *l = NULL, *l2 = NULL;</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160; <span class="keywordtype">int</span> contacts, chats, real_msgs, deaddrop_msgs, is_configured, dbversion, mdns_enabled, e2ee_enabled, prv_key_count, pub_key_count;</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160; mrkey_t* self_public = mrkey_new();</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160; mrstrbuilder_t ret;</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160; mrstrbuilder_init(&amp;ret);</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160; <span class="keywordflow">return</span> safe_strdup(<span class="stringliteral">&quot;ErrBadPtr&quot;</span>);</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160; }</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160; <span class="comment">/* read data (all pointers may be NULL!) */</span></div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160; l = mrloginparam_new();</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160; l2 = mrloginparam_new();</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160; mrloginparam_read__(l, mailbox-&gt;m_sql, <span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160; mrloginparam_read__(l2, mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured_&quot;</span> <span class="comment">/*the trailing underscore is correct*/</span>);</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160; displayname = mrsqlite3_get_config__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;displayname&quot;</span>, NULL);</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160; chats = mrmailbox_get_chat_cnt__(mailbox);</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160; real_msgs = mrmailbox_get_real_msg_cnt__(mailbox);</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160; deaddrop_msgs = mrmailbox_get_deaddrop_msg_cnt__(mailbox);</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160; contacts = mrmailbox_get_real_contact_cnt__(mailbox);</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160; is_configured = mrsqlite3_get_config_int__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured&quot;</span>, 0);</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160; dbversion = mrsqlite3_get_config_int__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;dbversion&quot;</span>, 0);</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160; e2ee_enabled = mailbox-&gt;m_e2ee_enabled;</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160; mdns_enabled = mrsqlite3_get_config_int__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;mdns_enabled&quot;</span>, MR_MDNS_DEFAULT_ENABLED);</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160; sqlite3_stmt* stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, <span class="stringliteral">&quot;SELECT COUNT(*) FROM keypairs;&quot;</span>);</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160; prv_key_count = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, <span class="stringliteral">&quot;SELECT COUNT(*) FROM acpeerstates;&quot;</span>);</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160; pub_key_count = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160; <span class="keywordflow">if</span>( mrkey_load_self_public__(self_public, l2-&gt;m_addr, mailbox-&gt;m_sql) ) {</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160; fingerprint_str = mrkey_render_fingerprint(self_public, mailbox);</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160; }</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160; fingerprint_str = safe_strdup(<span class="stringliteral">&quot;&lt;Not yet calculated&gt;&quot;</span>);</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160; }</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;</div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160; l_readable_str = mrloginparam_get_readable(l);</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160; l2_readable_str = mrloginparam_get_readable(l2);</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160; <span class="comment">/* create info</span></div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;<span class="comment"> - some keys are display lower case - these can be changed using the `set`-command</span></div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;<span class="comment"> - we do not display the password here; in the cli-utility, you can see it using `get mail_pw`</span></div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;<span class="comment"> - use neutral speach; the Delta Chat Core is not directly related to any front end or end-product</span></div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;<span class="comment"> - contributors: You&#39;re welcome to add your names here */</span></div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160; temp = mr_mprintf(</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160; <span class="stringliteral">&quot;Chats: %i\n&quot;</span></div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160; <span class="stringliteral">&quot;Chat messages: %i\n&quot;</span></div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160; <span class="stringliteral">&quot;Messages in mailbox: %i\n&quot;</span></div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160; <span class="stringliteral">&quot;Contacts: %i\n&quot;</span></div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160; <span class="stringliteral">&quot;Database=%s, dbversion=%i, Blobdir=%s\n&quot;</span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160; <span class="stringliteral">&quot;\n&quot;</span></div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160; <span class="stringliteral">&quot;displayname=%s\n&quot;</span></div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160; <span class="stringliteral">&quot;configured=%i\n&quot;</span></div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160; <span class="stringliteral">&quot;config0=%s\n&quot;</span></div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160; <span class="stringliteral">&quot;config1=%s\n&quot;</span></div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160; <span class="stringliteral">&quot;mdns_enabled=%i\n&quot;</span></div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160; <span class="stringliteral">&quot;e2ee_enabled=%i\n&quot;</span></div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160; <span class="stringliteral">&quot;E2EE_DEFAULT_ENABLED=%i\n&quot;</span></div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160; <span class="stringliteral">&quot;Private keys=%i, public keys=%i, fingerprint=\n%s\n&quot;</span></div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160; <span class="stringliteral">&quot;\n&quot;</span></div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160; <span class="stringliteral">&quot;Using Delta Chat Core v%i.%i.%i, SQLite %s-ts%i, libEtPan %i.%i, OpenSSL %i.%i.%i%c. Compiled &quot;</span> __DATE__ <span class="stringliteral">&quot;, &quot;</span> __TIME__ <span class="stringliteral">&quot; for %i bit usage.\n\n&quot;</span></div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160; <span class="stringliteral">&quot;Log excerpt:\n&quot;</span></div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160; <span class="comment">/* In the frontends, additional software hints may follow here. */</span></div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160; , chats, real_msgs, deaddrop_msgs, contacts</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160; , mailbox-&gt;<a class="code" href="structmrmailbox__t.html#aab18660500768b611373190720439956">m_dbfile</a>? mailbox-&gt;<a class="code" href="structmrmailbox__t.html#aab18660500768b611373190720439956">m_dbfile</a> : unset, dbversion, mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>? mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a> : unset</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160; , displayname? displayname : unset</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160; , is_configured</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160; , l_readable_str, l2_readable_str</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160; , mdns_enabled</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160; , e2ee_enabled</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160; , MR_E2EE_DEFAULT_ENABLED</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160; , prv_key_count, pub_key_count, fingerprint_str</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160; , MR_VERSION_MAJOR, MR_VERSION_MINOR, MR_VERSION_REVISION</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160; , SQLITE_VERSION, sqlite3_threadsafe() , libetpan_get_version_major(), libetpan_get_version_minor()</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160; , (<span class="keywordtype">int</span>)(OPENSSL_VERSION_NUMBER&gt;&gt;28), (<span class="keywordtype">int</span>)(OPENSSL_VERSION_NUMBER&gt;&gt;20)&amp;0xFF, (<span class="keywordtype">int</span>)(OPENSSL_VERSION_NUMBER&gt;&gt;12)&amp;0xFF, (<span class="keywordtype">char</span>)(<span class="charliteral">&#39;a&#39;</span>-1+((OPENSSL_VERSION_NUMBER&gt;&gt;4)&amp;0xFF))</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160; , <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)*8</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160; );</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160; mrstrbuilder_cat(&amp;ret, temp);</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160; free(temp);</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160; <span class="comment">/* add log excerpt */</span></div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160; pthread_mutex_lock(&amp;mailbox-&gt;m_log_ringbuf_critical); <span class="comment">/*take care not to log here! */</span></div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160; <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i &lt; MR_LOG_RINGBUF_SIZE; i++ ) {</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160; <span class="keywordtype">int</span> j = (mailbox-&gt;m_log_ringbuf_pos+i) % MR_LOG_RINGBUF_SIZE;</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160; <span class="keywordflow">if</span>( mailbox-&gt;m_log_ringbuf[j] ) {</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160; <span class="keyword">struct </span>tm wanted_struct;</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160; memcpy(&amp;wanted_struct, localtime(&amp;mailbox-&gt;m_log_ringbuf_times[j]), <span class="keyword">sizeof</span>(<span class="keyword">struct</span> tm));</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160; temp = mr_mprintf(<span class="stringliteral">&quot;\n%02i:%02i:%02i &quot;</span>, (<span class="keywordtype">int</span>)wanted_struct.tm_hour, (<span class="keywordtype">int</span>)wanted_struct.tm_min, (<span class="keywordtype">int</span>)wanted_struct.tm_sec);</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160; mrstrbuilder_cat(&amp;ret, temp);</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160; mrstrbuilder_cat(&amp;ret, mailbox-&gt;m_log_ringbuf[j]);</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160; free(temp);</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160; }</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160; }</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160; pthread_mutex_unlock(&amp;mailbox-&gt;m_log_ringbuf_critical);</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160; <span class="comment">/* free data */</span></div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160; mrloginparam_unref(l);</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160; mrloginparam_unref(l2);</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160; free(displayname);</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160; free(l_readable_str);</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160; free(l2_readable_str);</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160; free(fingerprint_str);</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160; mrkey_unref(self_public);</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160; <span class="keywordflow">return</span> ret.m_buf; <span class="comment">/* must be freed by the caller */</span></div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;}</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;<span class="comment"> * Misc.</span></div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;<span class="keywordtype">int</span> mrmailbox_get_archived_count__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;{</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_chats_WHERE_archived, <span class="stringliteral">&quot;SELECT COUNT(*) FROM chats WHERE blocked=0 AND archived=1;&quot;</span>);</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160; }</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;}</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;<span class="keywordtype">int</span> mrmailbox_reset_tables(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, <span class="keywordtype">int</span> bits)</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;{</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Resetting tables (%i)...&quot;</span>, bits);</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160; mrsqlite3_lock(ths-&gt;m_sql);</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160; <span class="keywordflow">if</span>( bits &amp; 1 ) {</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM jobs;&quot;</span>);</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Job resetted.&quot;</span>);</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160; }</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160; <span class="keywordflow">if</span>( bits &amp; 2 ) {</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM acpeerstates;&quot;</span>);</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Peerstates resetted.&quot;</span>);</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160; }</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160; <span class="keywordflow">if</span>( bits &amp; 4 ) {</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM keypairs;&quot;</span>);</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Private keypairs resetted.&quot;</span>);</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160; }</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160; <span class="keywordflow">if</span>( bits &amp; 8 ) {</div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM contacts WHERE id&gt;&quot;</span> MR_STRINGIFY(MR_CONTACT_ID_LAST_SPECIAL) <span class="stringliteral">&quot;;&quot;</span>); <span class="comment">/* the other IDs are reserved - leave these rows to make sure, the IDs are not used by normal contacts*/</span></div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM chats WHERE id&gt;&quot;</span> MR_STRINGIFY(MR_CHAT_ID_LAST_SPECIAL) <span class="stringliteral">&quot;;&quot;</span>);</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM chats_contacts;&quot;</span>);</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM msgs WHERE id&gt;&quot;</span> MR_STRINGIFY(MR_MSG_ID_LAST_SPECIAL) <span class="stringliteral">&quot;;&quot;</span>);</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM config WHERE keyname LIKE &#39;imap.%&#39; OR keyname LIKE &#39;configured%&#39;;&quot;</span>);</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160; mrsqlite3_execute__(ths-&gt;m_sql, <span class="stringliteral">&quot;DELETE FROM leftgrps;&quot;</span>);</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Rest but server config resetted.&quot;</span>);</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160; }</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160; update_config_cache__(ths, NULL);</div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160; mrsqlite3_unlock(ths-&gt;m_sql);</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160; ths-&gt;m_cb(ths, MR_EVENT_MSGS_CHANGED, 0, 0);</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160; <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;}</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;</div><div class="line"><a name="l01490"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a74bd83d36d90e1201e5ab8003d9a312f"> 1490</a></span>&#160;<span class="keywordtype">char</span>* <a class="code" href="structmrmailbox__t.html#a74bd83d36d90e1201e5ab8003d9a312f">mrmailbox_get_version_str</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;{</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160; <span class="keywordflow">return</span> mr_mprintf(<span class="stringliteral">&quot;%i.%i.%i&quot;</span>, (<span class="keywordtype">int</span>)MR_VERSION_MAJOR, (<span class="keywordtype">int</span>)MR_VERSION_MINOR, (<span class="keywordtype">int</span>)MR_VERSION_REVISION);</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;}</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;<span class="keywordtype">void</span> mrmailbox_wake_lock(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;{</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160; }</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160; pthread_mutex_lock(&amp;mailbox-&gt;m_wake_lock_critical);</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160; mailbox-&gt;m_wake_lock++;</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160; <span class="keywordflow">if</span>( mailbox-&gt;m_wake_lock == 1 ) {</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_WAKE_LOCK, 1, 0);</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160; }</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160; pthread_mutex_unlock(&amp;mailbox-&gt;m_wake_lock_critical);</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;}</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;<span class="keywordtype">void</span> mrmailbox_wake_unlock(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;{</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160; }</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160; pthread_mutex_lock(&amp;mailbox-&gt;m_wake_lock_critical);</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160; <span class="keywordflow">if</span>( mailbox-&gt;m_wake_lock == 1 ) {</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_WAKE_LOCK, 0, 0);</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160; }</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160; mailbox-&gt;m_wake_lock--;</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160; pthread_mutex_unlock(&amp;mailbox-&gt;m_wake_lock_critical);</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;}</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;<span class="comment"> * Connect</span></div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;<span class="keywordtype">void</span> mrmailbox_connect_to_imap(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, mrjob_t* job <span class="comment">/*may be NULL if the function is called directly!*/</span>)</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;{</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160; <span class="keywordtype">int</span> is_locked = 0;</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160; mrloginparam_t* param = mrloginparam_new();</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160; <span class="keywordflow">if</span>( mrimap_is_connected(ths-&gt;m_imap) ) {</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160; mrmailbox_log_info(ths, 0, <span class="stringliteral">&quot;Already connected or trying to connect.&quot;</span>);</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160; }</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160; mrsqlite3_lock(ths-&gt;m_sql);</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160; is_locked = 1;</div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;</div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160; <span class="keywordflow">if</span>( mrsqlite3_get_config_int__(ths-&gt;m_sql, <span class="stringliteral">&quot;configured&quot;</span>, 0) == 0 ) {</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160; mrmailbox_log_error(ths, 0, <span class="stringliteral">&quot;Not configured.&quot;</span>);</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160; }</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160; mrloginparam_read__(param, ths-&gt;m_sql, <span class="stringliteral">&quot;configured_&quot;</span> <span class="comment">/*the trailing underscore is correct*/</span>);</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160; mrsqlite3_unlock(ths-&gt;m_sql);</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160; is_locked = 0;</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160; <span class="keywordflow">if</span>( !mrimap_connect(ths-&gt;m_imap, param) ) {</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160; }</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;cleanup:</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160; <span class="keywordflow">if</span>( param ) {</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160; mrloginparam_unref(param);</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160; }</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160; <span class="keywordflow">if</span>( is_locked ) {</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160; mrsqlite3_unlock(ths-&gt;m_sql);</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160; }</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;}</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;</div><div class="line"><a name="l01578"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a67eef5ffc3369b8ad09326471b0a266f"> 1578</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a67eef5ffc3369b8ad09326471b0a266f">mrmailbox_connect</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;{</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160; }</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160; mailbox-&gt;m_smtp-&gt;m_log_connect_errors = 1;</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160; mailbox-&gt;m_imap-&gt;m_log_connect_errors = 1;</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;</div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160; mrjob_kill_action__(mailbox, MRJ_CONNECT_TO_IMAP);</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160; mrjob_add__(mailbox, MRJ_CONNECT_TO_IMAP, 0, NULL);</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;}</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;</div><div class="line"><a name="l01605"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a7c7921ff7b7f2e10dc30522af980b785"> 1605</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a7c7921ff7b7f2e10dc30522af980b785">mrmailbox_disconnect</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;{</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160; }</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160; mrjob_kill_action__(mailbox, MRJ_CONNECT_TO_IMAP);</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160; mrimap_disconnect(mailbox-&gt;m_imap);</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160; mrsmtp_disconnect(mailbox-&gt;m_smtp);</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;}</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;<span class="comment">/* restore old data from the IMAP server, not really implemented. */</span></div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;<span class="keywordtype">int</span> mrmailbox_restore(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths, time_t seconds_to_restore)</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;{</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160; <span class="keywordflow">if</span>( ths == NULL ) {</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160; }</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160; <span class="keywordflow">return</span> mrimap_restore(ths-&gt;m_imap, seconds_to_restore);</div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;}</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;<span class="keywordtype">void</span> mrmailbox_heartbeat(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* ths)</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;{</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160; <span class="keywordflow">if</span>( ths == NULL ) {</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160; }</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160; <span class="comment">//mrmailbox_log_info(ths, 0, &quot;&lt;3 Mailbox&quot;);</span></div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160; mrimap_heartbeat(ths-&gt;m_imap);</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;}</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;</div><div class="line"><a name="l01663"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a4da10c87eb65bbf6c504979d75ec3b19"> 1663</a></span>&#160;<a class="code" href="structmrchatlist__t.html">mrchatlist_t</a>* <a class="code" href="structmrmailbox__t.html#a4da10c87eb65bbf6c504979d75ec3b19">mrmailbox_get_chatlist</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keywordtype">int</span> listflags, <span class="keyword">const</span> <span class="keywordtype">char</span>* query)</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;{</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160; <span class="keywordtype">int</span> success = 0;</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160; <span class="keywordtype">int</span> db_locked = 0;</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160; <a class="code" href="structmrchatlist__t.html">mrchatlist_t</a>* obj = mrchatlist_new(mailbox);</div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160; db_locked = 1;</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160; <span class="keywordflow">if</span>( !mrchatlist_load_from_db__(obj, listflags, query) ) {</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160; }</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160; <span class="comment">/* success */</span></div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160; success = 1;</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160; <span class="comment">/* cleanup */</span></div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;cleanup:</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160; <span class="keywordflow">if</span>( db_locked ) {</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160; }</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160; <span class="keywordflow">if</span>( success ) {</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160; <span class="keywordflow">return</span> obj;</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160; }</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160; <a class="code" href="structmrchatlist__t.html#ab036d6e066b5ff78779f36711c9ab2f9">mrchatlist_unref</a>(obj);</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160; <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160; }</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;}</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;</div><div class="line"><a name="l01709"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#ad106b9c23b3a559b524a37bb5504e096"> 1709</a></span>&#160;<a class="code" href="structmrchat__t.html">mrchat_t</a>* <a class="code" href="structmrmailbox__t.html#ad106b9c23b3a559b524a37bb5504e096">mrmailbox_get_chat</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;{</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160; <span class="keywordtype">int</span> success = 0;</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160; <span class="keywordtype">int</span> db_locked = 0;</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* obj = mrchat_new(mailbox);</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160; db_locked = 1;</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160; <span class="keywordflow">if</span>( !mrchat_load_from_db__(obj, chat_id) ) {</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160; }</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160; <span class="comment">/* success */</span></div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160; success = 1;</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160; <span class="comment">/* cleanup */</span></div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;cleanup:</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160; <span class="keywordflow">if</span>( db_locked ) {</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160; }</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160; <span class="keywordflow">if</span>( success ) {</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160; <span class="keywordflow">return</span> obj;</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160; }</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(obj);</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160; <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160; }</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;}</div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;</div><div class="line"><a name="l01755"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a07cc8fe0cfd900a9449bffc4ca5a7a95"> 1755</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a07cc8fe0cfd900a9449bffc4ca5a7a95">mrmailbox_marknoticed_chat</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;{</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160; <span class="comment">/* marking a chat as &quot;seen&quot; is done by marking all fresh chat messages as &quot;noticed&quot; -</span></div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;<span class="comment"> &quot;noticed&quot; messages are not counted as being unread but are still waiting for being marked as &quot;seen&quot; using mrmailbox_markseen_msgs() */</span></div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160; }</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_msgs_SET_state_WHERE_chat_id_AND_state,</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160; <span class="stringliteral">&quot;UPDATE msgs SET state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_NOTICED) <span class="stringliteral">&quot; WHERE chat_id=? AND state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_FRESH) <span class="stringliteral">&quot;;&quot;</span>);</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;}</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;</div><div class="line"><a name="l01789"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a97eb029d9dd0d33ae492217608958a73"> 1789</a></span>&#160;uint32_t <a class="code" href="structmrmailbox__t.html#a97eb029d9dd0d33ae492217608958a73">mrmailbox_get_chat_id_by_contact_id</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;{</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160; uint32_t chat_id = 0;</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160; chat_id = mrmailbox_lookup_real_nchat_by_contact_id__(mailbox, contact_id);</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160; <span class="keywordflow">return</span> chat_id;</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;}</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;</div><div class="line"><a name="l01816"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a1386ec2c091b936b65b25b50a302173d"> 1816</a></span>&#160;uint32_t <a class="code" href="structmrmailbox__t.html#a1386ec2c091b936b65b25b50a302173d">mrmailbox_create_chat_by_contact_id</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;{</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160; uint32_t chat_id = 0;</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160; <span class="keywordtype">int</span> send_event = 0, locked = 0;</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160; }</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160; locked = 1;</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160; chat_id = mrmailbox_lookup_real_nchat_by_contact_id__(mailbox, contact_id);</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160; <span class="keywordflow">if</span>( chat_id ) {</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160; mrmailbox_log_warning(mailbox, 0, <span class="stringliteral">&quot;Chat with contact %i already exists.&quot;</span>, (<span class="keywordtype">int</span>)contact_id);</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160; }</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160; <span class="keywordflow">if</span>( 0==mrmailbox_real_contact_exists__(mailbox, contact_id) ) {</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160; mrmailbox_log_warning(mailbox, 0, <span class="stringliteral">&quot;Cannot create chat, contact %i does not exist.&quot;</span>, (<span class="keywordtype">int</span>)contact_id);</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160; }</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160; chat_id = mrmailbox_create_or_lookup_nchat_by_contact_id__(mailbox, contact_id);</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160; <span class="keywordflow">if</span>( chat_id ) {</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160; send_event = 1;</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160; }</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160; mrmailbox_scaleup_contact_origin__(mailbox, contact_id, MR_ORIGIN_CREATE_CHAT);</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160; locked = 0;</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;cleanup:</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160; }</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160; <span class="keywordflow">if</span>( send_event ) {</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, 0, 0);</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160; }</div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160; <span class="keywordflow">return</span> chat_id;</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;}</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;<span class="keyword">static</span> carray* mrmailbox_get_chat_media__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <span class="keywordtype">int</span> msg_type, <span class="keywordtype">int</span> or_msg_type)</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;{</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160; carray* ret = carray_new(100);</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_i_FROM_msgs_WHERE_ctt,</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160; <span class="stringliteral">&quot;SELECT id FROM msgs WHERE chat_id=? AND (type=? OR type=?) ORDER BY timestamp, id;&quot;</span>);</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160; sqlite3_bind_int(stmt, 2, msg_type);</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160; sqlite3_bind_int(stmt, 3, or_msg_type&gt;0? or_msg_type : msg_type);</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)(uintptr_t)sqlite3_column_int(stmt, 0), NULL);</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160; }</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;}</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160;</div><div class="line"><a name="l01896"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a9685194a3318021d1a95eeed29d01277"> 1896</a></span>&#160;carray* <a class="code" href="structmrmailbox__t.html#a9685194a3318021d1a95eeed29d01277">mrmailbox_get_chat_media</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <span class="keywordtype">int</span> msg_type, <span class="keywordtype">int</span> or_msg_type)</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;{</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160; carray* ret = NULL;</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160; <span class="keywordflow">if</span>( mailbox ) {</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160; ret = mrmailbox_get_chat_media__(mailbox, chat_id, msg_type, or_msg_type);</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160; }</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;}</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;</div><div class="line"><a name="l01927"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a90b7861302d1276a07fdcb2d9c3c73b6"> 1927</a></span>&#160;uint32_t <a class="code" href="structmrmailbox__t.html#a90b7861302d1276a07fdcb2d9c3c73b6">mrmailbox_get_next_media</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t curr_msg_id, <span class="keywordtype">int</span> dir)</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;{</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160; uint32_t ret_msg_id = 0;</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160; <span class="keywordtype">int</span> locked = 0;</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160; carray* list = NULL;</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160; <span class="keywordtype">int</span> i, cnt;</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160; }</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160; locked = 1;</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160; <span class="keywordflow">if</span>( !mrmsg_load_from_db__(msg, mailbox, curr_msg_id) ) {</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160; }</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160; <span class="keywordflow">if</span>( (list=mrmailbox_get_chat_media__(mailbox, msg-&gt;<a class="code" href="structmrmsg__t.html#ac19bdc40e452c8997dd58474a7be6880">m_chat_id</a>, msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>, 0))==NULL ) {</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160; }</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160; locked = 0;</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160; cnt = carray_count(list);</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; cnt; i++ ) {</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160; <span class="keywordflow">if</span>( curr_msg_id == (uint32_t)(uintptr_t)carray_get(list, i) )</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160; {</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160; <span class="keywordflow">if</span>( dir &gt; 0 ) {</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160; <span class="comment">/* get the next message from the current position */</span></div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160; <span class="keywordflow">if</span>( i+1 &lt; cnt ) {</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160; ret_msg_id = (uint32_t)(uintptr_t)carray_get(list, i+1);</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160; }</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160; }</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( dir &lt; 0 ) {</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160; <span class="comment">/* get the previous message from the current position */</span></div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160; <span class="keywordflow">if</span>( i-1 &gt;= 0 ) {</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160; ret_msg_id = (uint32_t)(uintptr_t)carray_get(list, i-1);</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160; }</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160; }</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160; }</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160; }</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;cleanup:</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160; <span class="keywordflow">if</span>( list ) { carray_free(list); }</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160; <span class="keywordflow">return</span> ret_msg_id;</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;}</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;</div><div class="line"><a name="l02003"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#abf20deb2fd5886b7f3031f946053a847"> 2003</a></span>&#160;carray* <a class="code" href="structmrmailbox__t.html#abf20deb2fd5886b7f3031f946053a847">mrmailbox_get_chat_contacts</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;{</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160; <span class="comment">/* Normal chats do not include SELF. Group chats do (as it may happen that one is deleted from a</span></div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;<span class="comment"> groupchat but the chats stays visible, moreover, this makes displaying lists easier) */</span></div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160; carray* ret = carray_new(100);</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160; }</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160; <span class="keywordflow">if</span>( chat_id == MR_CHAT_ID_DEADDROP )</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160; {</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_contacts_WHERE_chat_id,</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160; <span class="stringliteral">&quot;SELECT DISTINCT from_id FROM msgs WHERE chat_id=? and from_id!=0 ORDER BY id DESC;&quot;</span>); <span class="comment">/* from_id in the deaddrop chat may be 0, see comment [**] */</span></div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160; }</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160; {</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_c_FROM_chats_contacts_WHERE_c_ORDER_BY,</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160; <span class="stringliteral">&quot;SELECT cc.contact_id FROM chats_contacts cc&quot;</span></div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160; <span class="stringliteral">&quot; LEFT JOIN contacts c ON c.id=cc.contact_id&quot;</span></div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160; <span class="stringliteral">&quot; WHERE cc.chat_id=?&quot;</span></div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160; <span class="stringliteral">&quot; ORDER BY c.id=1, LOWER(c.name||c.addr), c.id;&quot;</span>);</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160; }</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;</div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)(uintptr_t)sqlite3_column_int(stmt, 0), NULL);</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160; }</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;cleanup:</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;}</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;</div><div class="line"><a name="l02052"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#adbdcde6475db0cfafd8aa127b5bd1bc1"> 2052</a></span>&#160;carray* <a class="code" href="structmrmailbox__t.html#adbdcde6475db0cfafd8aa127b5bd1bc1">mrmailbox_get_fresh_msgs</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;{</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160; <span class="keywordtype">int</span> show_deaddrop, success = 0, locked = 0;</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160; carray* ret = carray_new(128);</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL || ret == NULL ) {</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160; }</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160; locked = 1;</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160; show_deaddrop = 0;<span class="comment">//mrsqlite3_get_config_int__(mailbox-&gt;m_sql, &quot;show_deaddrop&quot;, 0);</span></div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_i_FROM_msgs_LEFT_JOIN_contacts_WHERE_fresh,</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160; <span class="stringliteral">&quot;SELECT m.id&quot;</span></div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160; <span class="stringliteral">&quot; FROM msgs m&quot;</span></div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160; <span class="stringliteral">&quot; LEFT JOIN contacts ct ON m.from_id=ct.id&quot;</span></div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160; <span class="stringliteral">&quot; WHERE m.state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_FRESH) <span class="stringliteral">&quot; AND m.chat_id!=? AND ct.blocked=0&quot;</span></div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160; <span class="stringliteral">&quot; ORDER BY m.timestamp DESC,m.id DESC;&quot;</span>); <span class="comment">/* the list starts with the newest messages*/</span></div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160; sqlite3_bind_int(stmt, 1, show_deaddrop? 0 : MR_CHAT_ID_DEADDROP);</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)(uintptr_t)sqlite3_column_int(stmt, 0), NULL);</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160; }</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160; locked = 0;</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160; success = 1;</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;cleanup:</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160; }</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160; <span class="keywordflow">if</span>( success ) {</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160; }</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160; <span class="keywordflow">if</span>( ret ) {</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160; carray_free(ret);</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160; }</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160; <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160; }</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;}</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;</div><div class="line"><a name="l02120"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a5d3be6ed21d43cc93f250a1e7faf979b"> 2120</a></span>&#160;carray* <a class="code" href="structmrmailbox__t.html#a5d3be6ed21d43cc93f250a1e7faf979b">mrmailbox_get_chat_msgs</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, uint32_t flags, uint32_t marker1before)</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;{</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160; <span class="keywordtype">int</span> success = 0, locked = 0;</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160; carray* ret = carray_new(512);</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160; uint32_t curr_id;</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160; time_t curr_local_timestamp;</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160; <span class="keywordtype">int</span> curr_day, last_day = 0;</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160; <span class="keywordtype">long</span> cnv_to_local = mr_gm2local_offset();</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;<span class="preprocessor"> #define SECONDS_PER_DAY 86400</span></div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL || ret == NULL ) {</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160; }</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160; locked = 1;</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160; <span class="keywordflow">if</span>( chat_id == MR_CHAT_ID_STARRED )</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160; {</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_i_FROM_msgs_LEFT_JOIN_contacts_WHERE_starred,</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160; <span class="stringliteral">&quot;SELECT m.id, m.timestamp&quot;</span></div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160; <span class="stringliteral">&quot; FROM msgs m&quot;</span></div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160; <span class="stringliteral">&quot; LEFT JOIN contacts ct ON m.from_id=ct.id&quot;</span></div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160; <span class="stringliteral">&quot; WHERE m.starred=1 AND ct.blocked=0&quot;</span></div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160; <span class="stringliteral">&quot; ORDER BY m.timestamp,m.id;&quot;</span>); <span class="comment">/* the list starts with the oldest message*/</span></div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160; }</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160; {</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_i_FROM_msgs_LEFT_JOIN_contacts_WHERE_c,</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160; <span class="stringliteral">&quot;SELECT m.id, m.timestamp&quot;</span></div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160; <span class="stringliteral">&quot; FROM msgs m&quot;</span></div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160; <span class="stringliteral">&quot; LEFT JOIN contacts ct ON m.from_id=ct.id&quot;</span></div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160; <span class="stringliteral">&quot; WHERE m.chat_id=? AND ct.blocked=0&quot;</span></div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160; <span class="stringliteral">&quot; ORDER BY m.timestamp,m.id;&quot;</span>); <span class="comment">/* the list starts with the oldest message*/</span></div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160; }</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt) == SQLITE_ROW )</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160; {</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160; curr_id = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160; <span class="comment">/* add user marker */</span></div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160; <span class="keywordflow">if</span>( curr_id == marker1before ) {</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)MR_MSG_ID_MARKER1, NULL);</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160; }</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160; <span class="comment">/* add daymarker, if needed */</span></div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160; <span class="keywordflow">if</span>( flags&amp;MR_GCM_ADDDAYMARKER ) {</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160; curr_local_timestamp = (time_t)sqlite3_column_int64(stmt, 1) + cnv_to_local;</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160; curr_day = curr_local_timestamp/SECONDS_PER_DAY;</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160; <span class="keywordflow">if</span>( curr_day != last_day ) {</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)MR_MSG_ID_DAYMARKER, NULL);</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160; last_day = curr_day;</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160; }</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160; }</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)(uintptr_t)curr_id, NULL);</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160; }</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160; locked = 0;</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160; success = 1;</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;cleanup:</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160; }</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160; <span class="keywordflow">if</span>( success ) {</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160; }</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160; <span class="keywordflow">if</span>( ret ) {</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160; carray_free(ret);</div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160; }</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160; <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160; }</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;}</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;</div><div class="line"><a name="l02224"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a27cceecdc6b41f34d7dbf8b6d8dcf18d"> 2224</a></span>&#160;carray* <a class="code" href="structmrmailbox__t.html#a27cceecdc6b41f34d7dbf8b6d8dcf18d">mrmailbox_search_msgs</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <span class="keyword">const</span> <span class="keywordtype">char</span>* query)</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;{</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160; <span class="keywordtype">int</span> success = 0, locked = 0;</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160; carray* ret = carray_new(100);</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160; <span class="keywordtype">char</span>* strLikeInText = NULL, *strLikeBeg=NULL, *real_query = NULL;</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL || ret == NULL || query == NULL ) {</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160; }</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160; real_query = safe_strdup(query);</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160; mr_trim(real_query);</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160; <span class="keywordflow">if</span>( real_query[0]==0 ) {</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160; success = 1; <span class="comment">/*empty result*/</span></div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160; }</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;</div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160; strLikeInText = mr_mprintf(<span class="stringliteral">&quot;%%%s%%&quot;</span>, real_query);</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160; strLikeBeg = mr_mprintf(<span class="stringliteral">&quot;%s%%&quot;</span>, real_query); <span class="comment">/*for the name search, we use &quot;Name%&quot; which is fast as it can use the index (&quot;%Name%&quot; could not). */</span></div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160; locked = 1;</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160; <span class="comment">/* Incremental search with &quot;LIKE %query%&quot; cannot take advantages from any index</span></div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;<span class="comment"> (&quot;query%&quot; could for COLLATE NOCASE indexes, see http://www.sqlite.org/optoverview.html#like_opt )</span></div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;<span class="comment"> An alternative may be the FULLTEXT sqlite stuff, however, this does not really help with incremental search.</span></div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;<span class="comment"> An extra table with all words and a COLLATE NOCASE indexes may help, however,</span></div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;<span class="comment"> this must be updated all the time and probably consumes more time than we can save in tenthousands of searches.</span></div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;<span class="comment"> For now, we just expect the following query to be fast enough :-) */</span></div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;<span class="preprocessor"> #define QUR1 &quot;SELECT m.id, m.timestamp&quot; \</span></div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;<span class="preprocessor"> &quot; FROM msgs m&quot; \</span></div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;<span class="preprocessor"> &quot; LEFT JOIN contacts ct ON m.from_id=ct.id&quot; \</span></div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;<span class="preprocessor"> &quot; WHERE&quot;</span></div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;<span class="preprocessor"> #define QUR2 &quot; AND ct.blocked=0 AND (txt LIKE ? OR ct.name LIKE ?)&quot;</span></div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160; <span class="keywordflow">if</span>( chat_id ) {</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_i_FROM_msgs_WHERE_chat_id_AND_query,</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160; QUR1 <span class="stringliteral">&quot; m.chat_id=? &quot;</span> QUR2 <span class="stringliteral">&quot; ORDER BY m.timestamp,m.id;&quot;</span>); <span class="comment">/* chats starts with the oldest message*/</span></div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160; sqlite3_bind_int (stmt, 1, chat_id);</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160; sqlite3_bind_text(stmt, 2, strLikeInText, -1, SQLITE_STATIC);</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160; sqlite3_bind_text(stmt, 3, strLikeBeg, -1, SQLITE_STATIC);</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160; }</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160; <span class="keywordtype">int</span> show_deaddrop = 0;<span class="comment">//mrsqlite3_get_config_int__(mailbox-&gt;m_sql, &quot;show_deaddrop&quot;, 0);</span></div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_i_FROM_msgs_WHERE_query,</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160; QUR1 <span class="stringliteral">&quot; (m.chat_id&gt;? OR m.chat_id=?) &quot;</span> QUR2 <span class="stringliteral">&quot; ORDER BY m.timestamp DESC,m.id DESC;&quot;</span>); <span class="comment">/* chat overview starts with the newest message*/</span></div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160; sqlite3_bind_int (stmt, 1, MR_CHAT_ID_LAST_SPECIAL);</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160; sqlite3_bind_int (stmt, 2, show_deaddrop? MR_CHAT_ID_DEADDROP : MR_CHAT_ID_LAST_SPECIAL+1 <span class="comment">/*just any ID that is already selected*/</span>);</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160; sqlite3_bind_text(stmt, 3, strLikeInText, -1, SQLITE_STATIC);</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160; sqlite3_bind_text(stmt, 4, strLikeBeg, -1, SQLITE_STATIC);</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160; }</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)(uintptr_t)sqlite3_column_int(stmt, 0), NULL);</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160; }</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160; locked = 0;</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160;</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160; success = 1;</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160;</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160;cleanup:</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160; }</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160; free(strLikeInText);</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160; free(strLikeBeg);</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160; free(real_query);</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160; <span class="keywordflow">if</span>( success ) {</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160; }</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160; <span class="keywordflow">if</span>( ret ) {</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160; carray_free(ret);</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160; }</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160; <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160; }</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160;}</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> set_draft_int(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat, uint32_t chat_id, <span class="keyword">const</span> <span class="keywordtype">char</span>* msg)</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160;{</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat_to_delete = NULL;</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160;</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160; }</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160; <span class="keywordflow">if</span>( chat==NULL ) {</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160; <span class="keywordflow">if</span>( (chat=<a class="code" href="structmrmailbox__t.html#ad106b9c23b3a559b524a37bb5504e096">mrmailbox_get_chat</a>(mailbox, chat_id)) == NULL ) {</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160; }</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160; chat_to_delete = chat;</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160; }</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160;</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160; <span class="keywordflow">if</span>( msg &amp;&amp; msg[0]==0 ) {</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160; msg = NULL; <span class="comment">/* an empty draft is no draft */</span></div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160; }</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160;</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160; <span class="keywordflow">if</span>( chat-&gt;<a class="code" href="structmrchat__t.html#abe916f48ac83c2ca6476312eae084cfa">m_draft_text</a>==NULL &amp;&amp; msg==NULL</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160; &amp;&amp; chat-&gt;<a class="code" href="structmrchat__t.html#a565101f53278f5ab1ff58317ffc9555c">m_draft_timestamp</a>==0 ) {</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* nothing to do - there is no old and no new draft */</span></div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160; }</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160;</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160; <span class="keywordflow">if</span>( chat-&gt;<a class="code" href="structmrchat__t.html#a565101f53278f5ab1ff58317ffc9555c">m_draft_timestamp</a> &amp;&amp; chat-&gt;<a class="code" href="structmrchat__t.html#abe916f48ac83c2ca6476312eae084cfa">m_draft_text</a> &amp;&amp; msg &amp;&amp; strcmp(chat-&gt;<a class="code" href="structmrchat__t.html#abe916f48ac83c2ca6476312eae084cfa">m_draft_text</a>, msg)==0 ) {</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* for equal texts, we do not update the timestamp */</span></div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>&#160; }</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160; <span class="comment">/* save draft in object - NULL or empty: clear draft */</span></div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>&#160; free(chat-&gt;<a class="code" href="structmrchat__t.html#abe916f48ac83c2ca6476312eae084cfa">m_draft_text</a>);</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160; chat-&gt;<a class="code" href="structmrchat__t.html#abe916f48ac83c2ca6476312eae084cfa">m_draft_text</a> = msg? safe_strdup(msg) : NULL;</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160; chat-&gt;<a class="code" href="structmrchat__t.html#a565101f53278f5ab1ff58317ffc9555c">m_draft_timestamp</a> = msg? time(NULL) : 0;</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160;</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160; <span class="comment">/* save draft in database */</span></div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_chats_SET_draft_WHERE_id,</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160; <span class="stringliteral">&quot;UPDATE chats SET draft_timestamp=?, draft_txt=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160; sqlite3_bind_int64(stmt, 1, chat-&gt;<a class="code" href="structmrchat__t.html#a565101f53278f5ab1ff58317ffc9555c">m_draft_timestamp</a>);</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160; sqlite3_bind_text (stmt, 2, chat-&gt;<a class="code" href="structmrchat__t.html#abe916f48ac83c2ca6476312eae084cfa">m_draft_text</a>? chat-&gt;<a class="code" href="structmrchat__t.html#abe916f48ac83c2ca6476312eae084cfa">m_draft_text</a> : <span class="stringliteral">&quot;&quot;</span>, -1, SQLITE_STATIC); <span class="comment">/* SQLITE_STATIC: we promise the buffer to be valid until the query is done */</span></div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160; sqlite3_bind_int (stmt, 3, chat-&gt;m_id);</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, 0, 0);</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;cleanup:</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat_to_delete);</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;}</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160;</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;</div><div class="line"><a name="l02371"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#af50446c1a5e504d27fe29de9e3b8edc3"> 2371</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#af50446c1a5e504d27fe29de9e3b8edc3">mrmailbox_set_draft</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <span class="keyword">const</span> <span class="keywordtype">char</span>* msg)</div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;{</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160; set_draft_int(mailbox, NULL, chat_id, msg);</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160;}</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160;<span class="keywordtype">int</span> mrchat_set_draft(<a class="code" href="structmrchat__t.html">mrchat_t</a>* chat, <span class="keyword">const</span> <span class="keywordtype">char</span>* msg) <span class="comment">/* deprecated */</span></div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;{</div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160; set_draft_int(chat-&gt;<a class="code" href="structmrchat__t.html#abf3e1a34f567e168bc0597f9a544a50d">m_mailbox</a>, chat, chat-&gt;m_id, msg);</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160; <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;}</div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160;</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>&#160;</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160;</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;<span class="preprocessor">#define IS_SELF_IN_GROUP__ (mrmailbox_is_contact_in_chat__(mailbox, chat_id, MR_CONTACT_ID_SELF)==1)</span></div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;<span class="preprocessor">#define DO_SEND_STATUS_MAILS (mrparam_get_int(chat-&gt;m_param, MRP_UNPROMOTED, 0)==0)</span></div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;<span class="keywordtype">int</span> mrmailbox_get_fresh_msg_count__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>&#160;{</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_msgs_WHERE_state_AND_chat_id,</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM msgs WHERE state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_FRESH) <span class="stringliteral">&quot; AND chat_id=?;&quot;</span>); <span class="comment">/* we have an index over the state-column, this should be sufficient as there are typically only few fresh messages */</span></div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>&#160; }</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>&#160;</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;}</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;uint32_t mrmailbox_get_last_deaddrop_fresh_msg__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;{</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160;</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_msgs_WHERE_fresh_AND_deaddrop,</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160; <span class="stringliteral">&quot;SELECT id FROM msgs WHERE state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_FRESH) <span class="stringliteral">&quot; AND chat_id=&quot;</span> MR_STRINGIFY(MR_CHAT_ID_DEADDROP) <span class="stringliteral">&quot; ORDER BY timestamp DESC, id DESC;&quot;</span>); <span class="comment">/* we have an index over the state-column, this should be sufficient as there are typically only few fresh messages */</span></div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160; }</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;}</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;<span class="keywordtype">int</span> mrmailbox_get_total_msg_count__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;{</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160;</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_msgs_WHERE_chat_id,</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM msgs WHERE chat_id=?;&quot;</span>);</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160; }</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;}</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160;</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;<span class="keywordtype">size_t</span> mrmailbox_get_chat_cnt__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;{</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || mailbox-&gt;m_sql-&gt;m_cobj==NULL ) {</div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160; <span class="keywordflow">return</span> 0; <span class="comment">/* no database, no chats - this is no error (needed eg. for information) */</span></div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160; }</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_chats, <span class="stringliteral">&quot;SELECT COUNT(*) FROM chats WHERE id&gt;?;&quot;</span>);</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160; sqlite3_bind_int(stmt, 1, MR_CHAT_ID_LAST_SPECIAL);</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160;</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>&#160; }</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>&#160;</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160;}</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160;</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160;uint32_t mrmailbox_lookup_real_nchat_by_contact_id__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id) <span class="comment">/* checks for &quot;real&quot; chats (non-trash, non-unknown) */</span></div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160;{</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160; uint32_t chat_id = 0;</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || mailbox-&gt;m_sql-&gt;m_cobj==NULL ) {</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160; <span class="keywordflow">return</span> 0; <span class="comment">/* no database, no chats - this is no error (needed eg. for information) */</span></div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160; }</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_chats_WHERE_contact_id,</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160; <span class="stringliteral">&quot;SELECT c.id&quot;</span></div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160; <span class="stringliteral">&quot; FROM chats c&quot;</span></div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160; <span class="stringliteral">&quot; INNER JOIN chats_contacts j ON c.id=j.chat_id&quot;</span></div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160; <span class="stringliteral">&quot; WHERE c.type=? AND c.id&gt;? AND j.contact_id=?;&quot;</span>);</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160; sqlite3_bind_int(stmt, 1, MR_CHAT_TYPE_NORMAL);</div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160; sqlite3_bind_int(stmt, 2, MR_CHAT_ID_LAST_SPECIAL);</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160; sqlite3_bind_int(stmt, 3, contact_id);</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160; chat_id = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160; }</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160; <span class="keywordflow">return</span> chat_id;</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>&#160;}</div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>&#160;</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160;</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160;uint32_t mrmailbox_create_or_lookup_nchat_by_contact_id__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160;{</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160; uint32_t chat_id = 0;</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* contact = NULL;</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160; <span class="keywordtype">char</span>* chat_name;</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160; <span class="keywordtype">char</span>* q = NULL;</div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;</div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || mailbox-&gt;m_sql-&gt;m_cobj==NULL ) {</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160; <span class="keywordflow">return</span> 0; <span class="comment">/* database not opened - error */</span></div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160; }</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160;</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160; <span class="keywordflow">if</span>( contact_id == 0 ) {</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>&#160; }</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>&#160;</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>&#160; <span class="keywordflow">if</span>( (chat_id=mrmailbox_lookup_real_nchat_by_contact_id__(mailbox, contact_id)) != 0 ) {</div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160; <span class="keywordflow">return</span> chat_id; <span class="comment">/* soon success */</span></div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160; }</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>&#160;</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>&#160; <span class="comment">/* get fine chat name */</span></div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>&#160; contact = <a class="code" href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_new</a>(mailbox);</div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160; <span class="keywordflow">if</span>( !mrcontact_load_from_db__(contact, mailbox-&gt;m_sql, contact_id) ) {</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160; }</div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160;</div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160; chat_name = (contact-&gt;<a class="code" href="structmrcontact__t.html#a48fba862b41f7da3b8c6193c0554654b">m_name</a>&amp;&amp;contact-&gt;<a class="code" href="structmrcontact__t.html#a48fba862b41f7da3b8c6193c0554654b">m_name</a>[0])? contact-&gt;<a class="code" href="structmrcontact__t.html#a48fba862b41f7da3b8c6193c0554654b">m_name</a> : contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>;</div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>&#160;</div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>&#160; <span class="comment">/* create chat record */</span></div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160; q = sqlite3_mprintf(<span class="stringliteral">&quot;INSERT INTO chats (type, name) VALUES(%i, %Q)&quot;</span>, MR_CHAT_TYPE_NORMAL, chat_name);</div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, q);</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160; <span class="keywordflow">if</span>( stmt == NULL) {</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160; }</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_DONE ) {</div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160; }</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160;</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160; chat_id = sqlite3_last_insert_rowid(mailbox-&gt;m_sql-&gt;m_cobj);</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160; sqlite3_free(q);</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160; q = NULL;</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160; stmt = NULL;</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160; <span class="comment">/* add contact IDs to the new chat record (may be replaced by mrmailbox_add_contact_to_chat__()) */</span></div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160; q = sqlite3_mprintf(<span class="stringliteral">&quot;INSERT INTO chats_contacts (chat_id, contact_id) VALUES(%i, %i)&quot;</span>, chat_id, contact_id);</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, q);</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_DONE ) {</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160; }</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160; sqlite3_free(q);</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160; q = NULL;</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160; stmt = NULL;</div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;</div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160; <span class="comment">/* add already existing messages to the chat record */</span></div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160; q = sqlite3_mprintf(<span class="stringliteral">&quot;UPDATE msgs SET chat_id=%i WHERE (chat_id=%i AND from_id=%i) OR (chat_id=%i AND to_id=%i);&quot;</span>,</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160; chat_id,</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160; MR_CHAT_ID_DEADDROP, contact_id,</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160; MR_CHAT_ID_TO_DEADDROP, contact_id);</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, q);</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;</div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_DONE ) {</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160; }</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160; <span class="comment">/* cleanup */</span></div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;cleanup:</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160; <span class="keywordflow">if</span>( q ) {</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160; sqlite3_free(q);</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160; }</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160; <span class="keywordflow">if</span>( stmt ) {</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160; }</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;</div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160; <span class="keywordflow">if</span>( contact ) {</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(contact);</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160; }</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160; <span class="keywordflow">return</span> chat_id;</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;}</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;</div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160;<span class="keywordtype">void</span> mrmailbox_unarchive_chat__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;{</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_chats_SET_unarchived, <span class="stringliteral">&quot;UPDATE chats SET archived=0 WHERE id=?&quot;</span>);</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160; sqlite3_bind_int (stmt, 1, chat_id);</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;}</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160;</div><div class="line"><a name="l02588"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a5c17b77d9d26022f0bdbef548d37b5c6"> 2588</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a5c17b77d9d26022f0bdbef548d37b5c6">mrmailbox_get_total_msg_count</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;{</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160; <span class="keywordtype">int</span> ret;</div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>&#160; }</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160; ret = mrmailbox_get_total_msg_count__(mailbox, chat_id);</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>&#160;}</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>&#160;</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;</div><div class="line"><a name="l02616"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#adcdfd1e0899d3c9778238d49933813a5"> 2616</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#adcdfd1e0899d3c9778238d49933813a5">mrmailbox_get_fresh_msg_count</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;{</div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160; <span class="keywordtype">int</span> ret;</div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160; }</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>&#160; ret = mrmailbox_get_fresh_msg_count__(mailbox, chat_id);</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;}</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>&#160;</div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160;</div><div class="line"><a name="l02652"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a8e04e43dacbe3128afd71e1d6c1b0911"> 2652</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a8e04e43dacbe3128afd71e1d6c1b0911">mrmailbox_archive_chat</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <span class="keywordtype">int</span> archive)</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>&#160;{</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || chat_id &lt;= MR_CHAT_ID_LAST_SPECIAL || (archive!=0 &amp;&amp; archive!=1) ) {</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>&#160; }</div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>&#160;</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160; sqlite3_stmt* stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, <span class="stringliteral">&quot;UPDATE chats SET archived=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>&#160; sqlite3_bind_int (stmt, 1, archive);</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160; sqlite3_bind_int (stmt, 2, chat_id);</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>&#160;}</div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>&#160;</div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;<span class="comment"> * Delete a chat</span></div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>&#160;</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;<span class="comment">/* _If_ deleting a group chat would implies to leave the group, things get complicated</span></div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160;<span class="comment">as this would require to send a message before the chat is deleted physically.</span></div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>&#160;<span class="comment">To make things even more complicated, there may be other chat messages waiting to be send.</span></div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>&#160;<span class="comment">We used the following approach:</span></div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>&#160;<span class="comment">1. If we do not need to send a message, we delete the chat directly</span></div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>&#160;<span class="comment">2. If we need to send a message, we set chats.blocked=1 and add the parameter</span></div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;<span class="comment"> MRP_DEL_AFTER_SEND with a random value to both, the last message to be send and to the</span></div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>&#160;<span class="comment"> chat (we would use msg_id, however, we may not get this in time)</span></div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>&#160;<span class="comment">3. When the messag with the MRP_DEL_AFTER_SEND-value of the chat was send to IMAP, we physically</span></div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>&#160;<span class="comment"> delete the chat.</span></div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>&#160;<span class="comment">However, from 2017-11-02, we do not implicitly leave the group as this results in different behaviours to normal</span></div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>&#160;<span class="comment">chat and _only_ leaving a group is also a valid usecase. */</span></div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>&#160;</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>&#160;</div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>&#160;<span class="keywordtype">int</span> mrmailbox_delete_chat_part2(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>&#160;{</div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>&#160; <span class="keywordtype">int</span> success = 0, locked = 0, pending_transaction = 0;</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* obj = mrchat_new(mailbox);</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>&#160; <span class="keywordtype">char</span>* q3 = NULL;</div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>&#160;</div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160; locked = 1;</div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>&#160;</div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>&#160; <span class="keywordflow">if</span>( !mrchat_load_from_db__(obj, chat_id) ) {</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160; }</div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>&#160;</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>&#160; pending_transaction = 1;</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>&#160;</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>&#160; q3 = sqlite3_mprintf(<span class="stringliteral">&quot;DELETE FROM msgs WHERE chat_id=%i;&quot;</span>, chat_id);</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>&#160; <span class="keywordflow">if</span>( !mrsqlite3_execute__(mailbox-&gt;m_sql, q3) ) {</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160; }</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160; sqlite3_free(q3);</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>&#160; q3 = NULL;</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>&#160;</div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>&#160; q3 = sqlite3_mprintf(<span class="stringliteral">&quot;DELETE FROM chats_contacts WHERE chat_id=%i;&quot;</span>, chat_id);</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>&#160; <span class="keywordflow">if</span>( !mrsqlite3_execute__(mailbox-&gt;m_sql, q3) ) {</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>&#160; }</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>&#160; sqlite3_free(q3);</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>&#160; q3 = NULL;</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>&#160;</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>&#160; q3 = sqlite3_mprintf(<span class="stringliteral">&quot;DELETE FROM chats WHERE id=%i;&quot;</span>, chat_id);</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>&#160; <span class="keywordflow">if</span>( !mrsqlite3_execute__(mailbox-&gt;m_sql, q3) ) {</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>&#160; }</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>&#160; sqlite3_free(q3);</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>&#160; q3 = NULL;</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160; pending_transaction = 0;</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>&#160; locked = 0;</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>&#160;</div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>&#160; success = 1;</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160;</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>&#160;cleanup:</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160; <span class="keywordflow">if</span>( pending_transaction ) { mrsqlite3_rollback__(mailbox-&gt;m_sql); }</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(obj);</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>&#160; <span class="keywordflow">if</span>( q3 ) { sqlite3_free(q3); }</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>&#160; <span class="keywordflow">return</span> success;</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>&#160;}</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>&#160;</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>&#160;</div><div class="line"><a name="l02773"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a24813f8aea38bcf5f928ea8a5fd7a3ec"> 2773</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a24813f8aea38bcf5f928ea8a5fd7a3ec">mrmailbox_delete_chat</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>&#160;{</div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat = <a class="code" href="structmrmailbox__t.html#ad106b9c23b3a559b524a37bb5504e096">mrmailbox_get_chat</a>(mailbox, chat_id);</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* contact = NULL;</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>&#160;</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || chat_id &lt;= MR_CHAT_ID_LAST_SPECIAL || chat == NULL ) {</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>&#160; }</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>&#160;</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>&#160;<span class="preprocessor"> #ifdef GROUP_DELETE_IMPLIES_LEAVING</span></div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>&#160; <span class="keywordflow">if</span>( chat-&gt;m_type == MR_CHAT_TYPE_GROUP</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160; &amp;&amp; <a class="code" href="structmrmailbox__t.html#ae37988665a3d46f42a7e8199d18735c2">mrmailbox_is_contact_in_chat</a>(mailbox, chat_id, MR_CONTACT_ID_SELF)</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160; &amp;&amp; DO_SEND_STATUS_MAILS )</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160; {</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160; <span class="comment">/* _first_ mark chat to being delete and _then_ send the message to inform others that we&#39;ve quit the group</span></div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;<span class="comment"> (the order is important - otherwise the message may be send asynchronous before we update the group. */</span></div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160; <span class="keywordtype">int</span> link_msg_to_chat_deletion = (int)time(NULL);</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>&#160;</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(chat-&gt;<a class="code" href="structmrchat__t.html#ad2792ee7df778521de61087bc79795a7">m_param</a>, MRP_DEL_AFTER_SEND, link_msg_to_chat_deletion);</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160; sqlite3_stmt* stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, <span class="stringliteral">&quot;UPDATE chats SET blocked=1, param=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160; sqlite3_bind_text (stmt, 1, chat-&gt;<a class="code" href="structmrchat__t.html#ad2792ee7df778521de61087bc79795a7">m_param</a>-&gt;m_packed, -1, SQLITE_STATIC);</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>&#160; sqlite3_bind_int (stmt, 2, chat_id);</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>&#160; mrmailbox_set_group_explicitly_left__(mailbox, chat-&gt;m_grpid);</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>&#160;</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160; contact = <a class="code" href="structmrmailbox__t.html#a057660d94350ff98eca72785c6e88962">mrmailbox_get_contact</a>(mailbox, MR_CONTACT_ID_SELF);</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> = MR_MSG_TEXT;</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mrstock_str(MR_STR_MSGGROUPLEFT);</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD, MR_SYSTEM_MEMBER_REMOVED_FROM_GROUP);</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a> (msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD_PARAM, contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>);</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_DEL_AFTER_SEND, link_msg_to_chat_deletion);</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>&#160; <a class="code" href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c">mrmailbox_send_msg</a>(mailbox, chat-&gt;m_id, msg);</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>&#160; }</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;<span class="preprocessor"> #endif</span></div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>&#160; {</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160; <span class="comment">/* directly delete the chat */</span></div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160; mrmailbox_delete_chat_part2(mailbox, chat_id);</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160; }</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>&#160;</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, 0, 0);</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>&#160;</div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>&#160;cleanup:</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat);</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(contact);</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160;}</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>&#160;</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>&#160;</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>&#160;<span class="comment"> * Sending messages</span></div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;<span class="keywordtype">void</span> mrmailbox_send_msg_to_imap(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, mrjob_t* job)</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;{</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160; mrmimefactory_t mimefactory;</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160; <span class="keywordtype">char</span>* server_folder = NULL;</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160; uint32_t server_uid = 0;</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>&#160;</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160; mrmimefactory_init(&amp;mimefactory, mailbox);</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>&#160;</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160; <span class="comment">/* connect to IMAP-server */</span></div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160; <span class="keywordflow">if</span>( !mrimap_is_connected(mailbox-&gt;m_imap) ) {</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>&#160; mrmailbox_connect_to_imap(mailbox, NULL);</div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>&#160; <span class="keywordflow">if</span>( !mrimap_is_connected(mailbox-&gt;m_imap) ) {</div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160; }</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160; }</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160; <span class="comment">/* create message */</span></div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>&#160; <span class="keywordflow">if</span>( mrmimefactory_load_msg(&amp;mimefactory, job-&gt;m_foreign_id)==0</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>&#160; || mimefactory.m_from_addr == NULL ) {</div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* should not happen as we&#39;ve send the message to the SMTP server before */</span></div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160; }</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160; <span class="keywordflow">if</span>( !mrmimefactory_render(&amp;mimefactory, 1<span class="comment">/*encrypt to self*/</span>) ) {</div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* should not happen as we&#39;ve send the message to the SMTP server before */</span></div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>&#160; }</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>&#160;</div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>&#160; <span class="keywordflow">if</span>( !mrimap_append_msg(mailbox-&gt;m_imap, mimefactory.m_msg-&gt;m_timestamp, mimefactory.m_out-&gt;str, mimefactory.m_out-&gt;len, &amp;server_folder, &amp;server_uid) ) {</div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>&#160; }</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>&#160; mrmailbox_update_server_uid__(mailbox, mimefactory.m_msg-&gt;m_rfc724_mid, server_folder, server_uid);</div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160; }</div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;</div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160; <span class="comment">/* check, if the chat shall be deleted pysically */</span></div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;<span class="preprocessor"> #ifdef GROUP_DELETE_IMPLIES_LEAVING</span></div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160; <span class="keywordflow">if</span>( <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(mimefactory.m_chat-&gt;m_param, MRP_DEL_AFTER_SEND, 0)!=0</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160; &amp;&amp; <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(mimefactory.m_chat-&gt;m_param, MRP_DEL_AFTER_SEND, 0)==<a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(mimefactory.m_msg-&gt;m_param, MRP_DEL_AFTER_SEND, 0) ) {</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160; mrmailbox_delete_chat_part2(mailbox, mimefactory.m_chat-&gt;m_id);</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160; }</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;<span class="preprocessor"> #endif</span></div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;cleanup:</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>&#160; mrmimefactory_empty(&amp;mimefactory);</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160; free(server_folder);</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;}</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;</div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> mark_as_error(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg)</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;{</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL || msg==NULL ) {</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160; }</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160; mrmailbox_update_msg_state__(mailbox, msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>, MR_STATE_OUT_ERROR);</div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, msg-&gt;<a class="code" href="structmrmsg__t.html#ac19bdc40e452c8997dd58474a7be6880">m_chat_id</a>, 0);</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;}</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>&#160;</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;<span class="keywordtype">void</span> mrmailbox_send_msg_to_smtp(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, mrjob_t* job)</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;{</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>&#160; mrmimefactory_t mimefactory;</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>&#160;</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>&#160; mrmimefactory_init(&amp;mimefactory, mailbox);</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>&#160;</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160; <span class="comment">/* connect to SMTP server, if not yet done */</span></div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160; <span class="keywordflow">if</span>( !mrsmtp_is_connected(mailbox-&gt;m_smtp) ) {</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160; mrloginparam_t* loginparam = mrloginparam_new();</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160; mrloginparam_read__(loginparam, mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured_&quot;</span>);</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>&#160; <span class="keywordtype">int</span> connected = mrsmtp_connect(mailbox-&gt;m_smtp, loginparam);</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>&#160; mrloginparam_unref(loginparam);</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160; <span class="keywordflow">if</span>( !connected ) {</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160; }</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160; }</div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>&#160;</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>&#160; <span class="comment">/* load message data */</span></div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160; <span class="keywordflow">if</span>( !mrmimefactory_load_msg(&amp;mimefactory, job-&gt;m_foreign_id)</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160; || mimefactory.m_from_addr == NULL ) {</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160; mrmailbox_log_warning(mailbox, 0, <span class="stringliteral">&quot;Cannot load data to send, maybe the message is deleted in between.&quot;</span>);</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* no redo, no IMAP - there won&#39;t be more recipients next time (as the data does not exist, there is no need in calling mark_as_error()) */</span></div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160; }</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>&#160; <span class="comment">/* check if the message is ready (normally, only video files may be delayed this way) */</span></div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160; <span class="keywordflow">if</span>( mimefactory.m_increation ) {</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160; mrmailbox_log_info(mailbox, 0, <span class="stringliteral">&quot;File is in creation, retrying later.&quot;</span>);</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>&#160; mrjob_try_again_later(job, MR_INCREATION_POLL);</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>&#160; }</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>&#160;</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>&#160; <span class="comment">/* send message - it&#39;s okay if there are not recipients, this is a group with only OURSELF; we only upload to IMAP in this case */</span></div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160; <span class="keywordflow">if</span>( clist_count(mimefactory.m_recipients_addr) &gt; 0 ) {</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160; <span class="keywordflow">if</span>( !mrmimefactory_render(&amp;mimefactory, 0<span class="comment">/*encrypt_to_self*/</span>) ) {</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>&#160; mark_as_error(mailbox, mimefactory.m_msg);</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>&#160; mrmailbox_log_error(mailbox, 0, <span class="stringliteral">&quot;Empty message.&quot;</span>); <span class="comment">/* should not happen */</span></div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* no redo, no IMAP - there won&#39;t be more recipients next time. */</span></div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>&#160; }</div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>&#160;</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>&#160; <span class="comment">/* have we guaranteed encryption but cannot fullfill it for any reason? Do not send the message then.*/</span></div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>&#160; <span class="keywordflow">if</span>( <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(mimefactory.m_msg-&gt;m_param, MRP_GUARANTEE_E2EE, 0) &amp;&amp; !mimefactory.m_out_encrypted ) {</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160; mark_as_error(mailbox, mimefactory.m_msg);</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>&#160; mrmailbox_log_error(mailbox, 0, <span class="stringliteral">&quot;End-to-end-encryption unavailable unexpectedly.&quot;</span>);</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* unrecoverable */</span></div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>&#160; }</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>&#160;</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160; <span class="keywordflow">if</span>( !mrsmtp_send_msg(mailbox-&gt;m_smtp, mimefactory.m_recipients_addr, mimefactory.m_out-&gt;str, mimefactory.m_out-&gt;len) ) {</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160; mrsmtp_disconnect(mailbox-&gt;m_smtp);</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160; mrjob_try_again_later(job, MR_AT_ONCE); <span class="comment">/* MR_AT_ONCE is only the _initial_ delay, if the second try failes, the delay gets larger */</span></div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160; }</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160; }</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>&#160; <span class="comment">/* done */</span></div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160; <span class="comment">/* debug print? */</span></div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160; <span class="keywordflow">if</span>( mrsqlite3_get_config_int__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;save_eml&quot;</span>, 0) ) {</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160; <span class="keywordtype">char</span>* emlname = mr_mprintf(<span class="stringliteral">&quot;%s/to-smtp-%i.eml&quot;</span>, mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>, (<span class="keywordtype">int</span>)mimefactory.m_msg-&gt;m_id);</div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160; FILE* emlfileob = fopen(emlname, <span class="stringliteral">&quot;w&quot;</span>);</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160; <span class="keywordflow">if</span>( emlfileob ) {</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160; fwrite(mimefactory.m_out-&gt;str, 1, mimefactory.m_out-&gt;len, emlfileob);</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>&#160; fclose(emlfileob);</div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160; }</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160; free(emlname);</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160; }</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160; mrmailbox_update_msg_state__(mailbox, mimefactory.m_msg-&gt;m_id, MR_STATE_OUT_DELIVERED);</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160; <span class="keywordflow">if</span>( mimefactory.m_out_encrypted &amp;&amp; <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(mimefactory.m_msg-&gt;m_param, MRP_GUARANTEE_E2EE, 0)==0 ) {</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(mimefactory.m_msg-&gt;m_param, MRP_GUARANTEE_E2EE, 1); <span class="comment">/* can upgrade to E2EE - fine! */</span></div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160; mrmsg_save_param_to_disk__(mimefactory.m_msg);</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>&#160; }</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>&#160;</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160; <span class="keywordflow">if</span>( (mailbox-&gt;m_imap-&gt;m_server_flags&amp;MR_NO_EXTRA_IMAP_UPLOAD)==0 ) {</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>&#160; mrjob_add__(mailbox, MRJ_SEND_MSG_TO_IMAP, mimefactory.m_msg-&gt;m_id, NULL); <span class="comment">/* send message to IMAP in another job */</span></div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160; }</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSG_DELIVERED, mimefactory.m_msg-&gt;m_chat_id, mimefactory.m_msg-&gt;m_id);</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;cleanup:</div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160; mrmimefactory_empty(&amp;mimefactory);</div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;}</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;</div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>&#160;uint32_t mrmailbox_send_msg_i__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat, <span class="keyword">const</span> <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg, time_t timestamp)</div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>&#160;{</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>&#160; <span class="keywordtype">char</span>* rfc724_mid = NULL;</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160; uint32_t msg_id = 0, to_id = 0;</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160; <span class="keywordflow">if</span>( chat-&gt;m_type==MR_CHAT_TYPE_GROUP &amp;&amp; !mrmailbox_is_contact_in_chat__(mailbox, chat-&gt;m_id, MR_CONTACT_ID_SELF) ) {</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160; mrmailbox_log_error(mailbox, MR_ERR_SELF_NOT_IN_GROUP, NULL);</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160; }</div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>&#160;</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>&#160; {</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>&#160; <span class="keywordtype">char</span>* from = mrsqlite3_get_config__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured_addr&quot;</span>, NULL);</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>&#160; <span class="keywordflow">if</span>( from == NULL ) { <span class="keywordflow">goto</span> cleanup; }</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>&#160; rfc724_mid = mr_create_outgoing_rfc724_mid(chat-&gt;m_type==MR_CHAT_TYPE_GROUP? chat-&gt;m_grpid : NULL, from);</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160; free(from);</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160; }</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160; <span class="keywordflow">if</span>( chat-&gt;m_type == MR_CHAT_TYPE_NORMAL )</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160; {</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_c_FROM_chats_contacts_WHERE_c,</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>&#160; <span class="stringliteral">&quot;SELECT contact_id FROM chats_contacts WHERE chat_id=?;&quot;</span>);</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>&#160; sqlite3_bind_int(stmt, 1, chat-&gt;m_id);</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>&#160; }</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>&#160; to_id = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160; }</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( chat-&gt;m_type == MR_CHAT_TYPE_GROUP )</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160; {</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>&#160; <span class="keywordflow">if</span>( <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(chat-&gt;<a class="code" href="structmrchat__t.html#ad2792ee7df778521de61087bc79795a7">m_param</a>, MRP_UNPROMOTED, 0)==1 ) {</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>&#160; <span class="comment">/* mark group as being no longer unpromoted */</span></div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a>(chat-&gt;<a class="code" href="structmrchat__t.html#ad2792ee7df778521de61087bc79795a7">m_param</a>, MRP_UNPROMOTED, NULL);</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>&#160; mrchat_update_param__(chat);</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>&#160; }</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160; }</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160;</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160; <span class="comment">/* check if we can guarantee E2EE for this message. If we can, we won&#39;t send the message without E2EE later (because of a reset, changed settings etc. - messages may be delayed significally if there is no network present) */</span></div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>&#160; <span class="keywordtype">int</span> can_guarantee_e2ee = 0;</div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>&#160; <span class="keywordflow">if</span>( mailbox-&gt;m_e2ee_enabled ) {</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160; can_guarantee_e2ee = 1;</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_p_FROM_chats_contacs_JOIN_contacts_peerstates_WHERE_cc,</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>&#160; <span class="stringliteral">&quot;SELECT ps.prefer_encrypted &quot;</span></div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160; <span class="stringliteral">&quot; FROM chats_contacts cc &quot;</span></div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160; <span class="stringliteral">&quot; LEFT JOIN contacts c ON cc.contact_id=c.id &quot;</span></div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160; <span class="stringliteral">&quot; LEFT JOIN acpeerstates ps ON c.addr=ps.addr &quot;</span></div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160; <span class="stringliteral">&quot; WHERE cc.chat_id=? AND cc.contact_id&gt;?;&quot;</span>);</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160; sqlite3_bind_int(stmt, 1, chat-&gt;m_id);</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160; sqlite3_bind_int(stmt, 2, MR_CONTACT_ID_LAST_SPECIAL);</div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt) == SQLITE_ROW )</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160; {</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160; <span class="keywordtype">int</span> prefer_encrypted = sqlite3_column_type(stmt, 0)==SQLITE_NULL? MRA_PE_NOPREFERENCE : sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160; <span class="keywordflow">if</span>( prefer_encrypted != MRA_PE_MUTUAL ) { <span class="comment">/* when gossip becomes available, gossip keys should be used only in groups */</span></div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160; can_guarantee_e2ee = 0;</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160; }</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160; }</div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160; }</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>&#160;</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160; <span class="keywordflow">if</span>( can_guarantee_e2ee ) {</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_GUARANTEE_E2EE, 1);</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160; }</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160; <span class="comment">/* if we cannot guarantee E2EE, clear the flag (may be set if the message was loaded from the database, eg. for forwarding messages ) */</span></div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_GUARANTEE_E2EE, NULL);</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160; }</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_ERRONEOUS_E2EE, NULL); <span class="comment">/* reset eg. on forwarding */</span></div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160; <span class="comment">/* add message to the database */</span></div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, INSERT_INTO_msgs_mcftttstpb,</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160; <span class="stringliteral">&quot;INSERT INTO msgs (rfc724_mid,chat_id,from_id,to_id, timestamp,type,state, txt,param) VALUES (?,?,?,?, ?,?,?, ?,?);&quot;</span>);</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160; sqlite3_bind_text (stmt, 1, rfc724_mid, -1, SQLITE_STATIC);</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160; sqlite3_bind_int (stmt, 2, MR_CHAT_ID_MSGS_IN_CREATION);</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160; sqlite3_bind_int (stmt, 3, MR_CONTACT_ID_SELF);</div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>&#160; sqlite3_bind_int (stmt, 4, to_id);</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160; sqlite3_bind_int64(stmt, 5, timestamp);</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160; sqlite3_bind_int (stmt, 6, msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>);</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160; sqlite3_bind_int (stmt, 7, MR_STATE_OUT_PENDING);</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160; sqlite3_bind_text (stmt, 8, msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a>? msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> : <span class="stringliteral">&quot;&quot;</span>, -1, SQLITE_STATIC);</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160; sqlite3_bind_text (stmt, 9, msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>-&gt;m_packed, -1, SQLITE_STATIC);</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_DONE ) {</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160; }</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>&#160; msg_id = sqlite3_last_insert_rowid(mailbox-&gt;m_sql-&gt;m_cobj);</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>&#160;</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>&#160; <span class="comment">/* finalize message object on database, we set the chat ID late as we don&#39;t know it sooner */</span></div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160; mrmailbox_update_msg_chat_id__(mailbox, msg_id, chat-&gt;m_id);</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>&#160; mrjob_add__(mailbox, MRJ_SEND_MSG_TO_SMTP, msg_id, NULL); <span class="comment">/* resuts on an asynchronous call to mrmailbox_send_msg_to_smtp() */</span></div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;cleanup:</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>&#160; free(rfc724_mid);</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160; <span class="keywordflow">return</span> msg_id;</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;}</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;</div><div class="line"><a name="l03101"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a3f9ac5fb9ff2dcbaafdddb5d955ac39b"> 3101</a></span>&#160;uint32_t <a class="code" href="structmrmailbox__t.html#a3f9ac5fb9ff2dcbaafdddb5d955ac39b">mrmailbox_send_text_msg</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <span class="keyword">const</span> <span class="keywordtype">char</span>* text_to_send)</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;{</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160; uint32_t ret = 0;</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>&#160;</div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || chat_id &lt;= MR_CHAT_ID_LAST_SPECIAL || text_to_send == NULL ) {</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160; }</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> = MR_MSG_TEXT;</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160; <a class="code" href="structmrmsg__t.html#ae940aa79a261e1a427b12baefbee2d23">mrmsg_set_text</a>(msg, text_to_send);</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160; ret = <a class="code" href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c">mrmailbox_send_msg</a>(mailbox, chat_id, msg);</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;cleanup:</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;}</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;</div><div class="line"><a name="l03142"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c"> 3142</a></span>&#160;uint32_t <a class="code" href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c">mrmailbox_send_msg</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg)</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;{</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160; <span class="keywordtype">char</span>* pathNfilename = NULL;</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>&#160;</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || msg == NULL || chat_id &lt;= MR_CHAT_ID_LAST_SPECIAL ) {</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160; }</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a> = 0;</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160; msg-&gt;m_mailbox = mailbox;</div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160; <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> == MR_MSG_TEXT )</div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160; {</div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160; ; <span class="comment">/* the caller should check if the message text is empty */</span></div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160; }</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( MR_MSG_NEEDS_ATTACHMENT(msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>) )</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160; {</div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160; pathNfilename = <a class="code" href="structmrparam__t.html#a23e24e8700e17ede6dd385fc90330f76">mrparam_get</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_FILE, NULL);</div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160; <span class="keywordflow">if</span>( pathNfilename )</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160; {</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160; <span class="comment">/* Got an attachment. Take care, the file may not be ready in this moment!</span></div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;<span class="comment"> This is useful eg. if a video should be sended and already shown as &quot;being processed&quot; in the chat.</span></div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;<span class="comment"> In this case, the user should create an `.increation`; when the file is deleted later on, the message is sended.</span></div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;<span class="comment"> (we do not use a state in the database as this would make eg. forwarding such messages much more complicated) */</span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160; <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> == MR_MSG_FILE || msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> == MR_MSG_IMAGE )</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160; {</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160; <span class="comment">/* Correct the type, take care not to correct already very special formats as GIF or VOICE.</span></div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;<span class="comment"> Typical conversions:</span></div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;<span class="comment"> - from FILE to AUDIO/VIDEO/IMAGE</span></div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;<span class="comment"> - from FILE/IMAGE to GIF */</span></div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160; <span class="keywordtype">int</span> better_type = 0;</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160; <span class="keywordtype">char</span>* better_mime = NULL;</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160; mrmsg_guess_msgtype_from_suffix(pathNfilename, &amp;better_type, &amp;better_mime);</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>&#160; <span class="keywordflow">if</span>( better_type ) {</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> = better_type;</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_MIMETYPE, better_mime);</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160; }</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160; free(better_mime);</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160; }</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>&#160;</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160; <span class="keywordflow">if</span>( (msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> == MR_MSG_IMAGE || msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> == MR_MSG_GIF)</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160; &amp;&amp; (<a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_WIDTH, 0)&lt;=0 || <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_HEIGHT, 0)&lt;=0) ) {</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160; <span class="comment">/* set width/height of images, if not yet done */</span></div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buf = NULL; <span class="keywordtype">size_t</span> buf_bytes; uint32_t w, h;</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160; <span class="keywordflow">if</span>( mr_read_file(pathNfilename, (<span class="keywordtype">void</span>**)&amp;buf, &amp;buf_bytes, msg-&gt;m_mailbox) ) {</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160; <span class="keywordflow">if</span>( mr_get_filemeta(buf, buf_bytes, &amp;w, &amp;h) ) {</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_WIDTH, w);</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_HEIGHT, h);</div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160; }</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160; }</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160; free(buf);</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160; }</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160; mrmailbox_log_info(mailbox, 0, <span class="stringliteral">&quot;Attaching \&quot;%s\&quot; for message type #%i.&quot;</span>, pathNfilename, (<span class="keywordtype">int</span>)msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>);</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;</div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>&#160; <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> ) { free(msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a>); }</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160; <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> == MR_MSG_AUDIO ) {</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160; <span class="keywordtype">char</span>* filename = mr_get_filename(pathNfilename);</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160; <span class="keywordtype">char</span>* author = <a class="code" href="structmrparam__t.html#a23e24e8700e17ede6dd385fc90330f76">mrparam_get</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_AUTHORNAME, <span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160; <span class="keywordtype">char</span>* title = <a class="code" href="structmrparam__t.html#a23e24e8700e17ede6dd385fc90330f76">mrparam_get</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_TRACKNAME, <span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mr_mprintf(<span class="stringliteral">&quot;%s %s %s&quot;</span>, filename, author, title); <span class="comment">/* for outgoing messages, also add the mediainfo. For incoming messages, this is not needed as the filename is build from these information */</span></div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160; free(filename);</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160; free(author);</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160; free(title);</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160; }</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( MR_MSG_MAKE_FILENAME_SEARCHABLE(msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>) ) {</div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mr_get_filename(pathNfilename);</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160; }</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( MR_MSG_MAKE_SUFFIX_SEARCHABLE(msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>) ) {</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mr_get_filesuffix_lc(pathNfilename);</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160; }</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160; }</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160; {</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160; mrmailbox_log_error(mailbox, 0, <span class="stringliteral">&quot;Attachment missing for message of type #%i.&quot;</span>, (<span class="keywordtype">int</span>)msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>); <span class="comment">/* should not happen */</span></div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160; }</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>&#160; }</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160; {</div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>&#160; mrmailbox_log_error(mailbox, 0, <span class="stringliteral">&quot;Cannot send messages of type #%i.&quot;</span>, (<span class="keywordtype">int</span>)msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>); <span class="comment">/* should not happen */</span></div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160; }</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160; mrmailbox_unarchive_chat__(mailbox, chat_id);</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160; mailbox-&gt;m_smtp-&gt;m_log_connect_errors = 1;</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160; {</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat = mrchat_new(mailbox);</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>&#160; <span class="keywordflow">if</span>( mrchat_load_from_db__(chat, chat_id) ) {</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a> = mrmailbox_send_msg_i__(mailbox, chat, msg, mr_create_smeared_timestamp__());</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160; }</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat);</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160; }</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>&#160;</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>&#160;</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, chat_id, msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>);</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;cleanup:</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160; free(pathNfilename);</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160; <span class="keywordflow">return</span> msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>;</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;}</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;</div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>&#160;</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;<span class="comment"> * Handle Group Chats</span></div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;</div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>&#160;</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>&#160;<span class="keywordtype">int</span> mrmailbox_group_explicitly_left__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* grpid)</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>&#160;{</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_FROM_leftgrps_WHERE_grpid, <span class="stringliteral">&quot;SELECT id FROM leftgrps WHERE grpid=?;&quot;</span>);</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160; sqlite3_bind_text (stmt, 1, grpid, -1, SQLITE_STATIC);</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160; <span class="keywordflow">return</span> (sqlite3_step(stmt)==SQLITE_ROW);</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;}</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;<span class="keywordtype">void</span> mrmailbox_set_group_explicitly_left__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* grpid)</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;{</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160; <span class="keywordflow">if</span>( !mrmailbox_group_explicitly_left__(mailbox, grpid) )</div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160; {</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160; sqlite3_stmt* stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, <span class="stringliteral">&quot;INSERT INTO leftgrps (grpid) VALUES(?);&quot;</span>);</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160; sqlite3_bind_text (stmt, 1, grpid, -1, SQLITE_STATIC);</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>&#160; sqlite3_finalize(stmt);</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160; }</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;}</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;</div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> mrmailbox_real_group_exists__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;{</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160; <span class="keywordtype">int</span> ret = 0;</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || mailbox-&gt;m_sql-&gt;m_cobj==NULL</div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>&#160; || chat_id &lt;= MR_CHAT_ID_LAST_SPECIAL ) {</div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160; }</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_chats_WHERE_id,</div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>&#160; <span class="stringliteral">&quot;SELECT id FROM chats WHERE id=? AND type=?;&quot;</span>);</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160; sqlite3_bind_int(stmt, 2, MR_CHAT_TYPE_GROUP);</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160; ret = 1;</div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160; }</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;}</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;<span class="keywordtype">int</span> mrmailbox_add_contact_to_chat__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, uint32_t contact_id)</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>&#160;{</div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160; <span class="comment">/* add a contact to a chat; the function does not check the type or if any of the record exist or are already added to the chat! */</span></div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, INSERT_INTO_chats_contacts,</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160; <span class="stringliteral">&quot;INSERT INTO chats_contacts (chat_id, contact_id) VALUES(?, ?)&quot;</span>);</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160; sqlite3_bind_int(stmt, 2, contact_id);</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160; <span class="keywordflow">return</span> (sqlite3_step(stmt)==SQLITE_DONE)? 1 : 0;</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;}</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>&#160;</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>&#160;</div><div class="line"><a name="l03333"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a47156db87107ec208d6637f460d897a8"> 3333</a></span>&#160;uint32_t <a class="code" href="structmrmailbox__t.html#a47156db87107ec208d6637f460d897a8">mrmailbox_create_group_chat</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* chat_name)</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;{</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>&#160; uint32_t chat_id = 0;</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160; <span class="keywordtype">int</span> locked = 0;</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160; <span class="keywordtype">char</span>* draft_txt = NULL, *grpid = NULL;</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || chat_name==NULL || chat_name[0]==0 ) {</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160; }</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160; locked = 1;</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160; draft_txt = mrstock_str_repl_string(MR_STR_NEWGROUPDRAFT, chat_name);</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160; grpid = mr_create_id();</div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql,</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160; <span class="stringliteral">&quot;INSERT INTO chats (type, name, draft_timestamp, draft_txt, grpid, param) VALUES(?, ?, ?, ?, ?, &#39;U=1&#39;);&quot;</span> <span class="comment">/*U=MRP_UNPROMOTED*/</span> );</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160; sqlite3_bind_int (stmt, 1, MR_CHAT_TYPE_GROUP);</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160; sqlite3_bind_text (stmt, 2, chat_name, -1, SQLITE_STATIC);</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160; sqlite3_bind_int64(stmt, 3, time(NULL));</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160; sqlite3_bind_text (stmt, 4, draft_txt, -1, SQLITE_STATIC);</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160; sqlite3_bind_text (stmt, 5, grpid, -1, SQLITE_STATIC);</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt)!=SQLITE_DONE ) {</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160; }</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160; <span class="keywordflow">if</span>( (chat_id=sqlite3_last_insert_rowid(mailbox-&gt;m_sql-&gt;m_cobj)) == 0 ) {</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160; }</div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>&#160;</div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>&#160; <span class="keywordflow">if</span>( mrmailbox_add_contact_to_chat__(mailbox, chat_id, MR_CONTACT_ID_SELF) ) {</div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160; }</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;cleanup:</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160; <span class="keywordflow">if</span>( stmt) { sqlite3_finalize(stmt); }</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160; free(draft_txt);</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160; free(grpid);</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160; <span class="keywordflow">if</span>( chat_id ) {</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, 0, 0);</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>&#160; }</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>&#160;</div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>&#160; <span class="keywordflow">return</span> chat_id;</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>&#160;}</div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160;</div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;</div><div class="line"><a name="l03399"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a8772e9bb55b02299f65ebd8bcc682bb1"> 3399</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a8772e9bb55b02299f65ebd8bcc682bb1">mrmailbox_set_chat_name</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <span class="keyword">const</span> <span class="keywordtype">char</span>* new_name)</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;{</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160; <span class="comment">/* the function only sets the names of group chats; normal chats get their names from the contacts */</span></div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>&#160; <span class="keywordtype">int</span> success = 0, locked = 0;</div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat = mrchat_new(mailbox);</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160; <span class="keywordtype">char</span>* q3 = NULL;</div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL || new_name==NULL || new_name[0]==0 ) {</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160; }</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160; locked = 1;</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>&#160;</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160; <span class="keywordflow">if</span>( 0==mrmailbox_real_group_exists__(mailbox, chat_id)</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>&#160; || 0==mrchat_load_from_db__(chat, chat_id) ) {</div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>&#160; }</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;</div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>&#160; <span class="keywordflow">if</span>( strcmp(chat-&gt;<a class="code" href="structmrchat__t.html#abbd344d8d361a1a4d14bfc9b5dc57140">m_name</a>, new_name)==0 ) {</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>&#160; success = 1;</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* name not modified */</span></div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160; }</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160; <span class="keywordflow">if</span>( !IS_SELF_IN_GROUP__ ) {</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160; mrmailbox_log_error(mailbox, MR_ERR_SELF_NOT_IN_GROUP, NULL);</div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* we shoud respect this - whatever we send to the group, it gets discarded anyway! */</span></div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160; }</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160; q3 = sqlite3_mprintf(<span class="stringliteral">&quot;UPDATE chats SET name=%Q WHERE id=%i;&quot;</span>, new_name, chat_id);</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160; <span class="keywordflow">if</span>( !mrsqlite3_execute__(mailbox-&gt;m_sql, q3) ) {</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160; }</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160; locked = 0;</div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160; <span class="comment">/* send a status mail to all group members, also needed for outself to allow multi-client */</span></div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160; <span class="keywordflow">if</span>( DO_SEND_STATUS_MAILS )</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160; {</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> = MR_MSG_TEXT;</div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mrstock_str_repl_string2(MR_STR_MSGGRPNAME, chat-&gt;<a class="code" href="structmrchat__t.html#abbd344d8d361a1a4d14bfc9b5dc57140">m_name</a>, new_name);</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD, MR_SYSTEM_GROUPNAME_CHANGED);</div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a> = <a class="code" href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c">mrmailbox_send_msg</a>(mailbox, chat-&gt;m_id, msg);</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, chat_id, msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>);</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160; }</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CHAT_MODIFIED, chat_id, 0);</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160; success = 1;</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;cleanup:</div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160; <span class="keywordflow">if</span>( q3 ) { sqlite3_free(q3); }</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat);</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>&#160; <span class="keywordflow">return</span> success;</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;}</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;</div><div class="line"><a name="l03476"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a2a9b27b6a2e991cbf3b553c5dbbec803"> 3476</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a2a9b27b6a2e991cbf3b553c5dbbec803">mrmailbox_set_chat_image</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, <span class="keyword">const</span> <span class="keywordtype">char</span>* new_image <span class="comment">/*NULL=remove image*/</span>)</div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>&#160;{</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>&#160; <span class="keywordtype">int</span> success = 0, locked = 0;;</div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat = mrchat_new(mailbox);</div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>&#160;</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL ) {</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>&#160; }</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>&#160; locked = 1;</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160; <span class="keywordflow">if</span>( 0==mrmailbox_real_group_exists__(mailbox, chat_id)</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>&#160; || 0==mrchat_load_from_db__(chat, chat_id) ) {</div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>&#160; }</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160; <span class="keywordflow">if</span>( !IS_SELF_IN_GROUP__ ) {</div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>&#160; mrmailbox_log_error(mailbox, MR_ERR_SELF_NOT_IN_GROUP, NULL);</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* we shoud respect this - whatever we send to the group, it gets discarded anyway! */</span></div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160; }</div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>&#160;</div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a>(chat-&gt;<a class="code" href="structmrchat__t.html#ad2792ee7df778521de61087bc79795a7">m_param</a>, MRP_PROFILE_IMAGE, new_image<span class="comment">/*may be NULL*/</span>);</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160; <span class="keywordflow">if</span>( !mrchat_update_param__(chat) ) {</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160; }</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>&#160; locked = 0;</div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>&#160;</div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>&#160; <span class="comment">/* send a status mail to all group members, also needed for outself to allow multi-client */</span></div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160; <span class="keywordflow">if</span>( DO_SEND_STATUS_MAILS )</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160; {</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD, MR_SYSTEM_GROUPIMAGE_CHANGED);</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a> (msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD_PARAM, new_image);</div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> = MR_MSG_TEXT;</div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mrstock_str(new_image? MR_STR_MSGGRPIMGCHANGED : MR_STR_MSGGRPIMGDELETED);</div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a> = <a class="code" href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c">mrmailbox_send_msg</a>(mailbox, chat-&gt;m_id, msg);</div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, chat_id, msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>);</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>&#160; }</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CHAT_MODIFIED, chat_id, 0);</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160; success = 1;</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160;cleanup:</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat);</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>&#160; <span class="keywordflow">return</span> success;</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>&#160;}</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;</div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>&#160;</div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>&#160;<span class="keywordtype">int</span> mrmailbox_get_chat_contact_count__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id)</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;{</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_chats_contacts_WHERE_chat_id,</div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM chats_contacts WHERE chat_id=?;&quot;</span>);</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160; }</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;}</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;</div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;</div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>&#160;<span class="keywordtype">int</span> mrmailbox_is_contact_in_chat__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, uint32_t contact_id)</div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>&#160;{</div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_void_FROM_chats_contacts_WHERE_chat_id_AND_contact_id,</div><div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>&#160; <span class="stringliteral">&quot;SELECT contact_id FROM chats_contacts WHERE chat_id=? AND contact_id=?;&quot;</span>);</div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160; sqlite3_bind_int(stmt, 2, contact_id);</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160; <span class="keywordflow">return</span> (sqlite3_step(stmt) == SQLITE_ROW)? 1 : 0;</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160;}</div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160;</div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;</div><div class="line"><a name="l03565"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#ae37988665a3d46f42a7e8199d18735c2"> 3565</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#ae37988665a3d46f42a7e8199d18735c2">mrmailbox_is_contact_in_chat</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, uint32_t contact_id)</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;{</div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160; <span class="comment">/* this function works for group and for normal chats, however, it is more useful for group chats.</span></div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;<span class="comment"> MR_CONTACT_ID_SELF may be used to check, if the user itself is in a group chat (MR_CONTACT_ID_SELF is not added to normal chats) */</span></div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160; <span class="keywordtype">int</span> ret = 0;</div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>&#160; <span class="keywordflow">if</span>( mailbox ) {</div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160; ret = mrmailbox_is_contact_in_chat__(mailbox, chat_id, contact_id);</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>&#160; }</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;}</div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>&#160;</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;</div><div class="line"><a name="l03595"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a96368620971935c7ac4a0bb324ece2c9"> 3595</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a96368620971935c7ac4a0bb324ece2c9">mrmailbox_add_contact_to_chat</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, uint32_t contact_id <span class="comment">/*may be MR_CONTACT_ID_SELF*/</span>)</div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;{</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160; <span class="keywordtype">int</span> success = 0, locked = 0;</div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* contact = <a class="code" href="structmrmailbox__t.html#a057660d94350ff98eca72785c6e88962">mrmailbox_get_contact</a>(mailbox, contact_id); <span class="comment">/* mrcontact_load_from_db__() does not load SELF fields */</span></div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat = mrchat_new(mailbox);</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>&#160; <span class="keywordtype">char</span>* self_addr = NULL;</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>&#160;</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || contact == NULL ) {</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>&#160; }</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160; locked = 1;</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160; <span class="keywordflow">if</span>( 0==mrmailbox_real_group_exists__(mailbox, chat_id) <span class="comment">/*this also makes sure, not contacts are added to special or normal chats*/</span></div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160; || (0==mrmailbox_real_contact_exists__(mailbox, contact_id) &amp;&amp; contact_id!=MR_CONTACT_ID_SELF)</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160; || 0==mrchat_load_from_db__(chat, chat_id) ) {</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>&#160; }</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160; <span class="keywordflow">if</span>( !IS_SELF_IN_GROUP__ ) {</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>&#160; mrmailbox_log_error(mailbox, MR_ERR_SELF_NOT_IN_GROUP, NULL);</div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* we shoud respect this - whatever we send to the group, it gets discarded anyway! */</span></div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160; }</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160; self_addr = mrsqlite3_get_config__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured_addr&quot;</span>, <span class="stringliteral">&quot;&quot;</span>);</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160; <span class="keywordflow">if</span>( strcasecmp(contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>, self_addr)==0 ) {</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* ourself is added using MR_CONTACT_ID_SELF, do not add it explicitly. if SELF is not in the group, members cannot be added at all. */</span></div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160; }</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160; <span class="keywordflow">if</span>( 1==mrmailbox_is_contact_in_chat__(mailbox, chat_id, contact_id) ) {</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160; success = 1;</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>&#160; }</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;</div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160; <span class="keywordflow">if</span>( 0==mrmailbox_add_contact_to_chat__(mailbox, chat_id, contact_id) ) {</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160; }</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160; locked = 0;</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160; <span class="comment">/* send a status mail to all group members */</span></div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>&#160; <span class="keywordflow">if</span>( DO_SEND_STATUS_MAILS )</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160; {</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> = MR_MSG_TEXT;</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mrstock_str_repl_string(MR_STR_MSGADDMEMBER, (contact-&gt;<a class="code" href="structmrcontact__t.html#a559c848feee29d334098f9a581448e56">m_authname</a>&amp;&amp;contact-&gt;<a class="code" href="structmrcontact__t.html#a559c848feee29d334098f9a581448e56">m_authname</a>[0])? contact-&gt;<a class="code" href="structmrcontact__t.html#a559c848feee29d334098f9a581448e56">m_authname</a> : contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>);</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD, MR_SYSTEM_MEMBER_ADDED_TO_GROUP);</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a> (msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD_PARAM, contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>);</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a> = <a class="code" href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c">mrmailbox_send_msg</a>(mailbox, chat-&gt;m_id, msg);</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, chat_id, msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>);</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160; }</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CHAT_MODIFIED, chat_id, 0);</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;</div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160; success = 1;</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>&#160;</div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>&#160;cleanup:</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat);</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(contact);</div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160; free(self_addr);</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>&#160; <span class="keywordflow">return</span> success;</div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>&#160;}</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;</div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>&#160;</div><div class="line"><a name="l03678"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a40226d401548b002a62648ea054ac635"> 3678</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a40226d401548b002a62648ea054ac635">mrmailbox_remove_contact_from_chat</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t chat_id, uint32_t contact_id <span class="comment">/*may be MR_CONTACT_ID_SELF*/</span>)</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>&#160;{</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160; <span class="keywordtype">int</span> success = 0, locked = 0;</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* contact = <a class="code" href="structmrmailbox__t.html#a057660d94350ff98eca72785c6e88962">mrmailbox_get_contact</a>(mailbox, contact_id); <span class="comment">/* mrcontact_load_from_db__() does not load SELF fields */</span></div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat = mrchat_new(mailbox);</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160; <span class="keywordtype">char</span>* q3 = NULL;</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>&#160;</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || (contact_id&lt;=MR_CONTACT_ID_LAST_SPECIAL &amp;&amp; contact_id!=MR_CONTACT_ID_SELF) ) {</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* we do not check if &quot;contact_id&quot; exists but just delete all records with the id from chats_contacts */</span></div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>&#160; } <span class="comment">/* this allows to delete pending references to deleted contacts. Of course, this should _not_ happen. */</span></div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160;</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>&#160; locked = 1;</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160;</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span>&#160; <span class="keywordflow">if</span>( 0==mrmailbox_real_group_exists__(mailbox, chat_id)</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>&#160; || 0==mrchat_load_from_db__(chat, chat_id) ) {</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>&#160; }</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160; <span class="keywordflow">if</span>( !IS_SELF_IN_GROUP__ ) {</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160; mrmailbox_log_error(mailbox, MR_ERR_SELF_NOT_IN_GROUP, NULL);</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* we shoud respect this - whatever we send to the group, it gets discarded anyway! */</span></div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160; }</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>&#160;</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>&#160; locked = 0;</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160; <span class="comment">/* send a status mail to all group members - we need to do this before we update the database -</span></div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>&#160;<span class="comment"> otherwise the !IS_SELF_IN_GROUP__-check in mrchat_send_msg() will fail. */</span></div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>&#160; <span class="keywordflow">if</span>( contact )</div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160; {</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>&#160; <span class="keywordflow">if</span>( DO_SEND_STATUS_MAILS )</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>&#160; {</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> = MR_MSG_TEXT;</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160; <span class="keywordflow">if</span>( contact-&gt;<a class="code" href="structmrcontact__t.html#ab2ee31297c327e04ed14673adbd49716">m_id</a> == MR_CONTACT_ID_SELF ) {</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160; mrmailbox_set_group_explicitly_left__(mailbox, chat-&gt;m_grpid);</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mrstock_str(MR_STR_MSGGROUPLEFT);</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160; }</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">m_text</a> = mrstock_str_repl_string(MR_STR_MSGDELMEMBER, (contact-&gt;<a class="code" href="structmrcontact__t.html#a559c848feee29d334098f9a581448e56">m_authname</a>&amp;&amp;contact-&gt;<a class="code" href="structmrcontact__t.html#a559c848feee29d334098f9a581448e56">m_authname</a>[0])? contact-&gt;<a class="code" href="structmrcontact__t.html#a559c848feee29d334098f9a581448e56">m_authname</a> : contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>);</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160; }</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD, MR_SYSTEM_MEMBER_REMOVED_FROM_GROUP);</div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>&#160; <a class="code" href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_set</a> (msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_SYSTEM_CMD_PARAM, contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>);</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160; msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a> = <a class="code" href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c">mrmailbox_send_msg</a>(mailbox, chat-&gt;m_id, msg);</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, chat_id, msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>);</div><div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>&#160; }</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160; }</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160; locked = 1;</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;</div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160; q3 = sqlite3_mprintf(<span class="stringliteral">&quot;DELETE FROM chats_contacts WHERE chat_id=%i AND contact_id=%i;&quot;</span>, chat_id, contact_id);</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160; <span class="keywordflow">if</span>( !mrsqlite3_execute__(mailbox-&gt;m_sql, q3) ) {</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>&#160; }</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>&#160;</div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>&#160; locked = 0;</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>&#160;</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CHAT_MODIFIED, chat_id, 0);</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;</div><div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>&#160; success = 1;</div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;cleanup:</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160; <span class="keywordflow">if</span>( q3 ) { sqlite3_free(q3); }</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat);</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(contact);</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160; <span class="keywordflow">return</span> success;</div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>&#160;}</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;</div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>&#160;</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;<span class="comment"> * Handle Contacts</span></div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;</div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>&#160;<span class="keywordtype">int</span> mrmailbox_real_contact_exists__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;{</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>&#160; <span class="keywordtype">int</span> ret = 0;</div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>&#160;</div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || mailbox-&gt;m_sql-&gt;m_cobj==NULL</div><div class="line"><a name="l03764"></a><span class="lineno"> 3764</span>&#160; || contact_id &lt;= MR_CONTACT_ID_LAST_SPECIAL ) {</div><div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160; }</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_contacts_WHERE_id,</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160; <span class="stringliteral">&quot;SELECT id FROM contacts WHERE id=?;&quot;</span>);</div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>&#160; sqlite3_bind_int(stmt, 1, contact_id);</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>&#160;</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>&#160; ret = 1;</div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160; }</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160;</div><div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;}</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;</div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>&#160;</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>&#160;<span class="keywordtype">size_t</span> mrmailbox_get_real_contact_cnt__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>&#160;{</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || mailbox-&gt;m_sql-&gt;m_cobj==NULL ) {</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160; }</div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;</div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_contacts, <span class="stringliteral">&quot;SELECT COUNT(*) FROM contacts WHERE id&gt;?;&quot;</span>);</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160; sqlite3_bind_int(stmt, 1, MR_CONTACT_ID_LAST_SPECIAL);</div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160; }</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>&#160;</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;}</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;</div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>&#160;uint32_t mrmailbox_add_or_lookup_contact__( <a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox,</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span>* name <span class="comment">/*can be NULL, the caller may use mr_normalize_name() before*/</span>,</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span>* addr__,</div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>&#160; <span class="keywordtype">int</span> origin,</div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>&#160; <span class="keywordtype">int</span>* sth_modified )</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;{</div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>&#160; uint32_t row_id = 0;</div><div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>&#160; <span class="keywordtype">int</span> dummy;</div><div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>&#160; <span class="keywordtype">char</span>* addr = NULL;</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>&#160;</div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160; <span class="keywordflow">if</span>( sth_modified == NULL ) {</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160; sth_modified = &amp;dummy;</div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160; }</div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160; *sth_modified = 0;</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || addr__ == NULL || origin &lt;= 0 ) {</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>&#160; }</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>&#160;</div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160; <span class="comment">/* normalize the email-address:</span></div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>&#160;<span class="comment"> - remove leading `mailto:` */</span></div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>&#160; addr = mr_normalize_addr(addr__);</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>&#160;</div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>&#160; <span class="comment">/* rough check if email-address is valid */</span></div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>&#160; <span class="keywordflow">if</span>( strlen(addr) &lt; 3 || strchr(addr, <span class="charliteral">&#39;@&#39;</span>)==NULL || strchr(addr, <span class="charliteral">&#39;.&#39;</span>)==NULL ) {</div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>&#160; mrmailbox_log_warning(mailbox, 0, <span class="stringliteral">&quot;Bad address \&quot;%s\&quot; for contact \&quot;%s\&quot;.&quot;</span>, addr, name?name:<span class="stringliteral">&quot;&lt;unset&gt;&quot;</span>);</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160; }</div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;</div><div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>&#160; <span class="comment">/* insert email-address to database or modify the record with the given email-address.</span></div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;<span class="comment"> we treat all email-addresses case-insensitive. */</span></div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_inao_FROM_contacts_a,</div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160; <span class="stringliteral">&quot;SELECT id, name, addr, origin, authname FROM contacts WHERE addr=? COLLATE NOCASE;&quot;</span>);</div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160; sqlite3_bind_text(stmt, 1, (<span class="keyword">const</span> <span class="keywordtype">char</span>*)addr, -1, SQLITE_STATIC);</div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) == SQLITE_ROW )</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160; {</div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> *row_name, *row_addr, *row_authname;</div><div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>&#160; <span class="keywordtype">int</span> row_origin, update_addr = 0, update_name = 0, update_authname = 0;</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160; row_id = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160; row_name = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)sqlite3_column_text(stmt, 1); <span class="keywordflow">if</span>( row_name == NULL ) { row_name = <span class="stringliteral">&quot;&quot;</span>; }</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160; row_addr = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)sqlite3_column_text(stmt, 2); <span class="keywordflow">if</span>( row_addr == NULL ) { row_addr = addr; }</div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>&#160; row_origin = sqlite3_column_int(stmt, 3);</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>&#160; row_authname = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)sqlite3_column_text(stmt, 4); <span class="keywordflow">if</span>( row_authname == NULL ) { row_authname = <span class="stringliteral">&quot;&quot;</span>; }</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;</div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160; <span class="keywordflow">if</span>( name &amp;&amp; name[0] ) {</div><div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>&#160; <span class="keywordflow">if</span>( row_name &amp;&amp; row_name[0] ) {</div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160; <span class="keywordflow">if</span>( origin&gt;=row_origin &amp;&amp; strcmp(name, row_name)!=0 ) {</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160; update_name = 1;</div><div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>&#160; }</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>&#160; }</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>&#160; update_name = 1;</div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>&#160; }</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>&#160;</div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160; <span class="keywordflow">if</span>( origin == MR_ORIGIN_INCOMING_UNKNOWN_FROM &amp;&amp; strcmp(name, row_authname)!=0 ) {</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160; update_authname = 1;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160; }</div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160; }</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160; <span class="keywordflow">if</span>( origin&gt;=row_origin &amp;&amp; strcmp(addr, row_addr)!=0 <span class="comment">/*really compare case-sensitive here*/</span> ) {</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160; update_addr = 1;</div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160; }</div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;</div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160; <span class="keywordflow">if</span>( update_name || update_authname || update_addr || origin&gt;row_origin )</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160; {</div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_contacts_nao_WHERE_i,</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160; <span class="stringliteral">&quot;UPDATE contacts SET name=?, addr=?, origin=?, authname=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160; sqlite3_bind_text(stmt, 1, update_name? name : row_name, -1, SQLITE_STATIC);</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160; sqlite3_bind_text(stmt, 2, update_addr? addr : row_addr, -1, SQLITE_STATIC);</div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160; sqlite3_bind_int (stmt, 3, origin&gt;row_origin? origin : row_origin);</div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160; sqlite3_bind_text(stmt, 4, update_authname? name : row_authname, -1, SQLITE_STATIC);</div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160; sqlite3_bind_int (stmt, 5, row_id);</div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160; sqlite3_step (stmt);</div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;</div><div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>&#160; <span class="keywordflow">if</span>( update_name )</div><div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>&#160; {</div><div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160; <span class="comment">/* Update the contact name also if it is used as a group name.</span></div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;<span class="comment"> This is one of the few duplicated data, however, getting the chat list is much faster this way.*/</span></div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_chats_SET_n_WHERE_c,</div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>&#160; <span class="stringliteral">&quot;UPDATE chats SET name=? WHERE type=? AND id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?);&quot;</span>);</div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>&#160; sqlite3_bind_text(stmt, 1, name, -1, SQLITE_STATIC);</div><div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>&#160; sqlite3_bind_int (stmt, 2, MR_CHAT_TYPE_NORMAL);</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160; sqlite3_bind_int (stmt, 3, row_id);</div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160; sqlite3_step (stmt);</div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>&#160; }</div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160; }</div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;</div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160; *sth_modified = 1;</div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>&#160; }</div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160; {</div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, INSERT_INTO_contacts_neo,</div><div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>&#160; <span class="stringliteral">&quot;INSERT INTO contacts (name, addr, origin) VALUES(?, ?, ?);&quot;</span>);</div><div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>&#160; sqlite3_bind_text(stmt, 1, name? name : <span class="stringliteral">&quot;&quot;</span>, -1, SQLITE_STATIC); <span class="comment">/* avoid NULL-fields in column */</span></div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160; sqlite3_bind_text(stmt, 2, addr, -1, SQLITE_STATIC);</div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160; sqlite3_bind_int (stmt, 3, origin);</div><div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) == SQLITE_DONE )</div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160; {</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>&#160; row_id = sqlite3_last_insert_rowid(mailbox-&gt;m_sql-&gt;m_cobj);</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160; *sth_modified = 1;</div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160; }</div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160; {</div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160; mrmailbox_log_error(mailbox, 0, <span class="stringliteral">&quot;Cannot add contact.&quot;</span>); <span class="comment">/* should not happen */</span></div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160; }</div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>&#160; }</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160;</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;cleanup:</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160; free(addr);</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160; <span class="keywordflow">return</span> row_id;</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;}</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;<span class="keywordtype">void</span> mrmailbox_scaleup_contact_origin__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id, <span class="keywordtype">int</span> origin)</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;{</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160; }</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_contacts_SET_origin_WHERE_id,</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160; <span class="stringliteral">&quot;UPDATE contacts SET origin=? WHERE id=? AND origin&lt;?;&quot;</span>);</div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160; sqlite3_bind_int(stmt, 1, origin);</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160; sqlite3_bind_int(stmt, 2, contact_id);</div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160; sqlite3_bind_int(stmt, 3, origin);</div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>&#160;}</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>&#160;</div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>&#160;</div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>&#160;<span class="keywordtype">int</span> mrmailbox_is_contact_blocked__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;{</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160; <span class="keywordtype">int</span> is_blocked = 0;</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* ths = <a class="code" href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_new</a>();</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160; <span class="keywordflow">if</span>( mrcontact_load_from_db__(ths, mailbox-&gt;m_sql, contact_id) ) { <span class="comment">/* we could optimize this by loading only the needed fields */</span></div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160; <span class="keywordflow">if</span>( ths-&gt;<a class="code" href="structmrcontact__t.html#ac22d500e5c439b07c943ed2c7afb2a23">m_blocked</a> ) {</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160; is_blocked = 1;</div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160; }</div><div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>&#160; }</div><div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>&#160;</div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(ths);</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160; <span class="keywordflow">return</span> is_blocked;</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;}</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;</div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;<span class="keywordtype">int</span> mrmailbox_get_contact_origin__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id, <span class="keywordtype">int</span>* ret_blocked)</div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;{</div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160; <span class="keywordtype">int</span> ret = MR_ORIGIN_UNSET;</div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160; <span class="keywordtype">int</span> dummy; <span class="keywordflow">if</span>( ret_blocked==NULL ) { ret_blocked = &amp;dummy; }</div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* ths = <a class="code" href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_new</a>();</div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;</div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160; *ret_blocked = 0;</div><div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>&#160;</div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>&#160; <span class="keywordflow">if</span>( !mrcontact_load_from_db__(ths, mailbox-&gt;m_sql, contact_id) ) { <span class="comment">/* we could optimize this by loading only the needed fields */</span></div><div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>&#160; }</div><div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>&#160;</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160; <span class="keywordflow">if</span>( ths-&gt;<a class="code" href="structmrcontact__t.html#ac22d500e5c439b07c943ed2c7afb2a23">m_blocked</a> ) {</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160; *ret_blocked = 1;</div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160; }</div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;</div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160; ret = ths-&gt;m_origin;</div><div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>&#160;</div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;cleanup:</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(ths);</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;}</div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160;</div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;</div><div class="line"><a name="l03985"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#aa089e97e7ca1add16c10d5cc0e902824"> 3985</a></span>&#160;uint32_t <a class="code" href="structmrmailbox__t.html#aa089e97e7ca1add16c10d5cc0e902824">mrmailbox_create_contact</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span>* addr)</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>&#160;{</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160; uint32_t contact_id = 0;</div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || addr == NULL || addr[0]==0 ) {</div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160; }</div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;</div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;</div><div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>&#160; contact_id = mrmailbox_add_or_lookup_contact__(mailbox, name, addr, MR_ORIGIN_MANUALLY_CREATED, NULL);</div><div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160;</div><div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>&#160;</div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CONTACTS_CHANGED, 0, 0);</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;</div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;cleanup:</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160; <span class="keywordflow">return</span> contact_id;</div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160;}</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;</div><div class="line"><a name="l04021"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a25720ea41355cc32cc93aa45709937d6"> 4021</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a25720ea41355cc32cc93aa45709937d6">mrmailbox_add_address_book</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* adr_book) <span class="comment">/* format: Name one\nAddress one\nName two\Address two */</span></div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;{</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160; carray* lines = NULL;</div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160; <span class="keywordtype">size_t</span> i, iCnt;</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160; <span class="keywordtype">int</span> sth_modified, modify_cnt = 0;</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || adr_book == NULL ) {</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160; }</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160; <span class="keywordflow">if</span>( (lines=mr_split_into_lines(adr_book))==NULL ) {</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160; }</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>&#160;</div><div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;</div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160; iCnt = carray_count(lines);</div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160; <span class="keywordflow">for</span>( i = 0; i+1 &lt; iCnt; i += 2 ) {</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160; <span class="keywordtype">char</span>* name = (<span class="keywordtype">char</span>*)carray_get(lines, i);</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160; <span class="keywordtype">char</span>* addr = (<span class="keywordtype">char</span>*)carray_get(lines, i+1);</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160; <a class="code" href="structmrcontact__t.html#ad906207191f0cfd62e408dbc82a156cf">mrcontact_normalize_name</a>(name);</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160; mrmailbox_add_or_lookup_contact__(mailbox, name, addr, MR_ORIGIN_ADRESS_BOOK, &amp;sth_modified);</div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160; <span class="keywordflow">if</span>( sth_modified ) {</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160; modify_cnt++;</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160; }</div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160; }</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;</div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;cleanup:</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160; mr_free_splitted_lines(lines);</div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160; <span class="keywordflow">return</span> modify_cnt;</div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;}</div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;</div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;</div><div class="line"><a name="l04076"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a2597f7a6022e6f571fa8cdb7ba3977cc"> 4076</a></span>&#160;carray* <a class="code" href="structmrmailbox__t.html#a2597f7a6022e6f571fa8cdb7ba3977cc">mrmailbox_get_known_contacts</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* query)</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;{</div><div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>&#160; <span class="keywordtype">int</span> locked = 0;</div><div class="line"><a name="l04079"></a><span class="lineno"> 4079</span>&#160; carray* ret = carray_new(100);</div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160; <span class="keywordtype">char</span>* s3strLikeCmd = NULL;</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160; }</div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160; locked = 1;</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160; <span class="keywordflow">if</span>( query ) {</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160; <span class="keywordflow">if</span>( (s3strLikeCmd=sqlite3_mprintf(<span class="stringliteral">&quot;%%%s%%&quot;</span>, query))==NULL ) {</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>&#160; }</div><div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_contacts_WHERE_query_ORDER_BY,</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160; <span class="stringliteral">&quot;SELECT id FROM contacts&quot;</span></div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>&#160; <span class="stringliteral">&quot; WHERE id&gt;? AND origin&gt;=? AND blocked=0 AND (name LIKE ? OR addr LIKE ?)&quot;</span> <span class="comment">/* see comments in mrmailbox_search_msgs() about the LIKE operator */</span></div><div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>&#160; <span class="stringliteral">&quot; ORDER BY LOWER(name||addr),id;&quot;</span>);</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160; sqlite3_bind_int (stmt, 1, MR_CONTACT_ID_LAST_SPECIAL);</div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160; sqlite3_bind_int (stmt, 2, MR_ORIGIN_MIN_CONTACT_LIST);</div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160; sqlite3_bind_text(stmt, 3, s3strLikeCmd, -1, SQLITE_STATIC);</div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160; sqlite3_bind_text(stmt, 4, s3strLikeCmd, -1, SQLITE_STATIC);</div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>&#160; }</div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_contacts_ORDER_BY,</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160; <span class="stringliteral">&quot;SELECT id FROM contacts&quot;</span></div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160; <span class="stringliteral">&quot; WHERE id&gt;? AND origin&gt;=? AND blocked=0&quot;</span></div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160; <span class="stringliteral">&quot; ORDER BY LOWER(name||addr),id;&quot;</span>);</div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160; sqlite3_bind_int(stmt, 1, MR_CONTACT_ID_LAST_SPECIAL);</div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160; sqlite3_bind_int(stmt, 2, MR_ORIGIN_MIN_CONTACT_LIST);</div><div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>&#160; }</div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;</div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)(uintptr_t)sqlite3_column_int(stmt, 0), NULL);</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160; }</div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;</div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160; locked = 0;</div><div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>&#160;</div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;cleanup:</div><div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160; }</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160; <span class="keywordflow">if</span>( s3strLikeCmd ) {</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160; sqlite3_free(s3strLikeCmd);</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160; }</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;}</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;</div><div class="line"><a name="l04140"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a87a210d5e359e3176b923d84a9cd625f"> 4140</a></span>&#160;carray* <a class="code" href="structmrmailbox__t.html#a87a210d5e359e3176b923d84a9cd625f">mrmailbox_get_blocked_contacts</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l04141"></a><span class="lineno"> 4141</span>&#160;{</div><div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>&#160; carray* ret = carray_new(100);</div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>&#160;</div><div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160; }</div><div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>&#160;</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_id_FROM_contacts_WHERE_blocked,</div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160; <span class="stringliteral">&quot;SELECT id FROM contacts&quot;</span></div><div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>&#160; <span class="stringliteral">&quot; WHERE id&gt;? AND blocked!=0&quot;</span></div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160; <span class="stringliteral">&quot; ORDER BY LOWER(name||addr),id;&quot;</span>);</div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160; sqlite3_bind_int(stmt, 1, MR_CONTACT_ID_LAST_SPECIAL);</div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt) == SQLITE_ROW ) {</div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>&#160; carray_add(ret, (<span class="keywordtype">void</span>*)(uintptr_t)sqlite3_column_int(stmt, 0), NULL);</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>&#160; }</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;</div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;</div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160;cleanup:</div><div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;}</div><div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>&#160;</div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>&#160;</div><div class="line"><a name="l04174"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a6c749ad5736d9c34ff492015ea10a184"> 4174</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a6c749ad5736d9c34ff492015ea10a184">mrmailbox_get_blocked_count</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>&#160;{</div><div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>&#160; <span class="keywordtype">int</span> ret = 0, locked = 0;</div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;</div><div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>&#160; }</div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160; locked = 1;</div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;</div><div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_contacts_WHERE_blocked,</div><div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM contacts&quot;</span></div><div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>&#160; <span class="stringliteral">&quot; WHERE id&gt;? AND blocked!=0&quot;</span>);</div><div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>&#160; sqlite3_bind_int(stmt, 1, MR_CONTACT_ID_LAST_SPECIAL);</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160; }</div><div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>&#160; ret = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>&#160;</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160; locked = 0;</div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160;</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;cleanup:</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;}</div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;</div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;</div><div class="line"><a name="l04216"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a057660d94350ff98eca72785c6e88962"> 4216</a></span>&#160;<a class="code" href="structmrcontact__t.html">mrcontact_t</a>* <a class="code" href="structmrmailbox__t.html#a057660d94350ff98eca72785c6e88962">mrmailbox_get_contact</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;{</div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* ret = <a class="code" href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_new</a>();</div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;</div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160; <span class="keywordflow">if</span>( contact_id == MR_CONTACT_ID_SELF )</div><div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>&#160; {</div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>&#160; ret-&gt;<a class="code" href="structmrcontact__t.html#ab2ee31297c327e04ed14673adbd49716">m_id</a> = contact_id;</div><div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160; ret-&gt;<a class="code" href="structmrcontact__t.html#a48fba862b41f7da3b8c6193c0554654b">m_name</a> = mrstock_str(MR_STR_SELF);</div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160; ret-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a> = mrsqlite3_get_config__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured_addr&quot;</span>, NULL);</div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160; }</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>&#160; {</div><div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>&#160; <span class="keywordflow">if</span>( !mrcontact_load_from_db__(ret, mailbox-&gt;m_sql, contact_id) ) {</div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(ret);</div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160; ret = NULL;</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160; }</div><div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>&#160; }</div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160;</div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;</div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160; <span class="keywordflow">return</span> ret; <span class="comment">/* may be NULL */</span></div><div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>&#160;}</div><div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>&#160;</div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;</div><div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> marknoticed_contact__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>&#160;{</div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_msgs_SET_state_WHERE_from_id_AND_state,</div><div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>&#160; <span class="stringliteral">&quot;UPDATE msgs SET state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_NOTICED) <span class="stringliteral">&quot; WHERE from_id=? AND state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_FRESH) <span class="stringliteral">&quot;;&quot;</span>);</div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160; sqlite3_bind_int(stmt, 1, contact_id);</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;}</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;</div><div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>&#160;</div><div class="line"><a name="l04264"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a7150c575193d43e048689aa264c74c79"> 4264</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a7150c575193d43e048689aa264c74c79">mrmailbox_marknoticed_contact</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;{</div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>&#160; }</div><div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>&#160; marknoticed_contact__(mailbox, contact_id);</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;}</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;</div><div class="line"><a name="l04290"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#abb069358386b767a60444651195e0895"> 4290</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#abb069358386b767a60444651195e0895">mrmailbox_block_contact</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id, <span class="keywordtype">int</span> new_blocking)</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;{</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160; <span class="keywordtype">int</span> locked = 0, send_event = 0, transaction_pending = 0;</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* contact = <a class="code" href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_new</a>();</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>&#160; }</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160; locked = 1;</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;</div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>&#160; <span class="keywordflow">if</span>( mrcontact_load_from_db__(contact, mailbox-&gt;m_sql, contact_id)</div><div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160; &amp;&amp; contact-&gt;<a class="code" href="structmrcontact__t.html#ac22d500e5c439b07c943ed2c7afb2a23">m_blocked</a> != new_blocking )</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160; {</div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>&#160; transaction_pending = 1;</div><div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>&#160;</div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_contacts_SET_b_WHERE_i,</div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160; <span class="stringliteral">&quot;UPDATE contacts SET blocked=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160; sqlite3_bind_int(stmt, 1, new_blocking);</div><div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>&#160; sqlite3_bind_int(stmt, 2, contact_id);</div><div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt)!=SQLITE_DONE ) {</div><div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>&#160; }</div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>&#160;</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160; <span class="comment">/* also (un)block all chats with _only_ this contact - we do not delete them to allow a non-destructive blocking-&gt;unblocking.</span></div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;<span class="comment"> (Maybe, beside normal chats (type=100) we should also block group chats with only this user.</span></div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;<span class="comment"> However, I&#39;m not sure about this point; it may be confusing if the user wants to add other people;</span></div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;<span class="comment"> this would result in recreating the same group...) */</span></div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_chats_SET_blocked,</div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160; <span class="stringliteral">&quot;UPDATE chats SET blocked=? WHERE type=? AND id IN (SELECT chat_id FROM chats_contacts WHERE contact_id=?);&quot;</span>);</div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160; sqlite3_bind_int(stmt, 1, new_blocking);</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160; sqlite3_bind_int(stmt, 2, MR_CHAT_TYPE_NORMAL);</div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160; sqlite3_bind_int(stmt, 3, contact_id);</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt)!=SQLITE_DONE ) {</div><div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>&#160; }</div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>&#160;</div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160; <span class="comment">/* mark all messages from the blocked contact as being noticed (this is to remove the deaddrop popup) */</span></div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160; marknoticed_contact__(mailbox, contact_id);</div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;</div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160; transaction_pending = 0;</div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160; send_event = 1;</div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160; }</div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;</div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160; locked = 0;</div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;</div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160; <span class="keywordflow">if</span>( send_event ) {</div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CONTACTS_CHANGED, 0, 0);</div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>&#160; }</div><div class="line"><a name="l04345"></a><span class="lineno"> 4345</span>&#160;</div><div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>&#160;cleanup:</div><div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>&#160; <span class="keywordflow">if</span>( transaction_pending ) {</div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160; mrsqlite3_rollback__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160; }</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160;</div><div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160; }</div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;</div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(contact);</div><div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>&#160;}</div><div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>&#160;</div><div class="line"><a name="l04358"></a><span class="lineno"> 4358</span>&#160;</div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> cat_fingerprint(mrstrbuilder_t* ret, <span class="keyword">const</span> <span class="keywordtype">char</span>* addr, <span class="keyword">const</span> <span class="keywordtype">char</span>* fingerprint_str)</div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;{</div><div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>&#160; mrstrbuilder_cat(ret, addr);</div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160; mrstrbuilder_cat(ret, <span class="stringliteral">&quot;:\n&quot;</span>);</div><div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160; mrstrbuilder_cat(ret, fingerprint_str);</div><div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>&#160; mrstrbuilder_cat(ret, <span class="stringliteral">&quot;\n\n&quot;</span>);</div><div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>&#160;}</div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;</div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;</div><div class="line"><a name="l04381"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#aa4d582bc9d6d80e43038d213b081031f"> 4381</a></span>&#160;<span class="keywordtype">char</span>* <a class="code" href="structmrmailbox__t.html#aa4d582bc9d6d80e43038d213b081031f">mrmailbox_get_contact_encrinfo</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160;{</div><div class="line"><a name="l04383"></a><span class="lineno"> 4383</span>&#160; <span class="keywordtype">int</span> locked = 0;</div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>&#160; <span class="keywordtype">int</span> e2ee_enabled = 0;</div><div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>&#160; <span class="keywordtype">int</span> explain_id = 0;</div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160; mrloginparam_t* loginparam = mrloginparam_new();</div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* contact = <a class="code" href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_new</a>();</div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160; mrapeerstate_t* peerstate = mrapeerstate_new();</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160; <span class="keywordtype">int</span> peerstate_ok = 0;</div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160; mrkey_t* self_key = mrkey_new();</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160; <span class="keywordtype">char</span>* fingerprint_str_self = NULL;</div><div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>&#160; <span class="keywordtype">char</span>* fingerprint_str_other = NULL;</div><div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>&#160; <span class="keywordtype">char</span>* p;</div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;</div><div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160; mrstrbuilder_t ret;</div><div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>&#160; mrstrbuilder_init(&amp;ret);</div><div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>&#160;</div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160; locked = 1;</div><div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>&#160;</div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160; <span class="keywordflow">if</span>( !mrcontact_load_from_db__(contact, mailbox-&gt;m_sql, contact_id) ) {</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160; }</div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160; peerstate_ok = mrapeerstate_load_from_db__(peerstate, mailbox-&gt;m_sql, contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>);</div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>&#160; mrloginparam_read__(loginparam, mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured_&quot;</span>);</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>&#160; e2ee_enabled = mailbox-&gt;m_e2ee_enabled;</div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;</div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160; mrkey_load_self_public__(self_key, loginparam-&gt;m_addr, mailbox-&gt;m_sql);</div><div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>&#160;</div><div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160; locked = 0;</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160; <span class="comment">/* show the encryption that would be used for the next outgoing message */</span></div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160; <span class="keywordflow">if</span>( e2ee_enabled</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160; &amp;&amp; peerstate_ok</div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160; &amp;&amp; peerstate-&gt;m_prefer_encrypt==MRA_PE_MUTUAL</div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160; &amp;&amp; peerstate-&gt;m_public_key-&gt;m_binary!=NULL )</div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160; {</div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160; <span class="comment">/* e2e fine and used */</span></div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160; p = mrstock_str(MR_STR_ENCR_E2E); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160; explain_id = MR_STR_E2E_FINE;</div><div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160; }</div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160; {</div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160; <span class="comment">/* e2e not used ... first, show status quo ... */</span></div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160; <span class="keywordflow">if</span>( !(loginparam-&gt;m_server_flags&amp;MR_IMAP_SOCKET_PLAIN)</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160; &amp;&amp; !(loginparam-&gt;m_server_flags&amp;MR_SMTP_SOCKET_PLAIN) )</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160; {</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160; p = mrstock_str(MR_STR_ENCR_TRANSP); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>&#160; }</div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>&#160; {</div><div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160; p = mrstock_str(MR_STR_ENCR_NONE); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160; }</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;</div><div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160; <span class="comment">/* ... and then explain why we cannot use e2e */</span></div><div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160; <span class="keywordflow">if</span>( peerstate_ok &amp;&amp; peerstate-&gt;m_public_key-&gt;m_binary!=NULL &amp;&amp; peerstate-&gt;m_prefer_encrypt!=MRA_PE_MUTUAL ) {</div><div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160; explain_id = MR_STR_E2E_DIS_BY_RCPT;</div><div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160; }</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !e2ee_enabled ) {</div><div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>&#160; explain_id = MR_STR_E2E_DIS_BY_YOU;</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160; }</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160; explain_id = MR_STR_E2E_NO_AUTOCRYPT;</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160; }</div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>&#160; }</div><div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>&#160;</div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160; <span class="comment">/* show fingerprints for comparison (sorted by email-address to make a device-side-by-side comparison easier) */</span></div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160; <span class="keywordflow">if</span>( peerstate_ok</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160; &amp;&amp; peerstate-&gt;m_public_key-&gt;m_binary!=NULL )</div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160; {</div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160; <span class="keywordflow">if</span>( self_key-&gt;m_binary == NULL ) {</div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160; mrpgp_rand_seed(mailbox, peerstate-&gt;m_addr, strlen(peerstate-&gt;m_addr) <span class="comment">/*just some random data*/</span>);</div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160; mrmailbox_ensure_secret_key_exists(mailbox);</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160; locked = 1;</div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160; mrkey_load_self_public__(self_key, loginparam-&gt;m_addr, mailbox-&gt;m_sql);</div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160; locked = 0;</div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160; }</div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;</div><div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot; &quot;</span>);</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160; p = mrstock_str(MR_STR_FINGERPRINTS); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;:\n\n&quot;</span>);</div><div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>&#160;</div><div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>&#160; fingerprint_str_self = mrkey_render_fingerprint(self_key, mailbox);</div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160; fingerprint_str_other = mrkey_render_fingerprint(peerstate-&gt;m_public_key, mailbox);</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;</div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160; <span class="keywordflow">if</span>( strcmp(loginparam-&gt;m_addr, peerstate-&gt;m_addr)&lt;0 ) {</div><div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160; cat_fingerprint(&amp;ret, loginparam-&gt;m_addr, fingerprint_str_self);</div><div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160; cat_fingerprint(&amp;ret, peerstate-&gt;m_addr, fingerprint_str_other);</div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160; }</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160; cat_fingerprint(&amp;ret, peerstate-&gt;m_addr, fingerprint_str_other);</div><div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>&#160; cat_fingerprint(&amp;ret, loginparam-&gt;m_addr, fingerprint_str_self);</div><div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160; }</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160; }</div><div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>&#160; {</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;\n\n&quot;</span>);</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160; }</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;</div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160; p = mrstock_str(explain_id); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;</div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;cleanup:</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160; mrapeerstate_unref(peerstate);</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(contact);</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160; mrloginparam_unref(loginparam);</div><div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>&#160; mrkey_unref(self_key);</div><div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>&#160; free(fingerprint_str_self);</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160; free(fingerprint_str_other);</div><div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>&#160; <span class="keywordflow">return</span> ret.m_buf;</div><div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;}</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;</div><div class="line"><a name="l04509"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a209732d105e40cd0c61d33d76d288c59"> 4509</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="structmrmailbox__t.html#a209732d105e40cd0c61d33d76d288c59">mrmailbox_delete_contact</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id)</div><div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>&#160;{</div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160; <span class="keywordtype">int</span> locked = 0, success = 0;</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;</div><div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || contact_id &lt;= MR_CONTACT_ID_LAST_SPECIAL ) {</div><div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160; }</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160; locked = 1;</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;</div><div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160; <span class="comment">/* we can only delete contacts that are not in use anywhere; this function is mainly for the user who has just</span></div><div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;<span class="comment"> created an contact manually and wants to delete it a moment later */</span></div><div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_chats_contacts_WHERE_contact_id,</div><div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM chats_contacts WHERE contact_id=?;&quot;</span>);</div><div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160; sqlite3_bind_int(stmt, 1, contact_id);</div><div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW || sqlite3_column_int(stmt, 0) &gt;= 1 ) {</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160; }</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;</div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_msgs_WHERE_ft,</div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM msgs WHERE from_id=? OR to_id=?;&quot;</span>);</div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160; sqlite3_bind_int(stmt, 1, contact_id);</div><div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>&#160; sqlite3_bind_int(stmt, 2, contact_id);</div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW || sqlite3_column_int(stmt, 0) &gt;= 1 ) {</div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160; }</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, DELETE_FROM_contacts_WHERE_id,</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160; <span class="stringliteral">&quot;DELETE FROM contacts WHERE id=?;&quot;</span>);</div><div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>&#160; sqlite3_bind_int(stmt, 1, contact_id);</div><div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_DONE ) {</div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160; }</div><div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>&#160;</div><div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160; locked = 0;</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_CONTACTS_CHANGED, 0, 0);</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160; success = 1;</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;</div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;cleanup:</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160; }</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160; <span class="keywordflow">return</span> success;</div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;}</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;</div><div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>&#160;</div><div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>&#160;<span class="keywordtype">int</span> mrmailbox_contact_addr_equals__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t contact_id, <span class="keyword">const</span> <span class="keywordtype">char</span>* other_addr)</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;{</div><div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>&#160; <span class="keywordtype">int</span> addr_are_equal = 0;</div><div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160; <span class="keywordflow">if</span>( other_addr ) {</div><div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* contact = <a class="code" href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_new</a>();</div><div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160; <span class="keywordflow">if</span>( mrcontact_load_from_db__(contact, mailbox-&gt;m_sql, contact_id) ) {</div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160; <span class="keywordflow">if</span>( contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a> ) {</div><div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160; <span class="keywordflow">if</span>( strcasecmp(contact-&gt;<a class="code" href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">m_addr</a>, other_addr)==0 ) {</div><div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160; addr_are_equal = 1;</div><div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160; }</div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160; }</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160; }</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(contact);</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160; }</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160; <span class="keywordflow">return</span> addr_are_equal;</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;}</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;</div><div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;</div><div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;<span class="comment"> * Handle Messages</span></div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;</div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;<span class="keywordtype">void</span> mrmailbox_update_msg_chat_id__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t msg_id, uint32_t chat_id)</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;{</div><div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_msgs_SET_chat_id_WHERE_id,</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160; <span class="stringliteral">&quot;UPDATE msgs SET chat_id=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160; sqlite3_bind_int(stmt, 1, chat_id);</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160; sqlite3_bind_int(stmt, 2, msg_id);</div><div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;}</div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;</div><div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>&#160;</div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;<span class="keywordtype">void</span> mrmailbox_update_msg_state__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t msg_id, <span class="keywordtype">int</span> state)</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;{</div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_msgs_SET_state_WHERE_id,</div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160; <span class="stringliteral">&quot;UPDATE msgs SET state=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160; sqlite3_bind_int(stmt, 1, state);</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160; sqlite3_bind_int(stmt, 2, msg_id);</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>&#160;}</div><div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>&#160;</div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;<span class="keywordtype">size_t</span> mrmailbox_get_real_msg_cnt__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;{</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160; <span class="keywordflow">if</span>( mailbox-&gt;m_sql-&gt;m_cobj==NULL ) {</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160; }</div><div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_msgs_WHERE_assigned,</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM msgs WHERE id&gt;? AND chat_id&gt;?;&quot;</span>);</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160; sqlite3_bind_int(stmt, 1, MR_MSG_ID_LAST_SPECIAL);</div><div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>&#160; sqlite3_bind_int(stmt, 2, MR_CHAT_ID_LAST_SPECIAL);</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160; mrsqlite3_log_error(mailbox-&gt;m_sql, <span class="stringliteral">&quot;mr_get_assigned_msg_cnt_() failed.&quot;</span>);</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160; }</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;</div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;}</div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;</div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;</div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;<span class="keywordtype">size_t</span> mrmailbox_get_deaddrop_msg_cnt__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox)</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;{</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL || mailbox-&gt;m_sql-&gt;m_cobj==NULL ) {</div><div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>&#160; }</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;</div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_msgs_WHERE_unassigned,</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM msgs WHERE chat_id=?;&quot;</span>);</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160; sqlite3_bind_int(stmt, 1, MR_CHAT_ID_DEADDROP);</div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160; }</div><div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160;</div><div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;}</div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;</div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;</div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;<span class="keywordtype">int</span> mrmailbox_rfc724_mid_cnt__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* rfc724_mid)</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;{</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160; <span class="keywordflow">if</span>( mailbox==NULL || mailbox-&gt;m_sql-&gt;m_cobj==NULL ) {</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160; }</div><div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160; <span class="comment">/* check the number of messages with the same rfc724_mid */</span></div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_msgs_WHERE_rfc724_mid,</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160; <span class="stringliteral">&quot;SELECT COUNT(*) FROM msgs WHERE rfc724_mid=?;&quot;</span>);</div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160; sqlite3_bind_text(stmt, 1, rfc724_mid, -1, SQLITE_STATIC);</div><div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>&#160; }</div><div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160; <span class="keywordflow">return</span> sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;}</div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160;</div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>&#160;</div><div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;<span class="comment">/* check, if the given Message-ID exists in the database (if not, the message is normally downloaded from the server and parsed,</span></div><div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>&#160;<span class="comment">so, we should even keep unuseful messages in the database (we can leave the other fields empty to safe space) */</span></div><div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160;<span class="keywordtype">int</span> mrmailbox_rfc724_mid_exists__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* rfc724_mid, <span class="keywordtype">char</span>** ret_server_folder, uint32_t* ret_server_uid)</div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;{</div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_ss_FROM_msgs_WHERE_m,</div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160; <span class="stringliteral">&quot;SELECT server_folder, server_uid FROM msgs WHERE rfc724_mid=?;&quot;</span>);</div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160; sqlite3_bind_text(stmt, 1, rfc724_mid, -1, SQLITE_STATIC);</div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>&#160; *ret_server_folder = NULL;</div><div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>&#160; *ret_server_uid = 0;</div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160; }</div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160; *ret_server_folder = safe_strdup((<span class="keywordtype">char</span>*)sqlite3_column_text(stmt, 0));</div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160; *ret_server_uid = sqlite3_column_int(stmt, 1); <span class="comment">/* may be 0 */</span></div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160; <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;}</div><div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>&#160;</div><div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;</div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;<span class="keywordtype">void</span> mrmailbox_update_server_uid__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> <span class="keywordtype">char</span>* rfc724_mid, <span class="keyword">const</span> <span class="keywordtype">char</span>* server_folder, uint32_t server_uid)</div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;{</div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_msgs_SET_ss_WHERE_rfc724_mid,</div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160; <span class="stringliteral">&quot;UPDATE msgs SET server_folder=?, server_uid=? WHERE rfc724_mid=?;&quot;</span>); <span class="comment">/* we update by &quot;rfc724_mid&quot; instead &quot;id&quot; as there may be several db-entries refering to the same &quot;rfc724_mid&quot; */</span></div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160; sqlite3_bind_text(stmt, 1, server_folder, -1, SQLITE_STATIC);</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160; sqlite3_bind_int (stmt, 2, server_uid);</div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160; sqlite3_bind_text(stmt, 3, rfc724_mid, -1, SQLITE_STATIC);</div><div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;}</div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;</div><div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>&#160;</div><div class="line"><a name="l04701"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a9ef144244e7d86ba82ce3257abf14f13"> 4701</a></span>&#160;<a class="code" href="structmrmsg__t.html">mrmsg_t</a>* <a class="code" href="structmrmailbox__t.html#a9ef144244e7d86ba82ce3257abf14f13">mrmailbox_get_msg</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t msg_id)</div><div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;{</div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160; <span class="keywordtype">int</span> success = 0;</div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160; <span class="keywordtype">int</span> db_locked = 0;</div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* obj = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>&#160;</div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160; db_locked = 1;</div><div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;</div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160; <span class="keywordflow">if</span>( !mrmsg_load_from_db__(obj, mailbox, msg_id) ) {</div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160; }</div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;</div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160; success = 1;</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;cleanup:</div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160; <span class="keywordflow">if</span>( db_locked ) {</div><div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160; }</div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;</div><div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160; <span class="keywordflow">if</span>( success ) {</div><div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160; <span class="keywordflow">return</span> obj;</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160; }</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(obj);</div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>&#160; <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>&#160; }</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;}</div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;</div><div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>&#160;</div><div class="line"><a name="l04743"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a13e05fe3f43102c3323ba4c7e2761593"> 4743</a></span>&#160;<span class="keywordtype">char</span>* <a class="code" href="structmrmailbox__t.html#a13e05fe3f43102c3323ba4c7e2761593">mrmailbox_get_msg_info</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t msg_id)</div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;{</div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160; mrstrbuilder_t ret;</div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160; <span class="keywordtype">int</span> locked = 0;</div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160; sqlite3_stmt* stmt;</div><div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160; <span class="keywordtype">char</span> *rawtxt = NULL, *p;</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160; mrstrbuilder_init(&amp;ret);</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL ) {</div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160; }</div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;</div><div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160; locked = 1;</div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;</div><div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160; mrmsg_load_from_db__(msg, mailbox, msg_id);</div><div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>&#160;</div><div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_txt_raw_FROM_msgs_WHERE_id,</div><div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160; <span class="stringliteral">&quot;SELECT txt_raw FROM msgs WHERE id=?;&quot;</span>);</div><div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160; sqlite3_bind_int(stmt, 1, msg_id);</div><div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160; p = mr_mprintf(<span class="stringliteral">&quot;Cannot load message #%i.&quot;</span>, (<span class="keywordtype">int</span>)msg_id); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160; }</div><div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160;</div><div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160; rawtxt = safe_strdup((<span class="keywordtype">char</span>*)sqlite3_column_text(stmt, 0));</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;</div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160; locked = 0;</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;</div><div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160; <span class="comment">/* add time */</span></div><div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;Date: &quot;</span>);</div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160; p = mr_timestamp_to_str(msg-&gt;<a class="code" href="structmrmsg__t.html#aba09cb77cdabd1e2b2e6262d25388801">m_timestamp</a>); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160;</div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160; <span class="comment">/* add encryption state */</span></div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160; <span class="keywordtype">int</span> e2ee_errors;</div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160; <span class="keywordflow">if</span>( (e2ee_errors=<a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_ERRONEOUS_E2EE, 0)) ) {</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160; <span class="keywordflow">if</span>( e2ee_errors&amp;MR_VALIDATE_BAD_SIGNATURE<span class="comment">/* check worst errors first */</span> ) {</div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160; p = safe_strdup(<span class="stringliteral">&quot;End-to-end, bad signature&quot;</span>);</div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160; }</div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( e2ee_errors&amp;MR_VALIDATE_UNKNOWN_SIGNATURE ) {</div><div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>&#160; p = safe_strdup(<span class="stringliteral">&quot;End-to-end, unknown signature&quot;</span>);</div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160; }</div><div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( e2ee_errors&amp;MR_VALIDATE_NOT_MUTUAL ) {</div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160; p = safe_strdup(<span class="stringliteral">&quot;End-to-end, not mutual&quot;</span>);</div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160; }</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160; p = safe_strdup(<span class="stringliteral">&quot;End-to-end, no signature&quot;</span>);</div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160; }</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160; }</div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_GUARANTEE_E2EE, 0) ) {</div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160; <span class="keywordflow">if</span>( !msg-&gt;m_mailbox-&gt;m_e2ee_enabled ) {</div><div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160; p = safe_strdup(<span class="stringliteral">&quot;End-to-end, transport for replies&quot;</span>);</div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160; }</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160; p = safe_strdup(<span class="stringliteral">&quot;End-to-end&quot;</span>);</div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160; }</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160; }</div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160; p = safe_strdup(<span class="stringliteral">&quot;Transport&quot;</span>);</div><div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>&#160; }</div><div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;Encryption: &quot;</span>);</div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160; mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160; <span class="comment">/* add &quot;suspicious&quot; status */</span></div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160; <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#aca59d28054d3e15b4fe6ca74073d91f4">m_state</a>==MR_STATE_IN_FRESH ) {</div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;Status: Fresh\n&quot;</span>);</div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160; }</div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#aca59d28054d3e15b4fe6ca74073d91f4">m_state</a>==MR_STATE_IN_NOTICED ) {</div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;Status: Noticed\n&quot;</span>);</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160; }</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;</div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160; <span class="comment">/* add file info */</span></div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160; <span class="keywordtype">char</span>* file = <a class="code" href="structmrparam__t.html#a23e24e8700e17ede6dd385fc90330f76">mrparam_get</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_FILE, NULL);</div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160; <span class="keywordflow">if</span>( file ) {</div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160; p = mr_mprintf(<span class="stringliteral">&quot;File: %s, %i bytes\n&quot;</span>, file, mr_get_filebytes(file)); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160; }</div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;</div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160; <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a> != MR_MSG_TEXT ) {</div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160; p = mr_mprintf(<span class="stringliteral">&quot;Type: %i\n&quot;</span>, msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160; }</div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;</div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160; <span class="keywordtype">int</span> w = <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_WIDTH, 0), h = <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_HEIGHT, 0);</div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160; <span class="keywordflow">if</span>( w != 0 || h != 0 ) {</div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160; p = mr_mprintf(<span class="stringliteral">&quot;Dimension: %i x %i\n&quot;</span>, w, h); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>&#160; }</div><div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>&#160;</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160; <span class="keywordtype">int</span> duration = <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_DURATION, 0);</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160; <span class="keywordflow">if</span>( duration != 0 ) {</div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160; p = mr_mprintf(<span class="stringliteral">&quot;Duration: %i ms\n&quot;</span>, duration); mrstrbuilder_cat(&amp;ret, p); free(p);</div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160; }</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160; <span class="comment">/* add rawtext */</span></div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160; <span class="keywordflow">if</span>( rawtxt &amp;&amp; rawtxt[0] ) {</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160; mrstrbuilder_cat(&amp;ret, <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160; mrstrbuilder_cat(&amp;ret, rawtxt);</div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160; }</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>&#160;</div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;cleanup:</div><div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160; free(rawtxt);</div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160; <span class="keywordflow">return</span> ret.m_buf;</div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;}</div><div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;</div><div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160;</div><div class="line"><a name="l04868"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#ab316ed8a30c968085fa503e6c215e2f1"> 4868</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#ab316ed8a30c968085fa503e6c215e2f1">mrmailbox_forward_msgs</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> uint32_t* msg_ids, <span class="keywordtype">int</span> msg_cnt, uint32_t chat_id)</div><div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;{</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160; <a class="code" href="structmrchat__t.html">mrchat_t</a>* chat = mrchat_new(mailbox);</div><div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160; <a class="code" href="structmrcontact__t.html">mrcontact_t</a>* contact = <a class="code" href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_new</a>();</div><div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160; <span class="keywordtype">int</span> locked = 0, transaction_pending = 0;</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160; carray* created_db_entries = carray_new(16);</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160; <span class="keywordtype">char</span>* idsstr = NULL, *q3 = NULL;</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160; sqlite3_stmt* stmt = NULL;</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160; time_t curr_timestamp;</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || msg_ids==NULL || msg_cnt &lt;= 0 || chat_id &lt;= MR_CHAT_ID_LAST_SPECIAL ) {</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160; }</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>&#160; locked = 1;</div><div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160; transaction_pending = 1;</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160; mrmailbox_unarchive_chat__(mailbox, chat_id);</div><div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;</div><div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160; mailbox-&gt;m_smtp-&gt;m_log_connect_errors = 1;</div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160; <span class="keywordflow">if</span>( !mrchat_load_from_db__(chat, chat_id) ) {</div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>&#160; }</div><div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>&#160;</div><div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160; curr_timestamp = mr_create_smeared_timestamps__(msg_cnt);</div><div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160; idsstr = mr_arr_to_string(msg_ids, msg_cnt);</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160; q3 = sqlite3_mprintf(<span class="stringliteral">&quot;SELECT id FROM msgs WHERE id IN(%s) ORDER BY timestamp,id&quot;</span>, idsstr);</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160; stmt = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, q3);</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160; <span class="keywordflow">while</span>( sqlite3_step(stmt)==SQLITE_ROW )</div><div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160; {</div><div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>&#160; <span class="keywordtype">int</span> src_msg_id = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160; <span class="keywordflow">if</span>( !mrmsg_load_from_db__(msg, mailbox, src_msg_id) ) {</div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160; }</div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;</div><div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160; <a class="code" href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_set_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_FORWARDED, 1);</div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160; uint32_t new_msg_id = mrmailbox_send_msg_i__(mailbox, chat, msg, curr_timestamp++);</div><div class="line"><a name="l04911"></a><span class="lineno"> 4911</span>&#160; carray_add(created_db_entries, (<span class="keywordtype">void</span>*)(uintptr_t)chat_id, NULL);</div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160; carray_add(created_db_entries, (<span class="keywordtype">void</span>*)(uintptr_t)new_msg_id, NULL);</div><div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>&#160; }</div><div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>&#160;</div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160; transaction_pending = 0;</div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;</div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;cleanup:</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160; <span class="keywordflow">if</span>( transaction_pending ) { mrsqlite3_rollback__(mailbox-&gt;m_sql); }</div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160; <span class="keywordflow">if</span>( locked ) { mrsqlite3_unlock(mailbox-&gt;m_sql); }</div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160; <span class="keywordflow">if</span>( created_db_entries ) {</div><div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160; <span class="keywordtype">size_t</span> i, icnt = carray_count(created_db_entries);</div><div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; icnt; i += 2 ) {</div><div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, (uintptr_t)carray_get(created_db_entries, i), (uintptr_t)carray_get(created_db_entries, i+1));</div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160; }</div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160; carray_free(created_db_entries);</div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160; }</div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160; <a class="code" href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_unref</a>(contact);</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160; <a class="code" href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_unref</a>(chat);</div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160; <span class="keywordflow">if</span>( stmt ) { sqlite3_finalize(stmt); }</div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160; free(idsstr);</div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160; <span class="keywordflow">if</span>( q3 ) { sqlite3_free(q3); }</div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;}</div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;</div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;</div><div class="line"><a name="l04954"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a8ed1c3bd08cd6515abf6046ebad9cafc"> 4954</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a8ed1c3bd08cd6515abf6046ebad9cafc">mrmailbox_star_msgs</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> uint32_t* msg_ids, <span class="keywordtype">int</span> msg_cnt, <span class="keywordtype">int</span> star)</div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;{</div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160; <span class="keywordtype">int</span> i;</div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;</div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || msg_ids == NULL || msg_cnt &lt;= 0 || (star!=0 &amp;&amp; star!=1) ) {</div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160; }</div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;</div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;</div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; msg_cnt; i++ )</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160; {</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_msgs_SET_starred_WHERE_id,</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160; <span class="stringliteral">&quot;UPDATE msgs SET starred=? WHERE id=?;&quot;</span>);</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160; sqlite3_bind_int(stmt, 1, star);</div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160; sqlite3_bind_int(stmt, 2, msg_ids[i]);</div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160; }</div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;}</div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;</div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;</div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;<span class="comment"> * Delete messages</span></div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;</div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;</div><div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160;<span class="comment">/* internal function */</span></div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160;<span class="keywordtype">void</span> mrmailbox_delete_msg_on_imap(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, mrjob_t* job)</div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;{</div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160; <span class="keywordtype">int</span> locked = 0, delete_from_server = 1;</div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;</div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160; locked = 1;</div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;</div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160; <span class="keywordflow">if</span>( !mrmsg_load_from_db__(msg, mailbox, job-&gt;m_foreign_id) ) {</div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160; }</div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;</div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160; <span class="keywordflow">if</span>( mrmailbox_rfc724_mid_cnt__(mailbox, msg-&gt;m_rfc724_mid) != 1 ) {</div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160; mrmailbox_log_info(mailbox, 0, <span class="stringliteral">&quot;The message is deleted from the server when all message are deleted.&quot;</span>);</div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160; delete_from_server = 0;</div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160; }</div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;</div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160; locked = 0;</div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160; <span class="comment">/* if this is the last existing part of the message, we delete the message from the server */</span></div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160; <span class="keywordflow">if</span>( delete_from_server )</div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160; {</div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160; <span class="keywordflow">if</span>( !mrimap_is_connected(mailbox-&gt;m_imap) ) {</div><div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160; mrmailbox_connect_to_imap(mailbox, NULL);</div><div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160; <span class="keywordflow">if</span>( !mrimap_is_connected(mailbox-&gt;m_imap) ) {</div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160; }</div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160; }</div><div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>&#160;</div><div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>&#160; <span class="keywordflow">if</span>( !mrimap_delete_msg(mailbox-&gt;m_imap, msg-&gt;m_rfc724_mid, msg-&gt;m_server_folder, msg-&gt;m_server_uid) )</div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160; {</div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160; }</div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160; }</div><div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>&#160;</div><div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>&#160; <span class="comment">/* we delete the database entry ...</span></div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;<span class="comment"> - if the message is successfully removed from the server</span></div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;<span class="comment"> - or if there are other parts of the messages in the database (in this case we have not deleted if from the server)</span></div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;<span class="comment"> (As long as the message is not removed from the IMAP-server, we need at least one database entry to avoid a re-download) */</span></div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160; locked = 1;</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, DELETE_FROM_msgs_WHERE_id, <span class="stringliteral">&quot;DELETE FROM msgs WHERE id=?;&quot;</span>);</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160; sqlite3_bind_int(stmt, 1, msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>);</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;</div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160; <span class="keywordtype">char</span>* pathNfilename = <a class="code" href="structmrparam__t.html#a23e24e8700e17ede6dd385fc90330f76">mrparam_get</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_FILE, NULL);</div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160; <span class="keywordflow">if</span>( pathNfilename ) {</div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160; <span class="keywordflow">if</span>( strncmp(mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>, pathNfilename, strlen(mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>))==0 )</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160; {</div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160; <span class="keywordtype">char</span>* strLikeFilename = mr_mprintf(<span class="stringliteral">&quot;%%f=%s%%&quot;</span>, pathNfilename);</div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160; sqlite3_stmt* stmt2 = mrsqlite3_prepare_v2_(mailbox-&gt;m_sql, <span class="stringliteral">&quot;SELECT id FROM msgs WHERE type!=? AND param LIKE ?;&quot;</span>); <span class="comment">/* if this gets too slow, an index over &quot;type&quot; should help. */</span></div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160; sqlite3_bind_int (stmt2, 1, MR_MSG_TEXT);</div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160; sqlite3_bind_text(stmt2, 2, strLikeFilename, -1, SQLITE_STATIC);</div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160; <span class="keywordtype">int</span> file_used_by_other_msgs = (sqlite3_step(stmt2)==SQLITE_ROW)? 1 : 0;</div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160; free(strLikeFilename);</div><div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160; sqlite3_finalize(stmt2);</div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160; <span class="keywordflow">if</span>( !file_used_by_other_msgs )</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160; {</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160; mr_delete_file(pathNfilename, mailbox);</div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;</div><div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>&#160; <span class="keywordtype">char</span>* increation_file = mr_mprintf(<span class="stringliteral">&quot;%s.increation&quot;</span>, pathNfilename);</div><div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>&#160; mr_delete_file(increation_file, mailbox);</div><div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160; free(increation_file);</div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;</div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160; <span class="keywordtype">char</span>* filenameOnly = mr_get_filename(pathNfilename);</div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160; <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>==MR_MSG_VOICE ) {</div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160; <span class="keywordtype">char</span>* waveform_file = mr_mprintf(<span class="stringliteral">&quot;%s/%s.waveform&quot;</span>, mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>, filenameOnly);</div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160; mr_delete_file(waveform_file, mailbox);</div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160; free(waveform_file);</div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160; }</div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">m_type</a>==MR_MSG_VIDEO ) {</div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160; <span class="keywordtype">char</span>* preview_file = mr_mprintf(<span class="stringliteral">&quot;%s/%s-preview.jpg&quot;</span>, mailbox-&gt;<a class="code" href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">m_blobdir</a>, filenameOnly);</div><div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160; mr_delete_file(preview_file, mailbox);</div><div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>&#160; free(preview_file);</div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160; }</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160; free(filenameOnly);</div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160; }</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160; }</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160; free(pathNfilename);</div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160; }</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;</div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160; locked = 0;</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;cleanup:</div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>&#160; }</div><div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>&#160;}</div><div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>&#160;</div><div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;</div><div class="line"><a name="l05096"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#adf02bfc046577b46e1f0f5a31869890f"> 5096</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#adf02bfc046577b46e1f0f5a31869890f">mrmailbox_delete_msgs</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> uint32_t* msg_ids, <span class="keywordtype">int</span> msg_cnt)</div><div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;{</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160; <span class="keywordtype">int</span> i;</div><div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;</div><div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || msg_ids == NULL || msg_cnt &lt;= 0 ) {</div><div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>&#160; }</div><div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;</div><div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;</div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; msg_cnt; i++ )</div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160; {</div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160; mrmailbox_update_msg_chat_id__(mailbox, msg_ids[i], MR_CHAT_ID_TRASH);</div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160; mrjob_add__(mailbox, MRJ_DELETE_MSG_ON_IMAP, msg_ids[i], NULL); <span class="comment">/* results in a call to mrmailbox_delete_msg_on_imap() */</span></div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160; }</div><div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;</div><div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;}</div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;</div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;</div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;<span class="comment"> * mark message as seen</span></div><div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;</div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;</div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;<span class="keywordtype">void</span> mrmailbox_markseen_msg_on_imap(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, mrjob_t* job)</div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;{</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160; <span class="keywordtype">int</span> locked = 0;</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160; <a class="code" href="structmrmsg__t.html">mrmsg_t</a>* msg = <a class="code" href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_new</a>();</div><div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>&#160; <span class="keywordtype">char</span>* new_server_folder = NULL;</div><div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>&#160; uint32_t new_server_uid = 0;</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160; <span class="keywordtype">int</span> in_ms_flags = 0, out_ms_flags = 0;</div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;</div><div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160; <span class="keywordflow">if</span>( !mrimap_is_connected(mailbox-&gt;m_imap) ) {</div><div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160; mrmailbox_connect_to_imap(mailbox, NULL);</div><div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160; <span class="keywordflow">if</span>( !mrimap_is_connected(mailbox-&gt;m_imap) ) {</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160; }</div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160; }</div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;</div><div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160; locked = 1;</div><div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;</div><div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160; <span class="keywordflow">if</span>( !mrmsg_load_from_db__(msg, mailbox, job-&gt;m_foreign_id) ) {</div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>&#160; }</div><div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>&#160;</div><div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160; <span class="comment">/* add an additional job for sending the MDN (here in a thread for fast ui resonses) (an extra job as the MDN has a lower priority) */</span></div><div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160; <span class="keywordflow">if</span>( <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(msg-&gt;<a class="code" href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">m_param</a>, MRP_WANTS_MDN, 0) <span class="comment">/* MRP_WANTS_MDN is set only for one part of a multipart-message */</span></div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160; &amp;&amp; mrsqlite3_get_config_int__(mailbox-&gt;m_sql, <span class="stringliteral">&quot;mdns_enabled&quot;</span>, MR_MDNS_DEFAULT_ENABLED) ) {</div><div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160; in_ms_flags |= MR_MS_SET_MDNSent_FLAG;</div><div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160; }</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;</div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160; locked = 0;</div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;</div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160; <span class="keywordflow">if</span>( msg-&gt;<a class="code" href="structmrmsg__t.html#aa4fbc319d61c755ce929e658ad75b21e">m_is_msgrmsg</a> ) {</div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160; in_ms_flags |= MR_MS_ALSO_MOVE;</div><div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160; }</div><div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160;</div><div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160; <span class="keywordflow">if</span>( mrimap_markseen_msg(mailbox-&gt;m_imap, msg-&gt;m_server_folder, msg-&gt;m_server_uid,</div><div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160; in_ms_flags, &amp;new_server_folder, &amp;new_server_uid, &amp;out_ms_flags) != 0 )</div><div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>&#160; {</div><div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160; <span class="keywordflow">if</span>( (new_server_folder &amp;&amp; new_server_uid) || out_ms_flags&amp;MR_MS_MDNSent_JUST_SET )</div><div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160; {</div><div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160; locked = 1;</div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;</div><div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160; <span class="keywordflow">if</span>( new_server_folder &amp;&amp; new_server_uid )</div><div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160; {</div><div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160; mrmailbox_update_server_uid__(mailbox, msg-&gt;m_rfc724_mid, new_server_folder, new_server_uid);</div><div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160; }</div><div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;</div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160; <span class="keywordflow">if</span>( out_ms_flags&amp;MR_MS_MDNSent_JUST_SET )</div><div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160; {</div><div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160; mrjob_add__(mailbox, MRJ_SEND_MDN, msg-&gt;<a class="code" href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">m_id</a>, NULL); <span class="comment">/* results in a call to mrmailbox_send_mdn() */</span></div><div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160; }</div><div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160; locked = 0;</div><div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160; }</div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160; }</div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160; {</div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160; }</div><div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;</div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160;cleanup:</div><div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160; <span class="keywordflow">if</span>( locked ) {</div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160; }</div><div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160; <a class="code" href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_unref</a>(msg);</div><div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160; free(new_server_folder);</div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;}</div><div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;</div><div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;</div><div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;<span class="keywordtype">void</span> mrmailbox_markseen_mdn_on_imap(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, mrjob_t* job)</div><div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;{</div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160; <span class="keywordtype">char</span>* server_folder = <a class="code" href="structmrparam__t.html#a23e24e8700e17ede6dd385fc90330f76">mrparam_get</a> (job-&gt;m_param, MRP_SERVER_FOLDER, NULL);</div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160; uint32_t server_uid = <a class="code" href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_get_int</a>(job-&gt;m_param, MRP_SERVER_UID, 0);</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160; <span class="keywordtype">char</span>* new_server_folder = NULL;</div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160; uint32_t new_server_uid = 0;</div><div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160; <span class="keywordtype">int</span> out_ms_flags = 0;</div><div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160; <span class="keywordflow">if</span>( !mrimap_is_connected(mailbox-&gt;m_imap) ) {</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160; mrmailbox_connect_to_imap(mailbox, NULL);</div><div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>&#160; <span class="keywordflow">if</span>( !mrimap_is_connected(mailbox-&gt;m_imap) ) {</div><div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160; }</div><div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160; }</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;</div><div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160; <span class="keywordflow">if</span>( mrimap_markseen_msg(mailbox-&gt;m_imap, server_folder, server_uid, MR_MS_ALSO_MOVE, &amp;new_server_folder, &amp;new_server_uid, &amp;out_ms_flags) == 0 ) {</div><div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160; }</div><div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>&#160;</div><div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160;cleanup:</div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160; free(server_folder);</div><div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160; free(new_server_folder);</div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;}</div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;</div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;</div><div class="line"><a name="l05237"></a><span class="lineno"><a class="line" href="structmrmailbox__t.html#a67281e50b568dc18df710275e0e13f5b"> 5237</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="structmrmailbox__t.html#a67281e50b568dc18df710275e0e13f5b">mrmailbox_markseen_msgs</a>(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, <span class="keyword">const</span> uint32_t* msg_ids, <span class="keywordtype">int</span> msg_cnt)</div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;{</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160; <span class="keywordtype">int</span> i, send_event = 0;</div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;</div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || msg_ids == NULL || msg_cnt &lt;= 0 ) {</div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>&#160; }</div><div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>&#160;</div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160; mrsqlite3_begin_transaction__(mailbox-&gt;m_sql);</div><div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;</div><div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>&#160; <span class="keywordflow">for</span>( i = 0; i &lt; msg_cnt; i++ )</div><div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160; {</div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_msgs_SET_seen_WHERE_id_AND_chat_id_AND_freshORnoticed,</div><div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160; <span class="stringliteral">&quot;UPDATE msgs SET state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_SEEN)</div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160; <span class="stringliteral">&quot; WHERE id=? AND chat_id&gt;&quot;</span> MR_STRINGIFY(MR_CHAT_ID_LAST_SPECIAL) <span class="stringliteral">&quot; AND (state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_FRESH) <span class="stringliteral">&quot; OR state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_NOTICED) <span class="stringliteral">&quot;);&quot;</span>);</div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160; sqlite3_bind_int(stmt, 1, msg_ids[i]);</div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160; <span class="keywordflow">if</span>( sqlite3_changes(mailbox-&gt;m_sql-&gt;m_cobj) )</div><div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>&#160; {</div><div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>&#160; mrmailbox_log_info(mailbox, 0, <span class="stringliteral">&quot;Seen message #%i.&quot;</span>, msg_ids[i]);</div><div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>&#160; mrjob_add__(mailbox, MRJ_MARKSEEN_MSG_ON_IMAP, msg_ids[i], NULL); <span class="comment">/* results in a call to mrmailbox_markseen_msg_on_imap() */</span></div><div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160; send_event = 1;</div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160; }</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160; {</div><div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>&#160; <span class="comment">/* message may be in contact requests, mark as NOTICED, this does not force IMAP updated nor send MDNs */</span></div><div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160; sqlite3_stmt* stmt2 = mrsqlite3_predefine__(mailbox-&gt;m_sql, UPDATE_msgs_SET_noticed_WHERE_id_AND_fresh,</div><div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160; <span class="stringliteral">&quot;UPDATE msgs SET state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_NOTICED)</div><div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160; <span class="stringliteral">&quot; WHERE id=? AND state=&quot;</span> MR_STRINGIFY(MR_STATE_IN_FRESH) <span class="stringliteral">&quot;;&quot;</span>);</div><div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>&#160; sqlite3_bind_int(stmt2, 1, msg_ids[i]);</div><div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>&#160; sqlite3_step(stmt2);</div><div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160; <span class="keywordflow">if</span>( sqlite3_changes(mailbox-&gt;m_sql-&gt;m_cobj) ) {</div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160; send_event = 1;</div><div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160; }</div><div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>&#160; }</div><div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160; }</div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160; mrsqlite3_commit__(mailbox-&gt;m_sql);</div><div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;</div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160; <span class="comment">/* the event us needed eg. to remove the deaddrop from the chatlist */</span></div><div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160; <span class="keywordflow">if</span>( send_event ) {</div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160; mailbox-&gt;m_cb(mailbox, MR_EVENT_MSGS_CHANGED, 0, 0);</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160; }</div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;}</div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;</div><div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;</div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;<span class="keywordtype">int</span> mrmailbox_mdn_from_ext__(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, uint32_t from_id, <span class="keyword">const</span> <span class="keywordtype">char</span>* rfc724_mid,</div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160; uint32_t* ret_chat_id,</div><div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160; uint32_t* ret_msg_id)</div><div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;{</div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || from_id &lt;= MR_CONTACT_ID_LAST_SPECIAL || rfc724_mid == NULL || ret_chat_id==NULL || ret_msg_id==NULL</div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160; || *ret_chat_id != 0 || *ret_msg_id != 0 ) {</div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160; }</div><div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160;</div><div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160; sqlite3_stmt* stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_it_FROM_msgs_JOIN_chats_WHERE_rfc724,</div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160; <span class="stringliteral">&quot;SELECT m.id, c.id, c.type, m.state FROM msgs m &quot;</span></div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160; <span class="stringliteral">&quot; LEFT JOIN chats c ON m.chat_id=c.id &quot;</span></div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160; <span class="stringliteral">&quot; WHERE rfc724_mid=? AND from_id=1 &quot;</span></div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160; <span class="stringliteral">&quot; ORDER BY m.id;&quot;</span>); <span class="comment">/* the ORDER BY makes sure, if one rfc724_mid is splitted into its parts, we always catch the same one. However, we do not send multiparts, we do not request MDNs for multiparts, and should not receive read requests for multiparts. So this is currently more theoretical. */</span></div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160; sqlite3_bind_text(stmt, 1, rfc724_mid, -1, SQLITE_STATIC);</div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160; }</div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;</div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160; *ret_msg_id = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>&#160; *ret_chat_id = sqlite3_column_int(stmt, 1);</div><div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>&#160; <span class="keywordtype">int</span> chat_type = sqlite3_column_int(stmt, 2);</div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160; <span class="keywordtype">int</span> msg_state = sqlite3_column_int(stmt, 3);</div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;</div><div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160; <span class="keywordflow">if</span>( msg_state!=MR_STATE_OUT_PENDING &amp;&amp; msg_state!=MR_STATE_OUT_DELIVERED ) {</div><div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>&#160; <span class="keywordflow">return</span> 0; <span class="comment">/* eg. already marked as MDNS_RCVD. however, it is importent, that the message ID is set above as this will allow the caller eg. to move the message away */</span></div><div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160; }</div><div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;</div><div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160; <span class="comment">/* normal chat? that&#39;s quite easy. */</span></div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160; <span class="keywordflow">if</span>( chat_type == MR_CHAT_TYPE_NORMAL )</div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160; {</div><div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160; mrmailbox_update_msg_state__(mailbox, *ret_msg_id, MR_STATE_OUT_MDN_RCVD);</div><div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160; <span class="keywordflow">return</span> 1; <span class="comment">/* send event about new state */</span></div><div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>&#160; }</div><div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160; <span class="comment">/* group chat: collect receipt senders */</span></div><div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_c_FROM_msgs_mdns_WHERE_mc, <span class="stringliteral">&quot;SELECT contact_id FROM msgs_mdns WHERE msg_id=? AND contact_id=?;&quot;</span>);</div><div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>&#160; sqlite3_bind_int(stmt, 1, *ret_msg_id);</div><div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160; sqlite3_bind_int(stmt, 2, from_id);</div><div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, INSERT_INTO_msgs_mdns, <span class="stringliteral">&quot;INSERT INTO msgs_mdns (msg_id, contact_id) VALUES (?, ?);&quot;</span>);</div><div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160; sqlite3_bind_int(stmt, 1, *ret_msg_id);</div><div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>&#160; sqlite3_bind_int(stmt, 2, from_id);</div><div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160; }</div><div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;</div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, SELECT_COUNT_FROM_msgs_mdns_WHERE_m, <span class="stringliteral">&quot;SELECT COUNT(*) FROM msgs_mdns WHERE msg_id=?;&quot;</span>);</div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160; sqlite3_bind_int(stmt, 1, *ret_msg_id);</div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160; <span class="keywordflow">if</span>( sqlite3_step(stmt) != SQLITE_ROW ) {</div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160; <span class="keywordflow">return</span> 0; <span class="comment">/* error */</span></div><div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160; }</div><div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;</div><div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160;<span class="comment"> Groupsize: Min. MDNs</span></div><div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;<span class="comment"> 1 S n/a</span></div><div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;<span class="comment"> 2 SR 1</span></div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;<span class="comment"> 3 SRR 2</span></div><div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;<span class="comment"> 4 SRRR 2</span></div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;<span class="comment"> 5 SRRRR 3</span></div><div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160;<span class="comment"> 6 SRRRRR 3</span></div><div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;<span class="comment"> (S=Sender, R=Recipient)</span></div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160; <span class="keywordtype">int</span> ist_cnt = sqlite3_column_int(stmt, 0);</div><div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>&#160; <span class="keywordtype">int</span> soll_cnt = (mrmailbox_get_chat_contact_count__(mailbox, *ret_chat_id)+1<span class="comment">/*for rounding, SELF is already included!*/</span>) / 2;</div><div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>&#160; <span class="keywordflow">if</span>( ist_cnt &lt; soll_cnt ) {</div><div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>&#160; <span class="keywordflow">return</span> 0; <span class="comment">/* wait for more receipts */</span></div><div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160; }</div><div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;</div><div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160; <span class="comment">/* got enough receipts :-) */</span></div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160; stmt = mrsqlite3_predefine__(mailbox-&gt;m_sql, DELETE_FROM_msgs_mdns_WHERE_m, <span class="stringliteral">&quot;DELETE FROM msgs_mdns WHERE msg_id=?;&quot;</span>);</div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160; sqlite3_bind_int(stmt, 1, *ret_msg_id);</div><div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>&#160; sqlite3_step(stmt);</div><div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>&#160;</div><div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160; mrmailbox_update_msg_state__(mailbox, *ret_msg_id, MR_STATE_OUT_MDN_RCVD);</div><div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160; <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160;}</div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;</div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;<span class="keywordtype">void</span> mrmailbox_send_mdn(<a class="code" href="structmrmailbox__t.html">mrmailbox_t</a>* mailbox, mrjob_t* job)</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;{</div><div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160; mrmimefactory_t mimefactory;</div><div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160; mrmimefactory_init(&amp;mimefactory, mailbox);</div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;</div><div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160; <span class="keywordflow">if</span>( mailbox == NULL || job == NULL ) {</div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>&#160; }</div><div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>&#160;</div><div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160; <span class="comment">/* connect to SMTP server, if not yet done */</span></div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160; <span class="keywordflow">if</span>( !mrsmtp_is_connected(mailbox-&gt;m_smtp) ) {</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160; mrloginparam_t* loginparam = mrloginparam_new();</div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160; mrsqlite3_lock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160; mrloginparam_read__(loginparam, mailbox-&gt;m_sql, <span class="stringliteral">&quot;configured_&quot;</span>);</div><div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160; mrsqlite3_unlock(mailbox-&gt;m_sql);</div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160; <span class="keywordtype">int</span> connected = mrsmtp_connect(mailbox-&gt;m_smtp, loginparam);</div><div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160; mrloginparam_unref(loginparam);</div><div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160; <span class="keywordflow">if</span>( !connected ) {</div><div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160; mrjob_try_again_later(job, MR_STANDARD_DELAY);</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160; }</div><div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>&#160; }</div><div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>&#160;</div><div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160; <span class="keywordflow">if</span>( !mrmimefactory_load_mdn(&amp;mimefactory, job-&gt;m_foreign_id)</div><div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>&#160; || !mrmimefactory_render(&amp;mimefactory, 0<span class="comment">/*encrypt to self*/</span>) ) {</div><div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160; }</div><div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;</div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160; <span class="comment">//char* t1=mr_null_terminate(mimefactory.m_out-&gt;str,mimefactory.m_out-&gt;len);printf(&quot;~~~~~MDN~~~~~\n%s\n~~~~~/MDN~~~~~&quot;,t1);free(t1); // DEBUG OUTPUT</span></div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;</div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160; <span class="keywordflow">if</span>( !mrsmtp_send_msg(mailbox-&gt;m_smtp, mimefactory.m_recipients_addr, mimefactory.m_out-&gt;str, mimefactory.m_out-&gt;len) ) {</div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160; mrsmtp_disconnect(mailbox-&gt;m_smtp);</div><div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160; mrjob_try_again_later(job, MR_AT_ONCE); <span class="comment">/* MR_AT_ONCE is only the _initial_ delay, if the second try failes, the delay gets larger */</span></div><div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160; }</div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;</div><div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;cleanup:</div><div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>&#160; mrmimefactory_empty(&amp;mimefactory);</div><div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;}</div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;</div><div class="ttc" id="structmrmsg__t_html_aa4fbc319d61c755ce929e658ad75b21e"><div class="ttname"><a href="structmrmsg__t.html#aa4fbc319d61c755ce929e658ad75b21e">mrmsg_t::m_is_msgrmsg</a></div><div class="ttdeci">int m_is_msgrmsg</div><div class="ttdoc">Set to 1 if the message was sent by another messenger. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00075">mrmsg.h:75</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a25720ea41355cc32cc93aa45709937d6"><div class="ttname"><a href="structmrmailbox__t.html#a25720ea41355cc32cc93aa45709937d6">mrmailbox_t::mrmailbox_add_address_book</a></div><div class="ttdeci">int mrmailbox_add_address_book(mrmailbox_t *mailbox, const char *adr_book)</div><div class="ttdoc">Add a number of contacts. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04021">mrmailbox.c:4021</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a47156db87107ec208d6637f460d897a8"><div class="ttname"><a href="structmrmailbox__t.html#a47156db87107ec208d6637f460d897a8">mrmailbox_t::mrmailbox_create_group_chat</a></div><div class="ttdeci">uint32_t mrmailbox_create_group_chat(mrmailbox_t *mailbox, const char *chat_name)</div><div class="ttdoc">Create a new group chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03333">mrmailbox.c:3333</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_aa089e97e7ca1add16c10d5cc0e902824"><div class="ttname"><a href="structmrmailbox__t.html#aa089e97e7ca1add16c10d5cc0e902824">mrmailbox_t::mrmailbox_create_contact</a></div><div class="ttdeci">uint32_t mrmailbox_create_contact(mrmailbox_t *mailbox, const char *name, const char *addr)</div><div class="ttdoc">Add a single contact. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03985">mrmailbox.c:3985</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a3f9ac5fb9ff2dcbaafdddb5d955ac39b"><div class="ttname"><a href="structmrmailbox__t.html#a3f9ac5fb9ff2dcbaafdddb5d955ac39b">mrmailbox_t::mrmailbox_send_text_msg</a></div><div class="ttdeci">uint32_t mrmailbox_send_text_msg(mrmailbox_t *mailbox, uint32_t chat_id, const char *text_to_send)</div><div class="ttdoc">Send a simple text message to the given chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03101">mrmailbox.c:3101</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a75011d103515e088e950a64d0706ec86"><div class="ttname"><a href="structmrmailbox__t.html#a75011d103515e088e950a64d0706ec86">mrmailbox_t::mrmailbox_close</a></div><div class="ttdeci">void mrmailbox_close(mrmailbox_t *mailbox)</div><div class="ttdoc">Close mailbox database. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01075">mrmailbox.c:1075</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a32825e3e0a1b16679580704a4b43db1a"><div class="ttname"><a href="structmrmailbox__t.html#a32825e3e0a1b16679580704a4b43db1a">mrmailbox_t::mrmailbox_new</a></div><div class="ttdeci">mrmailbox_t * mrmailbox_new(mrmailboxcb_t cb, void *userdata, const char *os_name)</div><div class="ttdoc">Create a new mailbox object. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l00897">mrmailbox.c:897</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_ae37988665a3d46f42a7e8199d18735c2"><div class="ttname"><a href="structmrmailbox__t.html#ae37988665a3d46f42a7e8199d18735c2">mrmailbox_t::mrmailbox_is_contact_in_chat</a></div><div class="ttdeci">int mrmailbox_is_contact_in_chat(mrmailbox_t *mailbox, uint32_t chat_id, uint32_t contact_id)</div><div class="ttdoc">Check if a given contact ID is a member of a group chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03565">mrmailbox.c:3565</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_ad106b9c23b3a559b524a37bb5504e096"><div class="ttname"><a href="structmrmailbox__t.html#ad106b9c23b3a559b524a37bb5504e096">mrmailbox_t::mrmailbox_get_chat</a></div><div class="ttdeci">mrchat_t * mrmailbox_get_chat(mrmailbox_t *mailbox, uint32_t chat_id)</div><div class="ttdoc">Get a chat object of type mrchat_t by a chat_id. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01709">mrmailbox.c:1709</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a40226d401548b002a62648ea054ac635"><div class="ttname"><a href="structmrmailbox__t.html#a40226d401548b002a62648ea054ac635">mrmailbox_t::mrmailbox_remove_contact_from_chat</a></div><div class="ttdeci">int mrmailbox_remove_contact_from_chat(mrmailbox_t *mailbox, uint32_t chat_id, uint32_t contact_id)</div><div class="ttdoc">Remove a member from a group. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03678">mrmailbox.c:3678</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_ae4c9c9f9ce4b3de82b3ce7fc582cbc5b"><div class="ttname"><a href="structmrmailbox__t.html#ae4c9c9f9ce4b3de82b3ce7fc582cbc5b">mrmailbox_t::mrmailbox_open</a></div><div class="ttdeci">int mrmailbox_open(mrmailbox_t *mailbox, const char *dbfile, const char *blobdir)</div><div class="ttdoc">Open mailbox database. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01010">mrmailbox.c:1010</a></div></div>
<div class="ttc" id="structmrcontact__t_html"><div class="ttname"><a href="structmrcontact__t.html">mrcontact_t</a></div><div class="ttdoc">An object representing a single contact in memory. </div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8h_source.html#l00038">mrcontact.h:38</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a209732d105e40cd0c61d33d76d288c59"><div class="ttname"><a href="structmrmailbox__t.html#a209732d105e40cd0c61d33d76d288c59">mrmailbox_t::mrmailbox_delete_contact</a></div><div class="ttdeci">int mrmailbox_delete_contact(mrmailbox_t *mailbox, uint32_t contact_id)</div><div class="ttdoc">Delete a contact. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04509">mrmailbox.c:4509</a></div></div>
<div class="ttc" id="structmrchatlist__t_html"><div class="ttname"><a href="structmrchatlist__t.html">mrchatlist_t</a></div><div class="ttdoc">An object representing a single chatlist in memory. </div><div class="ttdef"><b>Definition:</b> <a href="mrchatlist_8h_source.html#l00042">mrchatlist.h:42</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a5d3be6ed21d43cc93f250a1e7faf979b"><div class="ttname"><a href="structmrmailbox__t.html#a5d3be6ed21d43cc93f250a1e7faf979b">mrmailbox_t::mrmailbox_get_chat_msgs</a></div><div class="ttdeci">carray * mrmailbox_get_chat_msgs(mrmailbox_t *mailbox, uint32_t chat_id, uint32_t flags, uint32_t marker1before)</div><div class="ttdoc">Get all message IDs belonging to a chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02120">mrmailbox.c:2120</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a8ed1c3bd08cd6515abf6046ebad9cafc"><div class="ttname"><a href="structmrmailbox__t.html#a8ed1c3bd08cd6515abf6046ebad9cafc">mrmailbox_t::mrmailbox_star_msgs</a></div><div class="ttdeci">void mrmailbox_star_msgs(mrmailbox_t *mailbox, const uint32_t *msg_ids, int msg_cnt, int star)</div><div class="ttdoc">Star/unstar messages by setting the last parameter to 0 (unstar) or 1(star). </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04954">mrmailbox.c:4954</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a27cceecdc6b41f34d7dbf8b6d8dcf18d"><div class="ttname"><a href="structmrmailbox__t.html#a27cceecdc6b41f34d7dbf8b6d8dcf18d">mrmailbox_t::mrmailbox_search_msgs</a></div><div class="ttdeci">carray * mrmailbox_search_msgs(mrmailbox_t *mailbox, uint32_t chat_id, const char *query)</div><div class="ttdoc">Search messages containing the given query string. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02224">mrmailbox.c:2224</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a19b3e9f5209bc326fc77f3944522e8ad"><div class="ttname"><a href="structmrmailbox__t.html#a19b3e9f5209bc326fc77f3944522e8ad">mrmailbox_t::mrmailbox_set_config</a></div><div class="ttdeci">int mrmailbox_set_config(mrmailbox_t *ths, const char *key, const char *value)</div><div class="ttdoc">Configure the mailbox. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01176">mrmailbox.c:1176</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_aab18660500768b611373190720439956"><div class="ttname"><a href="structmrmailbox__t.html#aab18660500768b611373190720439956">mrmailbox_t::m_dbfile</a></div><div class="ttdeci">char * m_dbfile</div><div class="ttdoc">the database file in file. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8h_source.html#l00144">mrmailbox.h:144</a></div></div>
<div class="ttc" id="structmrmailbox__t_html"><div class="ttname"><a href="structmrmailbox__t.html">mrmailbox_t</a></div><div class="ttdoc">An object representing a single mailbox. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8h_source.html#l00141">mrmailbox.h:141</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_adf02bfc046577b46e1f0f5a31869890f"><div class="ttname"><a href="structmrmailbox__t.html#adf02bfc046577b46e1f0f5a31869890f">mrmailbox_t::mrmailbox_delete_msgs</a></div><div class="ttdeci">void mrmailbox_delete_msgs(mrmailbox_t *mailbox, const uint32_t *msg_ids, int msg_cnt)</div><div class="ttdoc">Delete a list of messages. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l05096">mrmailbox.c:5096</a></div></div>
<div class="ttc" id="structmrchat__t_html_a3b1befb4542c1bad915f2175c7c2a2b9"><div class="ttname"><a href="structmrchat__t.html#a3b1befb4542c1bad915f2175c7c2a2b9">mrchat_t::mrchat_unref</a></div><div class="ttdeci">void mrchat_unref(mrchat_t *chat)</div><div class="ttdoc">Free a chat object. </div><div class="ttdef"><b>Definition:</b> <a href="mrchat_8c_source.html#l00160">mrchat.c:160</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_aace7cd8b68f45b869956d5c7476a1da0"><div class="ttname"><a href="structmrmailbox__t.html#aace7cd8b68f45b869956d5c7476a1da0">mrmailbox_t::mrmailbox_is_open</a></div><div class="ttdeci">int mrmailbox_is_open(const mrmailbox_t *mailbox)</div><div class="ttdoc">Check if a given mailbox database is open. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01109">mrmailbox.c:1109</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a8e04e43dacbe3128afd71e1d6c1b0911"><div class="ttname"><a href="structmrmailbox__t.html#a8e04e43dacbe3128afd71e1d6c1b0911">mrmailbox_t::mrmailbox_archive_chat</a></div><div class="ttdeci">void mrmailbox_archive_chat(mrmailbox_t *mailbox, uint32_t chat_id, int archive)</div><div class="ttdoc">Archive or unarchive a chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02652">mrmailbox.c:2652</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a4b3257b21c3c9ff539fc6a9315be1164"><div class="ttname"><a href="structmrmailbox__t.html#a4b3257b21c3c9ff539fc6a9315be1164">mrmailbox_t::mrmailbox_get_info</a></div><div class="ttdeci">char * mrmailbox_get_info(mrmailbox_t *mailbox)</div><div class="ttdoc">Get information about the mailbox. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01292">mrmailbox.c:1292</a></div></div>
<div class="ttc" id="structmrmsg__t_html_a3896e269c90cbf0f563ab0848fb44c65"><div class="ttname"><a href="structmrmsg__t.html#a3896e269c90cbf0f563ab0848fb44c65">mrmsg_t::m_type</a></div><div class="ttdeci">int m_type</div><div class="ttdoc">Message type as one of the MR_MSG_* contstants. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00060">mrmsg.h:60</a></div></div>
<div class="ttc" id="structmrmsg__t_html_ac19bdc40e452c8997dd58474a7be6880"><div class="ttname"><a href="structmrmsg__t.html#ac19bdc40e452c8997dd58474a7be6880">mrmsg_t::m_chat_id</a></div><div class="ttdeci">uint32_t m_chat_id</div><div class="ttdoc">Chat ID the message belongs to. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00049">mrmsg.h:49</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a96368620971935c7ac4a0bb324ece2c9"><div class="ttname"><a href="structmrmailbox__t.html#a96368620971935c7ac4a0bb324ece2c9">mrmailbox_t::mrmailbox_add_contact_to_chat</a></div><div class="ttdeci">int mrmailbox_add_contact_to_chat(mrmailbox_t *mailbox, uint32_t chat_id, uint32_t contact_id)</div><div class="ttdoc">Add a member to a group. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03595">mrmailbox.c:3595</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a90b7861302d1276a07fdcb2d9c3c73b6"><div class="ttname"><a href="structmrmailbox__t.html#a90b7861302d1276a07fdcb2d9c3c73b6">mrmailbox_t::mrmailbox_get_next_media</a></div><div class="ttdeci">uint32_t mrmailbox_get_next_media(mrmailbox_t *mailbox, uint32_t curr_msg_id, int dir)</div><div class="ttdoc">Returns all message IDs of the given types in a chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01927">mrmailbox.c:1927</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a74bd83d36d90e1201e5ab8003d9a312f"><div class="ttname"><a href="structmrmailbox__t.html#a74bd83d36d90e1201e5ab8003d9a312f">mrmailbox_t::mrmailbox_get_version_str</a></div><div class="ttdeci">char * mrmailbox_get_version_str(void)</div><div class="ttdoc">Find out the version of the Delta Chat core library. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01490">mrmailbox.c:1490</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a7c7921ff7b7f2e10dc30522af980b785"><div class="ttname"><a href="structmrmailbox__t.html#a7c7921ff7b7f2e10dc30522af980b785">mrmailbox_t::mrmailbox_disconnect</a></div><div class="ttdeci">void mrmailbox_disconnect(mrmailbox_t *mailbox)</div><div class="ttdoc">Disonnect the mailbox from the server. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01605">mrmailbox.c:1605</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a0ea304d47a08116f6eda8f1c80e5a930"><div class="ttname"><a href="structmrmailbox__t.html#a0ea304d47a08116f6eda8f1c80e5a930">mrmailbox_t::m_blobdir</a></div><div class="ttdeci">char * m_blobdir</div><div class="ttdoc">full path of the blob directory in use. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8h_source.html#l00145">mrmailbox.h:145</a></div></div>
<div class="ttc" id="structmrcontact__t_html_a11d19a7e25ce069131b9b6c629af440a"><div class="ttname"><a href="structmrcontact__t.html#a11d19a7e25ce069131b9b6c629af440a">mrcontact_t::mrcontact_new</a></div><div class="ttdeci">mrcontact_t * mrcontact_new()</div><div class="ttdoc">Create a new contact object in memory. </div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8c_source.html#l00032">mrcontact.c:32</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_adbdcde6475db0cfafd8aa127b5bd1bc1"><div class="ttname"><a href="structmrmailbox__t.html#adbdcde6475db0cfafd8aa127b5bd1bc1">mrmailbox_t::mrmailbox_get_fresh_msgs</a></div><div class="ttdeci">carray * mrmailbox_get_fresh_msgs(mrmailbox_t *mailbox)</div><div class="ttdoc">Returns the message IDs of all fresh messages of any chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02052">mrmailbox.c:2052</a></div></div>
<div class="ttc" id="structmrmsg__t_html_a80f470eb34af414ff28e7d3b3c715b48"><div class="ttname"><a href="structmrmsg__t.html#a80f470eb34af414ff28e7d3b3c715b48">mrmsg_t::mrmsg_new</a></div><div class="ttdeci">mrmsg_t * mrmsg_new()</div><div class="ttdoc">Create new message object. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8c_source.html#l00041">mrmsg.c:41</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a88ef3066cec30fe26f61f273b233d90c"><div class="ttname"><a href="structmrmailbox__t.html#a88ef3066cec30fe26f61f273b233d90c">mrmailbox_t::mrmailbox_send_msg</a></div><div class="ttdeci">uint32_t mrmailbox_send_msg(mrmailbox_t *mailbox, uint32_t chat_id, mrmsg_t *msg)</div><div class="ttdoc">save message in database and send it, the given message object is not unref&amp;#39;d by the function but som...</div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03142">mrmailbox.c:3142</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a67eef5ffc3369b8ad09326471b0a266f"><div class="ttname"><a href="structmrmailbox__t.html#a67eef5ffc3369b8ad09326471b0a266f">mrmailbox_t::mrmailbox_connect</a></div><div class="ttdeci">void mrmailbox_connect(mrmailbox_t *mailbox)</div><div class="ttdoc">Connect to the mailbox using the configured settings. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01578">mrmailbox.c:1578</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a5c17b77d9d26022f0bdbef548d37b5c6"><div class="ttname"><a href="structmrmailbox__t.html#a5c17b77d9d26022f0bdbef548d37b5c6">mrmailbox_t::mrmailbox_get_total_msg_count</a></div><div class="ttdeci">int mrmailbox_get_total_msg_count(mrmailbox_t *mailbox, uint32_t chat_id)</div><div class="ttdoc">Get the total number of messages in a chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02588">mrmailbox.c:2588</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_abf20deb2fd5886b7f3031f946053a847"><div class="ttname"><a href="structmrmailbox__t.html#abf20deb2fd5886b7f3031f946053a847">mrmailbox_t::mrmailbox_get_chat_contacts</a></div><div class="ttdeci">carray * mrmailbox_get_chat_contacts(mrmailbox_t *mailbox, uint32_t chat_id)</div><div class="ttdoc">Get contact IDs belonging to a chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02003">mrmailbox.c:2003</a></div></div>
<div class="ttc" id="structmrcontact__t_html_acdff2696f48b1d5cdbc67a8466322b25"><div class="ttname"><a href="structmrcontact__t.html#acdff2696f48b1d5cdbc67a8466322b25">mrcontact_t::mrcontact_unref</a></div><div class="ttdeci">void mrcontact_unref(mrcontact_t *ths)</div><div class="ttdoc">Free a contact object. </div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8c_source.html#l00049">mrcontact.c:49</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a825cec4a85da05335674eae221d51374"><div class="ttname"><a href="structmrmailbox__t.html#a825cec4a85da05335674eae221d51374">mrmailbox_t::mrmailbox_unref</a></div><div class="ttdeci">void mrmailbox_unref(mrmailbox_t *mailbox)</div><div class="ttdoc">Free a mailbox object. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l00954">mrmailbox.c:954</a></div></div>
<div class="ttc" id="structmrparam__t_html_a23e24e8700e17ede6dd385fc90330f76"><div class="ttname"><a href="structmrparam__t.html#a23e24e8700e17ede6dd385fc90330f76">mrparam_t::mrparam_get</a></div><div class="ttdeci">char * mrparam_get(mrparam_t *param, int key, const char *def)</div><div class="ttdoc">Get value of a parameter. </div><div class="ttdef"><b>Definition:</b> <a href="mrparam_8c_source.html#l00186">mrparam.c:186</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_abb069358386b767a60444651195e0895"><div class="ttname"><a href="structmrmailbox__t.html#abb069358386b767a60444651195e0895">mrmailbox_t::mrmailbox_block_contact</a></div><div class="ttdeci">void mrmailbox_block_contact(mrmailbox_t *mailbox, uint32_t contact_id, int new_blocking)</div><div class="ttdoc">Block or unblock a contact. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04290">mrmailbox.c:4290</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a957f0bbae60f389bac40acf42b68b134"><div class="ttname"><a href="structmrmailbox__t.html#a957f0bbae60f389bac40acf42b68b134">mrmailbox_t::mrmailboxcb_t</a></div><div class="ttdeci">uintptr_t(* mrmailboxcb_t)(mrmailbox_t *, int event, uintptr_t data1, uintptr_t data2)</div><div class="ttdoc">Callback function that should be given to mrmailbox_new(). </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8h_source.html#l00131">mrmailbox.h:131</a></div></div>
<div class="ttc" id="structmrchat__t_html_abe916f48ac83c2ca6476312eae084cfa"><div class="ttname"><a href="structmrchat__t.html#abe916f48ac83c2ca6476312eae084cfa">mrchat_t::m_draft_text</a></div><div class="ttdeci">char * m_draft_text</div><div class="ttdoc">NULL if unset. </div><div class="ttdef"><b>Definition:</b> <a href="mrchat_8h_source.html#l00057">mrchat.h:57</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a4da10c87eb65bbf6c504979d75ec3b19"><div class="ttname"><a href="structmrmailbox__t.html#a4da10c87eb65bbf6c504979d75ec3b19">mrmailbox_t::mrmailbox_get_chatlist</a></div><div class="ttdeci">mrchatlist_t * mrmailbox_get_chatlist(mrmailbox_t *mailbox, int listflags, const char *query)</div><div class="ttdoc">Get a list of chats. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01663">mrmailbox.c:1663</a></div></div>
<div class="ttc" id="structmrchat__t_html_abf3e1a34f567e168bc0597f9a544a50d"><div class="ttname"><a href="structmrchat__t.html#abf3e1a34f567e168bc0597f9a544a50d">mrchat_t::m_mailbox</a></div><div class="ttdeci">mrmailbox_t * m_mailbox</div><div class="ttdoc">!= NULL </div><div class="ttdef"><b>Definition:</b> <a href="mrchat_8h_source.html#l00058">mrchat.h:58</a></div></div>
<div class="ttc" id="structmrmsg__t_html"><div class="ttname"><a href="structmrmsg__t.html">mrmsg_t</a></div><div class="ttdoc">An object representing a single message in memory. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00040">mrmsg.h:40</a></div></div>
<div class="ttc" id="structmrparam__t_html_a8399104724eab98103cdd2cd98b09d93"><div class="ttname"><a href="structmrparam__t.html#a8399104724eab98103cdd2cd98b09d93">mrparam_t::mrparam_set</a></div><div class="ttdeci">void mrparam_set(mrparam_t *param, int key, const char *value)</div><div class="ttdoc">Set parameter to a string. </div><div class="ttdef"><b>Definition:</b> <a href="mrparam_8c_source.html#l00253">mrparam.c:253</a></div></div>
<div class="ttc" id="structmrcontact__t_html_ad906207191f0cfd62e408dbc82a156cf"><div class="ttname"><a href="structmrcontact__t.html#ad906207191f0cfd62e408dbc82a156cf">mrcontact_t::mrcontact_normalize_name</a></div><div class="ttdeci">void mrcontact_normalize_name(char *full_name)</div><div class="ttdoc">Normalize a name in-place. </div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8c_source.html#l00130">mrcontact.c:130</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a97eb029d9dd0d33ae492217608958a73"><div class="ttname"><a href="structmrmailbox__t.html#a97eb029d9dd0d33ae492217608958a73">mrmailbox_t::mrmailbox_get_chat_id_by_contact_id</a></div><div class="ttdeci">uint32_t mrmailbox_get_chat_id_by_contact_id(mrmailbox_t *mailbox, uint32_t contact_id)</div><div class="ttdoc">Check, if there is a normal chat with a given contact. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01789">mrmailbox.c:1789</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_adcdfd1e0899d3c9778238d49933813a5"><div class="ttname"><a href="structmrmailbox__t.html#adcdfd1e0899d3c9778238d49933813a5">mrmailbox_t::mrmailbox_get_fresh_msg_count</a></div><div class="ttdeci">int mrmailbox_get_fresh_msg_count(mrmailbox_t *mailbox, uint32_t chat_id)</div><div class="ttdoc">Get the number of fresh messages in a chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02616">mrmailbox.c:2616</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a24813f8aea38bcf5f928ea8a5fd7a3ec"><div class="ttname"><a href="structmrmailbox__t.html#a24813f8aea38bcf5f928ea8a5fd7a3ec">mrmailbox_t::mrmailbox_delete_chat</a></div><div class="ttdeci">void mrmailbox_delete_chat(mrmailbox_t *mailbox, uint32_t chat_id)</div><div class="ttdoc">Delete a chat: </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02773">mrmailbox.c:2773</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_af50446c1a5e504d27fe29de9e3b8edc3"><div class="ttname"><a href="structmrmailbox__t.html#af50446c1a5e504d27fe29de9e3b8edc3">mrmailbox_t::mrmailbox_set_draft</a></div><div class="ttdeci">void mrmailbox_set_draft(mrmailbox_t *mailbox, uint32_t chat_id, const char *msg)</div><div class="ttdoc">Save a draft for a chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l02371">mrmailbox.c:2371</a></div></div>
<div class="ttc" id="structmrchat__t_html_ad2792ee7df778521de61087bc79795a7"><div class="ttname"><a href="structmrchat__t.html#ad2792ee7df778521de61087bc79795a7">mrchat_t::m_param</a></div><div class="ttdeci">mrparam_t * m_param</div><div class="ttdoc">!= NULL </div><div class="ttdef"><b>Definition:</b> <a href="mrchat_8h_source.html#l00060">mrchat.h:60</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a6c749ad5736d9c34ff492015ea10a184"><div class="ttname"><a href="structmrmailbox__t.html#a6c749ad5736d9c34ff492015ea10a184">mrmailbox_t::mrmailbox_get_blocked_count</a></div><div class="ttdeci">int mrmailbox_get_blocked_count(mrmailbox_t *mailbox)</div><div class="ttdoc">Get the number of blocked contacts. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04174">mrmailbox.c:4174</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a2a9b27b6a2e991cbf3b553c5dbbec803"><div class="ttname"><a href="structmrmailbox__t.html#a2a9b27b6a2e991cbf3b553c5dbbec803">mrmailbox_t::mrmailbox_set_chat_image</a></div><div class="ttdeci">int mrmailbox_set_chat_image(mrmailbox_t *mailbox, uint32_t chat_id, const char *new_image)</div><div class="ttdoc">Set group image. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03476">mrmailbox.c:3476</a></div></div>
<div class="ttc" id="structmrparam__t_html_aaf8fb80838add4d4254bb9fa2c11cb0f"><div class="ttname"><a href="structmrparam__t.html#aaf8fb80838add4d4254bb9fa2c11cb0f">mrparam_t::mrparam_set_int</a></div><div class="ttdeci">void mrparam_set_int(mrparam_t *param, int key, int32_t value)</div><div class="ttdoc">Set parameter to an integer. </div><div class="ttdef"><b>Definition:</b> <a href="mrparam_8c_source.html#l00318">mrparam.c:318</a></div></div>
<div class="ttc" id="structmrchat__t_html_abbd344d8d361a1a4d14bfc9b5dc57140"><div class="ttname"><a href="structmrchat__t.html#abbd344d8d361a1a4d14bfc9b5dc57140">mrchat_t::m_name</a></div><div class="ttdeci">char * m_name</div><div class="ttdoc">NULL if unset. </div><div class="ttdef"><b>Definition:</b> <a href="mrchat_8h_source.html#l00055">mrchat.h:55</a></div></div>
<div class="ttc" id="structmrparam__t_html_aba7d11db241c2ebbadab67895b84dae8"><div class="ttname"><a href="structmrparam__t.html#aba7d11db241c2ebbadab67895b84dae8">mrparam_t::mrparam_get_int</a></div><div class="ttdeci">int32_t mrparam_get_int(mrparam_t *param, int key, int32_t def)</div><div class="ttdoc">Get value of a parameter. </div><div class="ttdef"><b>Definition:</b> <a href="mrparam_8c_source.html#l00223">mrparam.c:223</a></div></div>
<div class="ttc" id="structmrmsg__t_html_ae940aa79a261e1a427b12baefbee2d23"><div class="ttname"><a href="structmrmsg__t.html#ae940aa79a261e1a427b12baefbee2d23">mrmsg_t::mrmsg_set_text</a></div><div class="ttdeci">void mrmsg_set_text(mrmsg_t *msg, const char *text)</div><div class="ttdoc">Set the text of a message object. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8c_source.html#l00125">mrmsg.c:125</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a2597f7a6022e6f571fa8cdb7ba3977cc"><div class="ttname"><a href="structmrmailbox__t.html#a2597f7a6022e6f571fa8cdb7ba3977cc">mrmailbox_t::mrmailbox_get_known_contacts</a></div><div class="ttdeci">carray * mrmailbox_get_known_contacts(mrmailbox_t *mailbox, const char *query)</div><div class="ttdoc">Returns known and unblocked contacts. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04076">mrmailbox.c:4076</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a011705ea76c8f9017b999eb009eec9ce"><div class="ttname"><a href="structmrmailbox__t.html#a011705ea76c8f9017b999eb009eec9ce">mrmailbox_t::mrmailbox_get_blobdir</a></div><div class="ttdeci">char * mrmailbox_get_blobdir(mrmailbox_t *mailbox)</div><div class="ttdoc">Get the blob directory. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01276">mrmailbox.c:1276</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a9ef144244e7d86ba82ce3257abf14f13"><div class="ttname"><a href="structmrmailbox__t.html#a9ef144244e7d86ba82ce3257abf14f13">mrmailbox_t::mrmailbox_get_msg</a></div><div class="ttdeci">mrmsg_t * mrmailbox_get_msg(mrmailbox_t *mailbox, uint32_t msg_id)</div><div class="ttdoc">Get a single message object of the type mrmsg_t. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04701">mrmailbox.c:4701</a></div></div>
<div class="ttc" id="structmrmsg__t_html_a2c31ec5b23e35fbe3ae3896eece09453"><div class="ttname"><a href="structmrmsg__t.html#a2c31ec5b23e35fbe3ae3896eece09453">mrmsg_t::m_param</a></div><div class="ttdeci">mrparam_t * m_param</div><div class="ttdoc">MRP_FILE, MRP_WIDTH, MRP_HEIGHT etc. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00073">mrmsg.h:73</a></div></div>
<div class="ttc" id="structmrmsg__t_html_ae54dcd4036371597d7f8bbd75303527a"><div class="ttname"><a href="structmrmsg__t.html#ae54dcd4036371597d7f8bbd75303527a">mrmsg_t::m_text</a></div><div class="ttdeci">char * m_text</div><div class="ttdoc">message text or NULL if unset </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00072">mrmsg.h:72</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a6c557153209e128b69301246dbf9e230"><div class="ttname"><a href="structmrmailbox__t.html#a6c557153209e128b69301246dbf9e230">mrmailbox_t::m_userdata</a></div><div class="ttdeci">void * m_userdata</div><div class="ttdoc">the same pointer as given to mrmailbox_new(), may be used by the caller for any purpose ...</div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8h_source.html#l00143">mrmailbox.h:143</a></div></div>
<div class="ttc" id="structmrmsg__t_html_aa33212e41efff643aa7290753f3d9b02"><div class="ttname"><a href="structmrmsg__t.html#aa33212e41efff643aa7290753f3d9b02">mrmsg_t::mrmsg_unref</a></div><div class="ttdeci">void mrmsg_unref(mrmsg_t *msg)</div><div class="ttdoc">Free an mrmsg_t object created eg. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8c_source.html#l00066">mrmsg.c:66</a></div></div>
<div class="ttc" id="structmrcontact__t_html_a559c848feee29d334098f9a581448e56"><div class="ttname"><a href="structmrcontact__t.html#a559c848feee29d334098f9a581448e56">mrcontact_t::m_authname</a></div><div class="ttdeci">char * m_authname</div><div class="ttdoc">may be NULL or empty, this is the name authorized by the sender, only this name may be speaded to oth...</div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8h_source.html#l00046">mrcontact.h:46</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a9685194a3318021d1a95eeed29d01277"><div class="ttname"><a href="structmrmailbox__t.html#a9685194a3318021d1a95eeed29d01277">mrmailbox_t::mrmailbox_get_chat_media</a></div><div class="ttdeci">carray * mrmailbox_get_chat_media(mrmailbox_t *mailbox, uint32_t chat_id, int msg_type, int or_msg_type)</div><div class="ttdoc">Returns all message IDs of the given types in a chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01896">mrmailbox.c:1896</a></div></div>
<div class="ttc" id="structmrmsg__t_html_a793898c8da24c717dc2bb1d91faac801"><div class="ttname"><a href="structmrmsg__t.html#a793898c8da24c717dc2bb1d91faac801">mrmsg_t::m_id</a></div><div class="ttdeci">uint32_t m_id</div><div class="ttdoc">Message ID. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00045">mrmsg.h:45</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a1386ec2c091b936b65b25b50a302173d"><div class="ttname"><a href="structmrmailbox__t.html#a1386ec2c091b936b65b25b50a302173d">mrmailbox_t::mrmailbox_create_chat_by_contact_id</a></div><div class="ttdeci">uint32_t mrmailbox_create_chat_by_contact_id(mrmailbox_t *mailbox, uint32_t contact_id)</div><div class="ttdoc">Create a normal chat with a single user. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01816">mrmailbox.c:1816</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_ab316ed8a30c968085fa503e6c215e2f1"><div class="ttname"><a href="structmrmailbox__t.html#ab316ed8a30c968085fa503e6c215e2f1">mrmailbox_t::mrmailbox_forward_msgs</a></div><div class="ttdeci">void mrmailbox_forward_msgs(mrmailbox_t *mailbox, const uint32_t *msg_ids, int msg_cnt, uint32_t chat_id)</div><div class="ttdoc">Forward a list of messages to another chat. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04868">mrmailbox.c:4868</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a67281e50b568dc18df710275e0e13f5b"><div class="ttname"><a href="structmrmailbox__t.html#a67281e50b568dc18df710275e0e13f5b">mrmailbox_t::mrmailbox_markseen_msgs</a></div><div class="ttdeci">void mrmailbox_markseen_msgs(mrmailbox_t *mailbox, const uint32_t *msg_ids, int msg_cnt)</div><div class="ttdoc">Mark a message as seen, updates the IMAP state and sends MDNs. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l05237">mrmailbox.c:5237</a></div></div>
<div class="ttc" id="structmrmsg__t_html_aca59d28054d3e15b4fe6ca74073d91f4"><div class="ttname"><a href="structmrmsg__t.html#aca59d28054d3e15b4fe6ca74073d91f4">mrmsg_t::m_state</a></div><div class="ttdeci">int m_state</div><div class="ttdoc">Message state as one of the MR_MSG_STATE_* contstants. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00070">mrmsg.h:70</a></div></div>
<div class="ttc" id="structmrchat__t_html_a565101f53278f5ab1ff58317ffc9555c"><div class="ttname"><a href="structmrchat__t.html#a565101f53278f5ab1ff58317ffc9555c">mrchat_t::m_draft_timestamp</a></div><div class="ttdeci">time_t m_draft_timestamp</div><div class="ttdoc">0 if there is no draft </div><div class="ttdef"><b>Definition:</b> <a href="mrchat_8h_source.html#l00056">mrchat.h:56</a></div></div>
<div class="ttc" id="structmrcontact__t_html_ac22d500e5c439b07c943ed2c7afb2a23"><div class="ttname"><a href="structmrcontact__t.html#ac22d500e5c439b07c943ed2c7afb2a23">mrcontact_t::m_blocked</a></div><div class="ttdeci">int m_blocked</div><div class="ttdoc">Blocked state. </div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8h_source.html#l00048">mrcontact.h:48</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a07cc8fe0cfd900a9449bffc4ca5a7a95"><div class="ttname"><a href="structmrmailbox__t.html#a07cc8fe0cfd900a9449bffc4ca5a7a95">mrmailbox_t::mrmailbox_marknoticed_chat</a></div><div class="ttdeci">void mrmailbox_marknoticed_chat(mrmailbox_t *mailbox, uint32_t chat_id)</div><div class="ttdoc">Mark all message in a chat as noticed. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01755">mrmailbox.c:1755</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a87a210d5e359e3176b923d84a9cd625f"><div class="ttname"><a href="structmrmailbox__t.html#a87a210d5e359e3176b923d84a9cd625f">mrmailbox_t::mrmailbox_get_blocked_contacts</a></div><div class="ttdeci">carray * mrmailbox_get_blocked_contacts(mrmailbox_t *mailbox)</div><div class="ttdoc">Get blocked contacts. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04140">mrmailbox.c:4140</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a057660d94350ff98eca72785c6e88962"><div class="ttname"><a href="structmrmailbox__t.html#a057660d94350ff98eca72785c6e88962">mrmailbox_t::mrmailbox_get_contact</a></div><div class="ttdeci">mrcontact_t * mrmailbox_get_contact(mrmailbox_t *mailbox, uint32_t contact_id)</div><div class="ttdoc">Get a single contact object. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04216">mrmailbox.c:4216</a></div></div>
<div class="ttc" id="structmrchatlist__t_html_ab036d6e066b5ff78779f36711c9ab2f9"><div class="ttname"><a href="structmrchatlist__t.html#ab036d6e066b5ff78779f36711c9ab2f9">mrchatlist_t::mrchatlist_unref</a></div><div class="ttdeci">void mrchatlist_unref(mrchatlist_t *chatlist)</div><div class="ttdoc">Free a mrchatlist_t object as created eg. </div><div class="ttdef"><b>Definition:</b> <a href="mrchatlist_8c_source.html#l00062">mrchatlist.c:62</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a7150c575193d43e048689aa264c74c79"><div class="ttname"><a href="structmrmailbox__t.html#a7150c575193d43e048689aa264c74c79">mrmailbox_t::mrmailbox_marknoticed_contact</a></div><div class="ttdeci">void mrmailbox_marknoticed_contact(mrmailbox_t *mailbox, uint32_t contact_id)</div><div class="ttdoc">Mark all messages send by the given contact as noticed. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04264">mrmailbox.c:4264</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a889aea3b38561016ffa2343d5106c38d"><div class="ttname"><a href="structmrmailbox__t.html#a889aea3b38561016ffa2343d5106c38d">mrmailbox_t::mrmailbox_set_config_int</a></div><div class="ttdeci">int mrmailbox_set_config_int(mrmailbox_t *ths, const char *key, int32_t value)</div><div class="ttdoc">Configure the mailbox. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01229">mrmailbox.c:1229</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_afba149fcbcb5a069113aed4336f4bcc7"><div class="ttname"><a href="structmrmailbox__t.html#afba149fcbcb5a069113aed4336f4bcc7">mrmailbox_t::mrmailbox_get_config_int</a></div><div class="ttdeci">int32_t mrmailbox_get_config_int(mrmailbox_t *ths, const char *key, int32_t def)</div><div class="ttdoc">Get a configuration option. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01251">mrmailbox.c:1251</a></div></div>
<div class="ttc" id="structmrcontact__t_html_aaedd60ba4cad97bb87ba5a55958341e5"><div class="ttname"><a href="structmrcontact__t.html#aaedd60ba4cad97bb87ba5a55958341e5">mrcontact_t::m_addr</a></div><div class="ttdeci">char * m_addr</div><div class="ttdoc">may be NULL or empty </div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8h_source.html#l00047">mrcontact.h:47</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a8772e9bb55b02299f65ebd8bcc682bb1"><div class="ttname"><a href="structmrmailbox__t.html#a8772e9bb55b02299f65ebd8bcc682bb1">mrmailbox_t::mrmailbox_set_chat_name</a></div><div class="ttdeci">int mrmailbox_set_chat_name(mrmailbox_t *mailbox, uint32_t chat_id, const char *new_name)</div><div class="ttdoc">Set group name. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l03399">mrmailbox.c:3399</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_aa4d582bc9d6d80e43038d213b081031f"><div class="ttname"><a href="structmrmailbox__t.html#aa4d582bc9d6d80e43038d213b081031f">mrmailbox_t::mrmailbox_get_contact_encrinfo</a></div><div class="ttdeci">char * mrmailbox_get_contact_encrinfo(mrmailbox_t *mailbox, uint32_t contact_id)</div><div class="ttdoc">Get encryption info. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04381">mrmailbox.c:4381</a></div></div>
<div class="ttc" id="structmrcontact__t_html_a48fba862b41f7da3b8c6193c0554654b"><div class="ttname"><a href="structmrcontact__t.html#a48fba862b41f7da3b8c6193c0554654b">mrcontact_t::m_name</a></div><div class="ttdeci">char * m_name</div><div class="ttdoc">may be NULL or empty, this name should not be spreaded as it may be &quot;Daddy&quot; and so on; initially set ...</div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8h_source.html#l00045">mrcontact.h:45</a></div></div>
<div class="ttc" id="structmrmsg__t_html_aba09cb77cdabd1e2b2e6262d25388801"><div class="ttname"><a href="structmrmsg__t.html#aba09cb77cdabd1e2b2e6262d25388801">mrmsg_t::m_timestamp</a></div><div class="ttdeci">time_t m_timestamp</div><div class="ttdoc">Unix time the message was sended or received. </div><div class="ttdef"><b>Definition:</b> <a href="mrmsg_8h_source.html#l00050">mrmsg.h:50</a></div></div>
<div class="ttc" id="structmrcontact__t_html_ab2ee31297c327e04ed14673adbd49716"><div class="ttname"><a href="structmrcontact__t.html#ab2ee31297c327e04ed14673adbd49716">mrcontact_t::m_id</a></div><div class="ttdeci">uint32_t m_id</div><div class="ttdoc">The contact ID. </div><div class="ttdef"><b>Definition:</b> <a href="mrcontact_8h_source.html#l00043">mrcontact.h:43</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_aeb12e9631508fd76e3e9828a82031767"><div class="ttname"><a href="structmrmailbox__t.html#aeb12e9631508fd76e3e9828a82031767">mrmailbox_t::mrmailbox_get_config</a></div><div class="ttdeci">char * mrmailbox_get_config(mrmailbox_t *ths, const char *key, const char *def)</div><div class="ttdoc">Get a configuration option. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l01207">mrmailbox.c:1207</a></div></div>
<div class="ttc" id="structmrmailbox__t_html_a13e05fe3f43102c3323ba4c7e2761593"><div class="ttname"><a href="structmrmailbox__t.html#a13e05fe3f43102c3323ba4c7e2761593">mrmailbox_t::mrmailbox_get_msg_info</a></div><div class="ttdeci">char * mrmailbox_get_msg_info(mrmailbox_t *mailbox, uint32_t msg_id)</div><div class="ttdoc">Get an informational text for a single message. </div><div class="ttdef"><b>Definition:</b> <a href="mrmailbox_8c_source.html#l04743">mrmailbox.c:4743</a></div></div>
<div class="ttc" id="structmrchat__t_html"><div class="ttname"><a href="structmrchat__t.html">mrchat_t</a></div><div class="ttdoc">An object representing a single chat in memory. </div><div class="ttdef"><b>Definition:</b> <a href="mrchat_8h_source.html#l00039">mrchat.h:39</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Nov 14 2017 02:47:14 for Delta Chat Core C-Library by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.11
</small></address>
</body>
</html>