diff options
author | Richard Hughes <richard@hughsie.com> | 2008-08-25 12:03:39 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2008-08-25 12:03:39 +0100 |
commit | f3e19e0e2a9859f29a24b9b89e3e3cbbd4124e9f (patch) | |
tree | a0c75db22256d806223f228bebc5da30be16a6b8 /docs/api | |
parent | 20f9d06773ad1ac4142cfa900a7539e40846adf3 (diff) |
clarify some documentation about the transaction methods
Diffstat (limited to 'docs/api')
-rw-r--r-- | docs/api/Makefile.am | 1 | ||||
-rw-r--r-- | docs/api/spec/pk-concepts.xml | 247 | ||||
-rw-r--r-- | docs/api/spec/pk-transactions-download.png | bin | 0 -> 24657 bytes | |||
-rw-r--r-- | docs/api/spec/pk-transactions.svg | 245 |
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 Binary files differnew file mode 100644 index 000000000..52bd066f4 --- /dev/null +++ b/docs/api/spec/pk-transactions-download.png 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> |