<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.trinitydesktop.net/index.php?action=history&amp;feed=atom&amp;title=TDEIO</id>
	<title>TDEIO - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.trinitydesktop.net/index.php?action=history&amp;feed=atom&amp;title=TDEIO"/>
	<link rel="alternate" type="text/html" href="https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;action=history"/>
	<updated>2026-05-12T17:57:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.13</generator>
	<entry>
		<id>https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=2458&amp;oldid=prev</id>
		<title>Blu256: Blu256 moved page Network transparency (KDE3 Architecture) to TDEIO: More straightforward title</title>
		<link rel="alternate" type="text/html" href="https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=2458&amp;oldid=prev"/>
		<updated>2022-06-14T10:26:21Z</updated>

		<summary type="html">&lt;p&gt;Blu256 moved page &lt;a href=&quot;/Network_transparency_(KDE3_Architecture)&quot; class=&quot;mw-redirect&quot; title=&quot;Network transparency (KDE3 Architecture)&quot;&gt;Network transparency (KDE3 Architecture)&lt;/a&gt; to &lt;a href=&quot;/TDEIO&quot; title=&quot;TDEIO&quot;&gt;TDEIO&lt;/a&gt;: More straightforward title&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:26, 14 June 2022&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key mwdb:diff:wikidiff2:1.12:old-2241:rev-2458:1.13.0 --&gt;
&lt;/table&gt;</summary>
		<author><name>Blu256</name></author>
	</entry>
	<entry>
		<id>https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=2241&amp;oldid=prev</id>
		<title>Blu256: -Applicable to TDE (redundant), categories to bottom, minor reorganisation</title>
		<link rel="alternate" type="text/html" href="https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=2241&amp;oldid=prev"/>
		<updated>2022-04-21T16:25:01Z</updated>

		<summary type="html">&lt;p&gt;-Applicable to TDE (redundant), categories to bottom, minor reorganisation&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:25, 21 April 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&amp;lt;div style=&quot;float:right&quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_16_1_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_1_0_lhs&quot;&gt;&lt;/a&gt;[[Category:KDE3]]&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_16_2_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_2_0_lhs&quot;&gt;&lt;/a&gt;[[Category:Architecture]]&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_16_3_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_2_1_lhs&quot;&gt;&lt;/a&gt;[[Category:Developers]]&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;{{Applicable to TDE}}&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_11_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_4_0_rhs&quot;&gt;&lt;/a&gt;In the TDE libraries, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&#039;&#039;&#039;&lt;/ins&gt;network transparency&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&#039;&#039;&#039;&lt;/ins&gt; is implemented in the TDEIO API. The &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_12_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_4_1_rhs&quot;&gt;&lt;/a&gt;central concept of this architecture is an IO &#039;&#039;job&#039;&#039;. A job may copy,&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_12_1_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_4_2_rhs&quot;&gt;&lt;/a&gt;or delete files or similar things. Once a job is started, it works in the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_12_2_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_4_3_rhs&quot;&gt;&lt;/a&gt;background and does not block the application. Any communication from the job&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_12_3_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_4_4_rhs&quot;&gt;&lt;/a&gt;back to the application - like delivering data or progress information - is&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_12_4_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_4_5_rhs&quot;&gt;&lt;/a&gt;done integrated with the TQt event loop.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;== Background ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;__TOC__&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;== Introduction ==&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;In the age of the world wide web, it is of essential importance that desktop &lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;In the age of the world wide web, it is of essential importance that desktop &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;applications can access resources over the internet: they should be able to&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;applications can access resources over the internet: they should be able to&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 24:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 24:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;but should updated regularly as data comes in.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;but should updated regularly as data comes in.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;=== IO Slaves ===&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_4_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_11_0_lhs&quot;&gt;&lt;/a&gt;In the TDE libraries, network transparency is implemented in the TDEIO API. The &lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_4_1_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_12_0_lhs&quot;&gt;&lt;/a&gt;central concept of this architecture is an IO &#039;&#039;job&#039;&#039;. A job may copy,&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_4_2_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_12_1_lhs&quot;&gt;&lt;/a&gt;or delete files or similar things. Once a job is started, it works in the&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_4_3_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_12_2_lhs&quot;&gt;&lt;/a&gt;background and does not block the application. Any communication from the job&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_4_4_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_12_3_lhs&quot;&gt;&lt;/a&gt;back to the application - like delivering data or progress information - is&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_4_5_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_12_4_lhs&quot;&gt;&lt;/a&gt;done integrated with the TQt event loop.&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;Background operation is achieved by starting &#039;&#039;ioslaves&#039;&#039; to perform certain&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;Background operation is achieved by starting &#039;&#039;ioslaves&#039;&#039; to perform certain&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;tasks. ioslaves are started as separate processes and are communicated with &lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;tasks. ioslaves are started as separate processes and are communicated with &lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 36:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 30:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;unstable slaves can not crash the application that uses them.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;unstable slaves can not crash the application that uses them.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;=== URLs ===&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;File locations are expressed by the widely used URLs. But in Trinity, URLs do not&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;File locations are expressed by the widely used URLs. But in Trinity, URLs do not&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;only expand the range of addressable files beyond the local file system. It&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;only expand the range of addressable files beyond the local file system. It&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 463:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 458:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;&#039;&#039;Initial Author:&#039;&#039; [mailto:bernd@kdevelop.org Bernd Gehrmann]&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;&#039;&#039;Initial Author:&#039;&#039; [mailto:bernd@kdevelop.org Bernd Gehrmann]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_1_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_16_1_rhs&quot;&gt;&lt;/a&gt;[[Category:KDE3]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_2_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_16_2_rhs&quot;&gt;&lt;/a&gt;[[Category:Architecture]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_2_1_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_16_3_rhs&quot;&gt;&lt;/a&gt;[[Category:Developers]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key mwdb:diff:wikidiff2:1.12:old-1731:rev-2241:1.13.0 --&gt;
&lt;/table&gt;</summary>
		<author><name>Blu256</name></author>
	</entry>
	<entry>
		<id>https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=1731&amp;oldid=prev</id>
		<title>Blu256: /* Defining an ioslave */ CMake rules</title>
		<link rel="alternate" type="text/html" href="https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=1731&amp;oldid=prev"/>
		<updated>2021-09-02T12:06:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Defining an ioslave: &lt;/span&gt; CMake rules&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:06, 2 September 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 298:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 298:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;== Defining an ioslave ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;== Defining an ioslave ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;{{Outdated&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt; |reason=Makefile rules&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt; |{{CURRENTYEAR}}|{{CURRENTMONTH}}|{{CURRENTDAY}}&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;In the following we discuss how you can add a new ioslave to the system.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;In the following we discuss how you can add a new ioslave to the system.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;In analogy to services, new ioslaves are advertised to the system by&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;In analogy to services, new ioslaves are advertised to the system by&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;installing a little configuration file. The following &amp;lt;tt&amp;gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Makefile&lt;/del&gt;.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;am&lt;/del&gt;&amp;lt;/tt&amp;gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;installing a little configuration file. The following &amp;lt;tt&amp;gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;CMakeLists&lt;/ins&gt;.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;txt&lt;/ins&gt;&amp;lt;/tt&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;snippet installs the &amp;lt;tt&amp;gt;ftp&amp;lt;/tt&amp;gt; protocol:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;snippet installs the &amp;lt;tt&amp;gt;ftp&amp;lt;/tt&amp;gt; protocol:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&amp;lt;!--&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt; protocoldir = $(kde_servicesdir)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt; protocoldir = $(kde_servicesdir)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt; protocol_DATA = ftp.protocol&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt; protocol_DATA = ftp.protocol&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt; EXTRA_DIST = $(mime_DATA)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt; EXTRA_DIST = $(mime_DATA)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;--&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&quot;cmake&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;install(&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;  FILES ftp.protocol&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;  DESTINATION ${SERVICES_INSTALL_DIR}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-deletedline diff-side-deleted&quot;&gt;&lt;div&gt;The contents of the file ftp.protocol is as follows:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-addedline diff-side-added&quot;&gt;&lt;div&gt;The contents of the file &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;tt&amp;gt;&lt;/ins&gt;ftp.protocol&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/tt&amp;gt;&lt;/ins&gt; is as follows:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-deleted&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&quot;ini&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-context diff-side-added&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&quot;ini&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key mwdb:diff:wikidiff2:1.12:old-1723:rev-1731:1.13.0 --&gt;
&lt;/table&gt;</summary>
		<author><name>Blu256</name></author>
	</entry>
	<entry>
		<id>https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=1723&amp;oldid=prev</id>
		<title>Blu256: Updated</title>
		<link rel="alternate" type="text/html" href="https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=1723&amp;oldid=prev"/>
		<updated>2021-08-25T12:51:33Z</updated>

		<summary type="html">&lt;p&gt;Updated&lt;/p&gt;
&lt;a href=&quot;https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;amp;diff=1723&amp;amp;oldid=423&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Blu256</name></author>
	</entry>
	<entry>
		<id>https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=423&amp;oldid=prev</id>
		<title>imported&gt;Eliddell: Created page with &quot;== Introduction ==  In the age of the world wide web, it is of essential importance that desktop  applications can access resources over the internet: they should be able to d...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.trinitydesktop.net/index.php?title=TDEIO&amp;diff=423&amp;oldid=prev"/>
		<updated>2014-06-02T21:16:09Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;== Introduction ==  In the age of the world wide web, it is of essential importance that desktop  applications can access resources over the internet: they should be able to d...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
In the age of the world wide web, it is of essential importance that desktop &lt;br /&gt;
applications can access resources over the internet: they should be able to&lt;br /&gt;
download files from a web server, write files to an ftp server or read mails&lt;br /&gt;
from a web server. Often, the ability to access files regardless of their&lt;br /&gt;
location is called &amp;#039;&amp;#039;network transparency&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
In the past, different approaches to this goals were implemented. The old NFS&lt;br /&gt;
file system is an attempt to implement network transparency on the level of&lt;br /&gt;
the POSIX API. While this approach works quite well in local, closely coupled&lt;br /&gt;
networks, it does not scale for resources to which access is unreliable and&lt;br /&gt;
possibly slow. Here, &amp;#039;&amp;#039;asynchronicity&amp;#039;&amp;#039; is important. While you are waiting&lt;br /&gt;
for your web browser to download a page, the user interface should not block.&lt;br /&gt;
Also, the page rendering should not begin when the page is completely available,&lt;br /&gt;
but should updated regularly as data comes in.&lt;br /&gt;
&lt;br /&gt;
In the KDE libraries, network transparency is implemented in the KIO API. The &lt;br /&gt;
central concept of this architecture is an IO &amp;#039;&amp;#039;job&amp;#039;&amp;#039;. A job may copy,&lt;br /&gt;
or delete files or similar things. Once a job is started, it works in the&lt;br /&gt;
background and does not block the application. Any communication from the job&lt;br /&gt;
back to the application - like delivering data or progress information - is&lt;br /&gt;
done integrated with the Qt event loop.&lt;br /&gt;
&lt;br /&gt;
Background operation is achieved by starting &amp;#039;&amp;#039;ioslaves&amp;#039;&amp;#039; to perform certain&lt;br /&gt;
tasks. ioslaves are started as separate processes and are communicated with &lt;br /&gt;
through UNIX domain sockets. In this way, no multi-threading is necessary and&lt;br /&gt;
unstable slaves can not crash the application that uses them.&lt;br /&gt;
&lt;br /&gt;
File locations are expressed by the widely used URLs. But in KDE, URLs do not&lt;br /&gt;
only expand the range of addressable files beyond the local file system. It&lt;br /&gt;
also goes in the opposite direction - e.g. you can browse into tar archives.&lt;br /&gt;
This is achived by nesting URLs. For example, a file in a tar archive on &lt;br /&gt;
a http server could have the URL&lt;br /&gt;
&lt;br /&gt;
 http://www-com.physik.hu-berlin.de/~bernd/article.tgz#tar:/paper.tex&lt;br /&gt;
&lt;br /&gt;
== Using KIO ==&lt;br /&gt;
&lt;br /&gt;
In most cases, jobs are created by calling functions in the KIO namespace.&lt;br /&gt;
These functions take one or two URLs as arguments, and possible other&lt;br /&gt;
necessary parameters. When the job is finished, it emits the signal&lt;br /&gt;
&amp;lt;tt&amp;gt;result(KIO::Job*)&amp;lt;/tt&amp;gt;. After this signal has been emitted, the job&lt;br /&gt;
deletes itself. Thus, a typical use case will look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void FooClass::makeDirectory()&lt;br /&gt;
{&lt;br /&gt;
    SimpleJob *job = KIO::mkdir(KURL(&amp;quot;file:/home/bernd/kiodir&amp;quot;));&lt;br /&gt;
    connect( job, SIGNAL(result(KIO::Job*)), &lt;br /&gt;
             this, SLOT(mkdirResult(KIO::Job*)) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void FooClass::mkdirResult(KIO::Job *job)&lt;br /&gt;
{&lt;br /&gt;
    if (job-&amp;gt;error())&lt;br /&gt;
        job-&amp;gt;showErrorDialog();&lt;br /&gt;
    else&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;mkdir went fine&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Depending on the type of the job, you may connect also to other&lt;br /&gt;
signals.&lt;br /&gt;
&lt;br /&gt;
Here is an overview over the possible functions:&lt;br /&gt;
&lt;br /&gt;
KIO::mkdir(const KURL &amp;amp;amp;url, int permission)&lt;br /&gt;
:Creates a directory, optionally with certain permissions.&lt;br /&gt;
KIO::rmdir(const KURL &amp;amp;amp;url)&lt;br /&gt;
:Removes a directory.&lt;br /&gt;
KIO::chmod(const KURL &amp;amp;amp;url, int permissions)&lt;br /&gt;
:Changes the permissions of a file.&lt;br /&gt;
KIO::rename(const KURL &amp;amp;amp;src, const KURL &amp;amp;amp;dest, bool overwrite)&lt;br /&gt;
:Renames a file.&lt;br /&gt;
KIO::symlink(const QString &amp;amp;amp;target, const KURL &amp;amp;amp;dest, bool overwrite, bool showProgressInfo)&lt;br /&gt;
:Creates a symbolic link.&lt;br /&gt;
KIO::stat(const KURL &amp;amp;amp;url, bool showProgressInfo)&lt;br /&gt;
:Finds out certain information about the file, such as size, modification time and permissions. The information can be obtained from KIO::StatJob::statResult() after the job has finished.&lt;br /&gt;
KIO::get(const KURL &amp;amp;amp;url, bool reload, bool showProgressInfo)&lt;br /&gt;
:Transfers data from a URL.&lt;br /&gt;
KIO::put(const KURL &amp;amp;amp;url, int permissions, bool overwrite, bool resume, bool showProgressInfo)&lt;br /&gt;
:Transfers data to a URL.&lt;br /&gt;
KIO::http_post(const KURL &amp;amp;amp;url, const QByteArray &amp;amp;amp;data, bool showProgressInfo)&lt;br /&gt;
:Posts data. Special for HTTP.&lt;br /&gt;
KIO::mimetype(const KURL &amp;amp;amp;url, bool showProgressInfo)&lt;br /&gt;
:Tries to find the MIME type of the URL. The type can be obtained from KIO::MimetypeJob::mimetype() after the job has finished.&lt;br /&gt;
KIO::file_copy(const KURL &amp;amp;amp;src, const KURL &amp;amp;amp;dest, int permissions, bool overwrite, bool resume, bool showProgressInfo)&lt;br /&gt;
:Copies a single file.&lt;br /&gt;
KIO::file_move(const KURL &amp;amp;amp;src, const KURL &amp;amp;amp;dest, int permissions, bool overwrite, bool resume, bool showProgressInfo)&lt;br /&gt;
:Renames or moves a single file.&lt;br /&gt;
KIO::file_delete(const KURL &amp;amp;amp;url, bool showProgressInfo)&lt;br /&gt;
:Deletes a single file.&lt;br /&gt;
KIO::listDir(const KURL &amp;amp;amp;url, bool showProgressInfo)&lt;br /&gt;
:Lists the contents of a directory. Each time some new entries are known, the signal KIO::ListJob::entries() is emitted.&lt;br /&gt;
KIO::listRecursive(const KURL &amp;amp;amp;url, bool showProgressInfo)&lt;br /&gt;
:Similar to the listDir() function, but this one is recursive.&lt;br /&gt;
KIO::copy(const KURL &amp;amp;amp;src, const KURL &amp;amp;amp;dest, bool showProgressInfo)&lt;br /&gt;
:Copies a file or directory. Directories are copied recursively.&lt;br /&gt;
KIO::move(const KURL &amp;amp;amp;src, const KURL &amp;amp;amp;dest, bool showProgressInfo)&lt;br /&gt;
:Moves or renames a file or directory.&lt;br /&gt;
KIO::del(const KURL &amp;amp;amp;src, bool shred, bool showProgressInfo)&lt;br /&gt;
:Deletes a file or directory.&lt;br /&gt;
&lt;br /&gt;
== Directory entries ==&lt;br /&gt;
&lt;br /&gt;
Both the KIO::stat() and KIO::listDir() jobs return their results as a type&lt;br /&gt;
UDSEntry, UDSEntryList resp. The latter is defined as QValueList&amp;amp;lt;UDSEntry&amp;amp;gt;.&lt;br /&gt;
The acronym UDS stands for &amp;quot;Universal directory service&amp;quot;. The principle behind &lt;br /&gt;
it is that the a directory entry only carries the information which an ioslave&lt;br /&gt;
can provide, not more. For example, the http slave does not provide any &lt;br /&gt;
information about access permissions or file owners.&lt;br /&gt;
Instead, a UDSEntry is a list of UDSAtoms. Each atom provides a specific piece&lt;br /&gt;
of information. It consists of a type stored in m_uds and either an integer&lt;br /&gt;
value in m_long or a string value in m_str, depending on the type.&lt;br /&gt;
&lt;br /&gt;
The following types are currently defined:&lt;br /&gt;
&lt;br /&gt;
*UDS_SIZE (integer) - Size of the file.&lt;br /&gt;
*UDS_USER (string) - User owning the file.&lt;br /&gt;
*UDS_GROUP (string) - Group owning the file.&lt;br /&gt;
*UDS_NAME (string) - File name.&lt;br /&gt;
*UDS_ACCESS (integer) - Permission rights of the file, as e.g. stored by the libc function stat() in the st_mode field.&lt;br /&gt;
*UDS_FILE_TYPE (integer) - The file type, as e.g. stored by stat() in the st_mode field. Therefore you can use the usual libc macros like S_ISDIR to test this value. Note that the data provided by ioslaves corresponds to stat(), not lstat(), i.e. in case of symbolic links, the file type here is the type of the file pointed to by the link, not the link itself.&lt;br /&gt;
*UDS_LINK_DEST (string) - In case of a symbolic link, the name of the file pointed to.&lt;br /&gt;
*UDS_MODIFICATION_TIME (integer) - The time (as in the type time_t)  when the file was last modified, as e.g. stored by stat() in the st_mtime field.&lt;br /&gt;
*UDS_ACCESS_TIME (integer) - The time when the file was last accessed, as e.g. stored by stat() in the st_atime field.&lt;br /&gt;
*UDS_CREATION_TIME (integer) - The time when the file was created, as e.g. stored by stat() in the st_ctime field.&lt;br /&gt;
*UDS_URL (string) - Provides a URL of a file, if it is not simply the the concatenation of directory URL and file name.&lt;br /&gt;
*UDS_MIME_TYPE (string) - MIME type of the file&lt;br /&gt;
*UDS_GUESSED_MIME_TYPE (string) - MIME type of the file as guessed by the slave. The difference to the previous type is that the one provided here should not be taken as reliable (because determining it in a reliable way would be too expensive). For example, the KRun class explicitly checks the MIME type if it does not have reliable information.&lt;br /&gt;
&lt;br /&gt;
Although the way of storing information about files in a UDSEntry is flexible&lt;br /&gt;
and practical from the ioslave point of view, it is a mess to use for the&lt;br /&gt;
application programmer. For example, in order to find out the MIME type of&lt;br /&gt;
the file, you have to iterate over all atoms and test whether m_uds is&lt;br /&gt;
UDS_MIME_TYPE. Fortunately, there is an API which is a lot easier to use:&lt;br /&gt;
the class KFileItem.&lt;br /&gt;
&lt;br /&gt;
== Synchronous usage ==&lt;br /&gt;
&lt;br /&gt;
Often, the asynchronous API of KIO is too complex to use and therefore &lt;br /&gt;
implementing full asynchronicity is not a priority. For example, in a program &lt;br /&gt;
that can only handle one document file at a time, there is little that can be&lt;br /&gt;
done while the program is downloading a file anyway. For these simple cases, &lt;br /&gt;
there is a mucher simpler API in the form of a set of static functions in&lt;br /&gt;
KIO::NetAccess. For example, in order to copy a file, use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KURL source, target;&lt;br /&gt;
source = ...;&lt;br /&gt;
target = ...&lt;br /&gt;
KIO::NetAccess::copy(source, target);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function will return after the complete copying process has finished. Still,&lt;br /&gt;
this method provides a progress dialog, and it makes sure that the application&lt;br /&gt;
processes repaint events.&lt;br /&gt;
&lt;br /&gt;
A particularly interesting combination of functions is download() in combination&lt;br /&gt;
with removeTempFile(). The former downloads a file from given URL and stores it&lt;br /&gt;
in a temporary file with a unique name. The name is stored in the second argument.&lt;br /&gt;
&amp;#039;&amp;#039;If&amp;#039;&amp;#039; the URL is local, the file is not downloaded, and instead the second&lt;br /&gt;
argument is set to the local file name. The function removeTempFile() deletes the&lt;br /&gt;
file given by its argument if the file is the result of a former download. &lt;br /&gt;
If that is not the case, it does nothing. Thus, a very easy to use way of loading&lt;br /&gt;
files regardless of their location is the following code snippet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KURL url;&lt;br /&gt;
url = ...;&lt;br /&gt;
QString tempFile;&lt;br /&gt;
if (KIO::NetAccess::download(url, tempFile) {&lt;br /&gt;
    // load the file with the name tempFile&lt;br /&gt;
    KIO::NetAccess::removeTempFile(tempFile);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Meta data ==&lt;br /&gt;
&lt;br /&gt;
As can be seen above, the interface to IO jobs is quite abstract and does not&lt;br /&gt;
consider any exchange of information between application and IO slave that&lt;br /&gt;
is protocol specific. This is not always appropriate. For example, you may give&lt;br /&gt;
certain parameters to the HTTP slave to control its caching behavior or&lt;br /&gt;
send a bunch of cookies with the request. For this need, the concept of meta&lt;br /&gt;
data has been introduced. When a job is created, you can configure it by adding&lt;br /&gt;
meta data to it. Each item of meta data consists of a key/value pair. For&lt;br /&gt;
example, in order to prevent the HTTP slave from loading a web page from its&lt;br /&gt;
cache, you can use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void FooClass::reloadPage()&lt;br /&gt;
{&lt;br /&gt;
    KURL url(&amp;quot;http://www.kdevelop.org/index.html&amp;quot;);&lt;br /&gt;
    KIO::TransferJob *job = KIO::get(url, true, false);&lt;br /&gt;
    job-&amp;gt;addMetaData(&amp;quot;cache&amp;quot;, &amp;quot;reload&amp;quot;);&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The same technique is used in the other direction, i.e. for communication from&lt;br /&gt;
the slave to the application. The method Job::queryMetaData() asks for the&lt;br /&gt;
value of the certain key delivered by the slave. For the HTTP slave, one such&lt;br /&gt;
example is the key &amp;quot;modified&amp;quot;, which contains a (stringified representation of)&lt;br /&gt;
the date when the web page was last modified. An example how you can use this&lt;br /&gt;
is the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void FooClass::printModifiedDate()&lt;br /&gt;
{&lt;br /&gt;
    KURL url(&amp;quot;http://www.kde.org&amp;quot;);&lt;br /&gt;
    KIO::TransferJob *job = KIO::get(url, true, false);&lt;br /&gt;
    connect( job, SIGNAL(result(KIO::Job*)),&lt;br /&gt;
             this, SLOT(transferResult(KIO::Job*)) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void FooClass::transferResult(KIO::Job *job)&lt;br /&gt;
{&lt;br /&gt;
    QString mimetype;&lt;br /&gt;
    if (job-&amp;gt;error())&lt;br /&gt;
        job-&amp;gt;showErrorDialog();&lt;br /&gt;
    else {&lt;br /&gt;
        KIO::TransferJob *transferJob = (KIO::TransferJob*) job;&lt;br /&gt;
        QString modified = transferJob-&amp;gt;queryMetaData(&amp;quot;modified&amp;quot;);&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Last modified: &amp;quot; &amp;lt;&amp;lt; modified &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scheduling ==&lt;br /&gt;
&lt;br /&gt;
When using the KIO API, you usually do not have to cope with the details of&lt;br /&gt;
starting IO slaves and communicating with them. The normal use case is to&lt;br /&gt;
start a job and with some parameters and handle the signals the jobs emits.&lt;br /&gt;
&lt;br /&gt;
Behind the curtains, the scenario is a lot more complicated. When you create a&lt;br /&gt;
job, it is put in a queue. When the application goes back to the event loop,&lt;br /&gt;
KIO allocates slave processes for the jobs in the queue.  For the first jobs&lt;br /&gt;
started, this is trivial: an IO slave for the appropriate protocol is started.&lt;br /&gt;
However, after the job (like a download from an http server) has finished, it&lt;br /&gt;
is not immediately killed. Instead, it is put in a pool of idle slaves and&lt;br /&gt;
killed after a certain time of inactivity (current 3 minutes). If a new request&lt;br /&gt;
for the same protocol and host arrives, the slave is reused. The obvious &lt;br /&gt;
advantage is that for a series of jobs for the same host, the cost for creating&lt;br /&gt;
new processes and possibly going through an authentication handshake is saved.&lt;br /&gt;
&lt;br /&gt;
Of course, reusing is only possible when the existing slave has already finished&lt;br /&gt;
its previous job. when a new request arrives while an existing slave process is &lt;br /&gt;
still running, a new process must be started and used. In the API usage in the&lt;br /&gt;
examples above, there are no limitation for creating new slave processes: if you&lt;br /&gt;
start a consecutive series of downloads for 20 different files, then KIO will &lt;br /&gt;
start 20 slave processes. This scheme of assigning slaves to jobs is called &lt;br /&gt;
&amp;#039;&amp;#039;direct&amp;#039;&amp;#039;. It  not always the most appropriate scheme, as it may need much&lt;br /&gt;
memory and put a high load on both the client and server machines.&lt;br /&gt;
&lt;br /&gt;
So there is a different way. You can &amp;#039;&amp;#039;schedule&amp;#039;&amp;#039; jobs. If you do this, only&lt;br /&gt;
a limited number (currently 3) of slave processes for a protocol will be &lt;br /&gt;
created. If you create more jobs than that, they are put in a queue and &lt;br /&gt;
are processed when a slave process becomes idle. This is done as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KURL url(&amp;quot;http://www.kde.org&amp;quot;);&lt;br /&gt;
KIO::TransferJob *job = KIO::get(url, true, false);&lt;br /&gt;
KIO::Scheduler::scheduleJob(job);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A third possibility is &amp;#039;&amp;#039;connection oriented&amp;#039;&amp;#039;. For example, for the IMAP &lt;br /&gt;
slave, it does not make any sense to start multiple processes for the same&lt;br /&gt;
server. Only one IMAP connection at a time should be enforced. In this case,&lt;br /&gt;
the application must explicitly deal with the notion of a slave. It has to&lt;br /&gt;
allocate a slave for a certain connection and then assign all jobs which &lt;br /&gt;
should go through the same connection to the same slave. This can again be&lt;br /&gt;
easily achieved by using the KIO::Scheduler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KURL baseUrl(&amp;quot;imap://bernd@albert.physik.hu-berlin.de&amp;quot;);&lt;br /&gt;
KIO::Slave *slave = KIO::Scheduler::getConnectedSlave(baseUrl);&lt;br /&gt;
&lt;br /&gt;
KIO::TransferJob *job1 = KIO::get(KURL(baseUrl, &amp;quot;/INBOX;UID=79374&amp;quot;));&lt;br /&gt;
KIO::Scheduler::assignJobToSlave(slave, job1);&lt;br /&gt;
&lt;br /&gt;
KIO::TransferJob *job2 = KIO::get(KURL(baseUrl, &amp;quot;/INBOX;UID=86793&amp;quot;));&lt;br /&gt;
KIO::Scheduler::assignJobToSlave(slave, job2);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
KIO::Scheduler::disconnectSlave(slave);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may only disconnect the slave after all jobs assigned to it are guaranted&lt;br /&gt;
to be finished.&lt;br /&gt;
&lt;br /&gt;
== Defining an ioslave ==&lt;br /&gt;
&lt;br /&gt;
In the following we discuss how you can add a new ioslave to the system.&lt;br /&gt;
In analogy to services, new ioslaves are advertised to the system by&lt;br /&gt;
installing a little configuration file. The following Makefile.am&lt;br /&gt;
snippet installs the ftp protocol:&lt;br /&gt;
&lt;br /&gt;
 protocoldir = $(kde_servicesdir)&lt;br /&gt;
 protocol_DATA = ftp.protocol&lt;br /&gt;
 EXTRA_DIST = $(mime_DATA)&lt;br /&gt;
&lt;br /&gt;
The contents of the file ftp.protocol is as follows:&lt;br /&gt;
&lt;br /&gt;
 [Protocol]&lt;br /&gt;
 exec=kio_ftp&lt;br /&gt;
 protocol=ftp&lt;br /&gt;
 input=none&lt;br /&gt;
 output=filesystem&lt;br /&gt;
 listing=Name,Type,Size,Date,Access,Owner,Group,Link,&lt;br /&gt;
 reading=true&lt;br /&gt;
 writing=true&lt;br /&gt;
 makedir=true&lt;br /&gt;
 deleting=true&lt;br /&gt;
 Icon=ftp&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;protocol&amp;quot; entry defines for which protocol this slave is responsible. &lt;br /&gt;
&amp;quot;exec&amp;quot; is (in contrast what you would expect naively) the name of the library &lt;br /&gt;
that implements the slave. When the slave is supposed to start, the &amp;quot;kdeinit&amp;quot; &lt;br /&gt;
executable is started which in turn loads this library into its address space.&lt;br /&gt;
So in practice, you can think of the running slave as a separate process &lt;br /&gt;
although it is implemented as library. The advantage of this mechanism is that &lt;br /&gt;
it saves a lot of memory and  reduces the time needed by the runtime linker.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;input&amp;quot; and &amp;quot;output&amp;quot; lines are not used currently.&lt;br /&gt;
&lt;br /&gt;
The remaining lines in the &amp;lt;tt&amp;gt;.protocol&amp;lt;/tt&amp;gt; file define which abilities the &lt;br /&gt;
slave has. In general, the features a slave must implement are much simpler than &lt;br /&gt;
the features the KIO API provides for the application. The reason for this is &lt;br /&gt;
that complex jobs are scheduled to a couple of subjobs. For example, in order to&lt;br /&gt;
list a directory recursively, one job will be started for the toplevel &lt;br /&gt;
directory. Then for each subdirectory reported back, new subjobs are started. A &lt;br /&gt;
scheduler in KIO makes sure that not too many jobs are active at the same time.&lt;br /&gt;
Similarly, in order to copy a file within a protocol that does not support &lt;br /&gt;
copying directly (like the ftp: protocol), KIO can read the source file and then &lt;br /&gt;
write the data to the destination file. For this to work, the &amp;lt;tt&amp;gt;.protocol&amp;lt;/tt&amp;gt;&lt;br /&gt;
must advertise the actions its slave supports.&lt;br /&gt;
&lt;br /&gt;
Since slaves are loaded as shared libraries, but constitute standalone programs,&lt;br /&gt;
their code framework looks a bit different from normal shared library plugins.&lt;br /&gt;
The function which is called to start the slave is called kdemain(). This &lt;br /&gt;
function does some initializations and then goes into an event loop and waits&lt;br /&gt;
for requests by the application using it. This looks as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
extern &amp;quot;C&amp;quot; { int kdemain(int argc, char **argv); }&lt;br /&gt;
&lt;br /&gt;
int kdemain(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    KLocale::setMainCatalogue(&amp;quot;kdelibs&amp;quot;);&lt;br /&gt;
    KInstance instance(&amp;quot;kio_ftp&amp;quot;);&lt;br /&gt;
    (void) KGlobal::locale();&lt;br /&gt;
&lt;br /&gt;
    if (argc != 4) {&lt;br /&gt;
        fprintf(stderr, &amp;quot;Usage: kio_ftp protocol &amp;quot;&lt;br /&gt;
                        &amp;quot;domain-socket1 domain-socket2\n&amp;quot;);&lt;br /&gt;
        exit(-1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    FtpSlave slave(argv[2], argv[3]);&lt;br /&gt;
    slave.dispatchLoop();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementing an ioslave ==&lt;br /&gt;
&lt;br /&gt;
Slaves are implemented as subclasses of KIO::SlaveBase (FtpSlave in the above &lt;br /&gt;
example). Thus, the actions listed in the .protocol correspond to&lt;br /&gt;
certain virtual functions in KIO::SlaveBase the slave implementation must &lt;br /&gt;
reimplement. Here is a list of possible actions and the corresponding virtual &lt;br /&gt;
functions:&lt;br /&gt;
&lt;br /&gt;
;reading - Reads data from a URL&lt;br /&gt;
:void get(const KURL &amp;amp;url)&lt;br /&gt;
;writing - Writes data to a URL and create the file if it does not exist yet.&lt;br /&gt;
:void put(const KURL &amp;amp;url, int permissions, bool overwrite, bool resume)&lt;br /&gt;
;moving - Renames a file.&lt;br /&gt;
:void rename(const KURL &amp;amp;src, const KURL &amp;amp;dest, bool overwrite)&lt;br /&gt;
;deleting - Deletes a file or directory.&lt;br /&gt;
:void del(const KURL &amp;amp;url, bool isFile)&lt;br /&gt;
;listing - Lists the contents of a directory.&lt;br /&gt;
:void listDir(const KURL &amp;amp;url)&lt;br /&gt;
;makedir - Creates a directory.;&lt;br /&gt;
:void mkdir(const KURL &amp;amp;url, int permissions)&lt;br /&gt;
&lt;br /&gt;
Additionally, there are reimplementable functions not listed in the &amp;lt;tt&amp;gt;.protocol&amp;lt;/tt&amp;gt;&lt;br /&gt;
file. For these operations, KIO automatically determines whether they are supported&lt;br /&gt;
or not (i.e. the default implementation returns an error).&lt;br /&gt;
&lt;br /&gt;
;Delivers information about a file, similar to the C function stat().&lt;br /&gt;
:void stat(const KURL &amp;amp;url)&lt;br /&gt;
;Changes the access permissions of a file.&lt;br /&gt;
:void chmod(const KURL &amp;amp;url, int permissions)&lt;br /&gt;
;Determines the MIME type of a file.&lt;br /&gt;
:void mimetype(const KURL &amp;amp;url)&lt;br /&gt;
;Copies a file.&lt;br /&gt;
:copy(const KURL &amp;amp;url, const KURL &amp;amp;dest, int permissions, bool overwrite)&lt;br /&gt;
;Creates a symbolic link.&lt;br /&gt;
:void symlink(const QString &amp;amp;target, const KURL &amp;amp;dest, bool overwrite)&lt;br /&gt;
&lt;br /&gt;
All these implementation should end with one of two calls: If the operation&lt;br /&gt;
was successful, they should call &amp;lt;tt&amp;gt;finished()&amp;lt;/tt&amp;gt;. If an error has occured,&lt;br /&gt;
&amp;lt;tt&amp;gt;error()&amp;lt;/tt&amp;gt; should be called with an error code as first argument and a&lt;br /&gt;
string in the second. Possible error codes are listed as enum KIO::Error. The&lt;br /&gt;
second argument is usually the URL in question. It is used e.g. in &lt;br /&gt;
KIO::Job::showErrorDialog() in order to parametrize the human-readable error&lt;br /&gt;
message.&lt;br /&gt;
&lt;br /&gt;
For slaves that correspond to network protocols, it might be interesting to &lt;br /&gt;
reimplement the method SlaveBase::setHost(). This is called to tell the slave&lt;br /&gt;
process about the host and port, and the user name and password to log in.&lt;br /&gt;
In general, meta data set by the application can be queried by SlaveBase::metaData().&lt;br /&gt;
You can check for the existence of meta data of a certain key with&lt;br /&gt;
SlaveBase::hasMetaData().&lt;br /&gt;
&lt;br /&gt;
== Communicating back to the application ==&lt;br /&gt;
&lt;br /&gt;
Various actions implemented in a slave need some way to communicate data back&lt;br /&gt;
to the application using the slave process:&lt;br /&gt;
&lt;br /&gt;
*get() sends blocks of data. This is done with data(), which takes a QByteArray as argument. Of course, you do not need to send all data at once. If you send a large file, call data() with smaller data blocks, so the application can process them. Call finished() when the transfer is finished.&lt;br /&gt;
&lt;br /&gt;
*listDir() reports information about the entries of a directory. For this purpose, call listEntries() with a KIO::UDSEntryList as argument. Analogously to data(), you can call this several times. When you are finished, call listEntry() with the second argument set to true. You may also call totalSize() to report the total number of directory entries, if known.&lt;br /&gt;
&lt;br /&gt;
*stat() reports information about a file like size, MIME type, etc. Such information is packaged in a KIO::UDSEntry, which will be discussed below. Use statEntry() to send such an item to the application.&lt;br /&gt;
&lt;br /&gt;
*mimetype() calls mimeType() with a string argument.&lt;br /&gt;
&lt;br /&gt;
*get() and copy() may want to provide progress information. This is done with the methods totalSize(), processedSize(), speed(). The total size and processed size are reported as bytes, the speed as bytes per second.&lt;br /&gt;
&lt;br /&gt;
*You can send arbitrary key/value pairs of meta data with setMetaData().&lt;br /&gt;
&lt;br /&gt;
== Interacting with the user ==&lt;br /&gt;
&lt;br /&gt;
Sometimes a slave has to interact with the user. Examples include informational&lt;br /&gt;
messages, authentication dialogs and confirmation dialogs when a file is about&lt;br /&gt;
to be overwritten.&lt;br /&gt;
&lt;br /&gt;
*infoMessage() - This is for informational feedback, such as the message &amp;quot;Retrieving data from &amp;amp;lt;host&amp;amp;gt;&amp;quot; from the http slave, which is often displayed in the status bar of the program. On the application side, this method corresponds to the signal KIO::Job::infoMessage().&lt;br /&gt;
*warning() - Displays a warning in a message box with KMessageBox::information(). If a message box is still open from a former call of warning() from the same slave process, nothing happens.&lt;br /&gt;
*messageBox() - This is richer than the previous method. It allows to open a message box with text and caption and some buttons. See the enum SlaveBase::MessageBoxType for reference.&lt;br /&gt;
*openPassDlg() - Opens a dialog for the input of user name and password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Initial Author:&amp;#039;&amp;#039; [mailto:bernd@kdevelop.org Bernd Gehrmann]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE3]]&lt;br /&gt;
[[Category:Architecture]]&lt;br /&gt;
[[Category:Developers]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Eliddell</name></author>
	</entry>
</feed>