summaryrefslogtreecommitdiff
path: root/docs/api
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2008-08-25 12:03:39 +0100
committerRichard Hughes <richard@hughsie.com>2008-08-25 12:03:39 +0100
commitf3e19e0e2a9859f29a24b9b89e3e3cbbd4124e9f (patch)
treea0c75db22256d806223f228bebc5da30be16a6b8 /docs/api
parent20f9d06773ad1ac4142cfa900a7539e40846adf3 (diff)
clarify some documentation about the transaction methods
Diffstat (limited to 'docs/api')
-rw-r--r--docs/api/Makefile.am1
-rw-r--r--docs/api/spec/pk-concepts.xml247
-rw-r--r--docs/api/spec/pk-transactions-download.pngbin0 -> 24657 bytes
-rw-r--r--docs/api/spec/pk-transactions.svg245
4 files changed, 416 insertions, 77 deletions
diff --git a/docs/api/Makefile.am b/docs/api/Makefile.am
index d6fe3d611..da95f6e8a 100644
--- a/docs/api/Makefile.am
+++ b/docs/api/Makefile.am
@@ -52,6 +52,7 @@ HTML_IMAGES = \
spec/pk-transactions.svg \
spec/pk-transactions-set-locale.png \
spec/pk-transactions-failure.png \
+ spec/pk-transactions-download.png \
spec/pk-transactions-sig-install.png \
spec/pk-transactions-success.png \
spec/pk-transactions-trusted.png
diff --git a/docs/api/spec/pk-concepts.xml b/docs/api/spec/pk-concepts.xml
index cfa5a48b4..5a0434a59 100644
--- a/docs/api/spec/pk-concepts.xml
+++ b/docs/api/spec/pk-concepts.xml
@@ -636,79 +636,180 @@
New methods require a new transaction path (i.e. another call to <literal>GetTid</literal>)
which is synchronous and thus very fast.
</para>
- <para>
- A typical successful transaction can be seen below.
- </para>
- <mediaobject id="pk-transactions-success">
- <imageobject>
- <imagedata format="PNG" fileref="pk-transactions-success.png" align="center"/>
- </imageobject>
- </mediaobject>
- <para>
- A typical simple transaction failure case can be seen below.
- The user is not given the change to requeue the transaction as it is a fatal error.
- </para>
- <mediaobject id="pk-transactions-failure">
- <imageobject>
- <imagedata format="PNG" fileref="pk-transactions-failure.png" align="center"/>
- </imageobject>
- </mediaobject>
- <para>
- In this non-trivial example, a local file install is being attempted.
- First the <literal>InstallFile</literal> is called with the <literal>trusted</literal>
- flag set.
- This will fail if the package does not have a valid GPG key, and ordinarily the transaction
- would fail. What the client can do, e.g. using <literal>gnome-packagekit</literal>, is
- to re-request the <literal>InstallFile</literal> with <literal>non-trusted</literal>.
- This will use a different PolicyKit authentication, and allow the file to succeed.
- </para>
- <para>
- So why do we bother calling <literal>trusted</literal> in the first place?
- Well, the trusted PolicyKit role can be saved in the gnome-keyring, or could be
- set to the users password as the GPG key is already trusted by the user.
- The <literal>non-trusted</literal> action would likely ask for the administrator password,
- and not allowed to be saved. This gives the user the benifit of installing trusted local
- files without a password (common case) but requiring something stronger for untrusted or
- unsigned files.
- </para>
- <mediaobject id="pk-transactions-trusted">
- <imageobject>
- <imagedata format="PNG" fileref="pk-transactions-trusted.png" align="center"/>
- </imageobject>
- </mediaobject>
- <para>
- If the package is signed, and a valid GPG signature is available, then we need to ask the
- user to import the key, and re-run the transaction.
- This is done as three transactions, as other transactions may be queued and have a higher
- priority, and to make sure that the transaction object is not reused.
- </para>
- <mediaobject id="pk-transactions-sig-install">
- <imageobject>
- <imagedata format="PNG" fileref="pk-transactions-sig-install.png" align="center"/>
- </imageobject>
- </mediaobject>
- <para>
- If the package is signed, and a valid GPG signature is available, then we need to ask the
- user to import the key, and re-run the transaction.
- This is done as three transactions, as other transactions may be queued and have a higher
- priority, and to make sure that the transaction object is not reused.
- </para>
- <mediaobject id="pk-transactions-set-locale">
- <imageobject>
- <imagedata format="PNG" fileref="pk-transactions-set-locale.png" align="center"/>
- </imageobject>
- </mediaobject>
- <para>
- The PackageKit backend may support native localisation, which we should support if the
- translations exist.
- In the prior examples the <literal>SetLocale()</literal> method has been left out for brevity.
- If you are using the raw DBUS methods to access PackageKit, you will also need to make
- a call to <literal>SetLocale()</literal> so the daemon knows what locale to assign the
- transaction.
- If you are using libpackagekit to schedule transactions, then the locale will be set
- automatically in the <literal>PkControl</literal> GObject, and you do not need to call
- <literal>pk_client_set_locale()</literal> manually.
- </para>
+
+ <sect2 id="introduction-ideas-transactions-success">
+ <title>Transaction example: Success</title>
+ <mediaobject id="pk-transactions-success">
+ <imageobject>
+ <imagedata format="PNG" fileref="pk-transactions-success.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+ <para>
+ A typical successful transaction would emit signals such as
+ <literal>::Progress()</literal>, <literal>::Package()</literal> and
+ <literal>::StatusChanged()</literal>.
+ These are used to inform the client application of the current state,
+ so widgets such as icons or description text can be updated.
+ </para>
+ </sect2>
+
+ <sect2 id="introduction-ideas-transactions-failure">
+ <title>Transaction example: Failure</title>
+ <mediaobject id="pk-transactions-failure">
+ <imageobject>
+ <imagedata format="PNG" fileref="pk-transactions-failure.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+ <para>
+ This is the typical transaction failure case when there is no network available.
+ The user is not given the chance to requeue the transaction as it is a fatal error.
+ </para>
+ </sect2>
+
+ <sect2 id="introduction-ideas-transactions-trusted">
+ <title>Transaction example: Trusted</title>
+ <mediaobject id="pk-transactions-trusted">
+ <imageobject>
+ <imagedata format="PNG" fileref="pk-transactions-trusted.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+ <para>
+ In this non-trivial example, a local file install is being attempted.
+ First the <literal>InstallFile</literal> is called with the <literal>trusted</literal>
+ flag set.
+ This will fail if the package does not have a valid GPG key, and ordinarily the transaction
+ would fail. What the client can do, e.g. using <literal>libpackagekit</literal>, is
+ to re-request the <literal>InstallFile</literal> with <literal>non-trusted</literal>.
+ This will use a different PolicyKit authentication, and allow the file to succeed.
+ </para>
+ <para>
+ So why do we bother calling <literal>trusted</literal> in the first place?
+ Well, the trusted PolicyKit role can be saved in the gnome-keyring, or could be
+ set to the users password as the GPG key is already trusted by the user.
+ The <literal>non-trusted</literal> action would likely ask for the administrator password,
+ and not allowed to be saved. This gives the user the benifit of installing trusted local
+ files without a password (common case) but requiring something stronger for untrusted or
+ unsigned files.
+ </para>
+ </sect2>
+
+ <sect2 id="introduction-ideas-transactions-sig-install">
+ <title>Transaction example: Package signature install</title>
+ <mediaobject id="pk-transactions-sig-install">
+ <imageobject>
+ <imagedata format="PNG" fileref="pk-transactions-sig-install.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+ <para>
+ If the package is signed, and a valid GPG signature is available, then we need to ask the
+ user to import the key, and re-run the transaction.
+ This is done as three transactions, as other transactions may be queued and have a higher
+ priority, and to make sure that the transaction object is not reused.
+ </para>
+ <para>
+ Keep in mind that PackageKit can only be running one transaction at any
+ one time.
+ If we had designed the PackageKit API to block and wait for user input,
+ then no other transactions could be run whilst we are waiting for the user.
+ </para>
+ <para>
+ This is best explained using an example:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>User clicks "install vmware" followed by "confirm".</para>
+ </listitem>
+ <listitem>
+ <para>User walks away from the computer and takes a nap</para>
+ </listitem>
+ <listitem>
+ <para>System upgrade is scheduled (300Mb of updates)</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The vmware package is downloaded, but cannot be installed until a EULA
+ is agreed to.
+ If we pause the transaction then we never apply the updates automatically
+ and the computer is not kept up to date.
+ The user would have to wait a substantial amount of time waiting for
+ the updates to download when returning from his nap after clicking "I agree"
+ to the vmware EULA.
+ </para>
+ <para>
+ In the current system where transactions cannot block, the first
+ transaction downloads vmware, and then it finishes, and puts up a UI
+ for the user to click.
+ In the meantime the second transaction (the update) is scheduled,
+ downloaded and installed, and then finishes.
+ The user returns, clicks "okay" and a third transaction is created that
+ accepts the eula, and a forth that actually installs vmware.
+ </para>
+ <para>
+ It seems complicated, but it's essential to make sure none of the
+ callbacks block and stop other transactions from happening.
+ </para>
+ </sect2>
+
+ <sect2 id="introduction-ideas-transactions-download">
+ <title>Transaction example: Download</title>
+ <mediaobject id="pk-transactions-download">
+ <imageobject>
+ <imagedata format="PNG" fileref="pk-transactions-download.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+ <para>
+ When the <literal>DownloadPackages()</literal> method is called on a number
+ of packages, then these are downloaded by the daemon into a temporary
+ directory.
+ This directory can only be written by the <literal>packagekitd</literal>
+ user (usually root) but can be read by all users.
+ The files are not downloaded into any specific directory, instead a
+ random one is created in <literal>/var/cache/PackageKit</literal>.
+ The reason for this intermediate step is that the
+ <literal>DownloadPackages()</literal> method does not take a destination
+ directory as the dameon is running as a different user to the user,
+ and in a different SELinux context.
+ </para>
+ <para>
+ To preserve the SELinux attributes and the correct user and group ownership
+ of the newly created files, the client (running in the user session) has
+ to copy the files from the temporary directory into the chosen destination
+ directory.
+ NOTE: this copy step is optional but recommended, as the files will remain in
+ the temporary directory until the daemon is times out and is restarted.
+ As the client does not know (intentionally) the temporary directory or the
+ filenames of the packages that are created, the <literal>::Files()</literal>
+ signal is emitted with the full path of the downloaded files.
+ It is expected the <literal>package_id</literal> parameter of
+ <literal>::Files()</literal> will be blank, although this is not mandated.
+ </para>
+ <para>
+ Multiple <literal>::Files()</literal> signals can be sent by the dameon,
+ as the download operation may be pipelined, and the client should honour
+ every signal by copying each file.
+ </para>
+ </sect2>
+
+ <sect2 id="introduction-ideas-transactions-set-locale">
+ <title>Transaction example: Setting the locale</title>
+ <mediaobject id="pk-transactions-set-locale">
+ <imageobject>
+ <imagedata format="PNG" fileref="pk-transactions-set-locale.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+ <para>
+ The PackageKit backend may support native localisation, which we should support if the
+ translations exist.
+ In the prior examples the <literal>SetLocale()</literal> method has been left out for brevity.
+ If you are using the raw DBUS methods to access PackageKit, you will also need to make
+ a call to <literal>SetLocale()</literal> so the daemon knows what locale to assign the
+ transaction.
+ If you are using libpackagekit to schedule transactions, then the locale will be set
+ automatically in the <literal>PkControl</literal> GObject, and you do not need to call
+ <literal>pk_client_set_locale()</literal> manually.
+ </para>
+ </sect2>
+
</sect1>
<sect1 id="introduction-ideas-transactionid">
diff --git a/docs/api/spec/pk-transactions-download.png b/docs/api/spec/pk-transactions-download.png
new file mode 100644
index 000000000..52bd066f4
--- /dev/null
+++ b/docs/api/spec/pk-transactions-download.png
Binary files differ
diff --git a/docs/api/spec/pk-transactions.svg b/docs/api/spec/pk-transactions.svg
index 2a39467a4..f19062f7b 100644
--- a/docs/api/spec/pk-transactions.svg
+++ b/docs/api/spec/pk-transactions.svg
@@ -90,9 +90,9 @@
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="0.7"
- inkscape:cx="277.52317"
- inkscape:cy="649.44446"
+ inkscape:zoom="1.4"
+ inkscape:cx="245.14291"
+ inkscape:cy="-303.42646"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
@@ -1465,5 +1465,242 @@
height="42.426407"
x="-0.50507629"
y="1106.4054" /></flowRegion><flowPara
- id="flowPara2656"></flowPara></flowRoot> </g>
+ id="flowPara2656" /></flowRoot> <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.42000827;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2609"
+ width="475.07999"
+ height="179.9048"
+ x="30.019876"
+ y="1222.3502"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <rect
+ style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
+ id="rect2611"
+ width="35"
+ height="150.00012"
+ x="465.05988"
+ y="1247.3903"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <rect
+ style="opacity:0.76146785;fill:#ff8080;fill-opacity:1"
+ id="rect2613"
+ width="35"
+ height="169.97192"
+ x="250.05986"
+ y="1227.3903"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75028491;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 290,1382.3622 L 464.98906,1382.3623"
+ id="path2687"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:0.76146785;fill:#5fd38d;fill-opacity:1"
+ id="rect2615"
+ width="35"
+ height="104.97192"
+ x="35.059872"
+ y="1227.3903"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="-1278.495"
+ y="60"
+ id="text2619"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"><tspan
+ sodipodi:role="line"
+ id="tspan2621"
+ x="-1278.495"
+ y="60"
+ style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="-1315.0575"
+ y="490"
+ id="text2623"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"><tspan
+ sodipodi:role="line"
+ id="tspan2625"
+ x="-1315.0575"
+ y="490"
+ style="font-size:20px;text-align:center;text-anchor:middle">Transaction</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="-1313.4169"
+ y="275"
+ id="text2627"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"><tspan
+ sodipodi:role="line"
+ id="tspan2629"
+ x="-1313.4169"
+ y="275"
+ style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 460.00294,1262.3904 L 285.05988,1262.3904"
+ id="path2631"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 75.05988,1242.3904 L 249.93173,1242.3904"
+ id="path2633"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="164.3997"
+ y="1237.3903"
+ id="text2635"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"><tspan
+ sodipodi:role="line"
+ id="tspan2637"
+ x="164.3997"
+ y="1237.3903"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 245.03003,1252.3972 L 119.6421,1252.3972 L 110,1242.3622"
+ id="path2639"
+ sodipodi:nodetypes="ccc"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="370.39972"
+ y="1257.3903"
+ id="text2641"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"><tspan
+ sodipodi:role="line"
+ id="tspan2643"
+ x="370.39972"
+ y="1257.3903"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">DownloadPackages(p)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 290.11682,1302.3904 L 465.05988,1302.3904"
+ id="path2645"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="381.23956"
+ y="1297.3903"
+ id="text2647"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"><tspan
+ sodipodi:role="line"
+ id="tspan2649"
+ x="381.23956"
+ y="1297.3903"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Downloading(p)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 290.05988,1342.3904 L 465.00294,1342.3904"
+ id="path2669"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="381.18262"
+ y="1337.3903"
+ id="text2671"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"><tspan
+ sodipodi:role="line"
+ id="tspan2673"
+ x="381.18262"
+ y="1337.3903"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Files(a;b;c)</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="380.66309"
+ y="1377.3903"
+ id="text2689"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/spec/pk-transactions-trusted.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180"><tspan
+ sodipodi:role="line"
+ id="tspan2691"
+ x="380.66309"
+ y="1377.3903"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(success)</tspan></text>
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.43315262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2693"
+ width="130.06685"
+ height="60.007923"
+ x="89.966576"
+ y="1307.3287"
+ ry="9.3762369" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="152.6875"
+ y="1327.3622"
+ id="text2711"><tspan
+ sodipodi:role="line"
+ id="tspan2713"
+ x="152.6875"
+ y="1327.3622"
+ style="font-size:12px;text-align:center;text-anchor:middle">Client copies files</tspan><tspan
+ sodipodi:role="line"
+ x="152.6875"
+ y="1342.3622"
+ style="font-size:12px;text-align:center;text-anchor:middle"
+ id="tspan2715">from a, b and c to</tspan><tspan
+ sodipodi:role="line"
+ x="154.59766"
+ y="1357.3622"
+ style="font-size:12px;text-align:center;text-anchor:middle"
+ id="tspan2721">final destination </tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75000000000000000;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none"
+ d="M 250,1337.3622 C 220,1337.3622 220,1337.3622 220,1337.3622"
+ id="path2729" />
+ </g>
</svg>