diff options
-rw-r--r-- | gui/server_normal/mainwindow.ui | 29 | ||||
-rw-r--r-- | icons/cf_icon_cam.svg | 28 | ||||
-rw-r--r-- | icons/cf_icon_eye.svg | 18 | ||||
-rw-r--r-- | icons/cf_icon_lock.svg | 18 | ||||
-rw-r--r-- | icons/trash.svg | 1187 | ||||
-rw-r--r-- | pvsmgr.qrc | 1 | ||||
-rw-r--r-- | src/server/connectionframe/connectionframe.cpp | 18 | ||||
-rw-r--r-- | src/server/connectionframe/connectionframe.h | 5 | ||||
-rw-r--r-- | src/server/mainwindow/mainwindow.cpp | 275 | ||||
-rw-r--r-- | src/server/mainwindow/mainwindow.h | 8 | ||||
-rw-r--r-- | src/server/net/client.cpp | 17 | ||||
-rw-r--r-- | src/server/net/client.h | 2 |
12 files changed, 1467 insertions, 139 deletions
diff --git a/gui/server_normal/mainwindow.ui b/gui/server_normal/mainwindow.ui index 6d29c97..8ab1c05 100644 --- a/gui/server_normal/mainwindow.ui +++ b/gui/server_normal/mainwindow.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>838</width> - <height>607</height> + <width>1246</width> + <height>858</height> </rect> </property> <property name="windowTitle"> @@ -46,6 +46,28 @@ <property name="lineWidth"> <number>2</number> </property> + <widget class="QLabel" name="trash"> + <property name="geometry"> + <rect> + <x>10</x> + <y>10</y> + <width>111</width> + <height>121</height> + </rect> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="text"> + <string/> + </property> + <property name="pixmap"> + <pixmap resource="../../pvsmgr.qrc">:/trash</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> </widget> </item> </layout> @@ -181,7 +203,7 @@ </action> <action name="action_StopProjection"> <property name="icon"> - <iconset resource="../../pvsclient.qrc"> + <iconset resource="../../pvsmgr.qrc"> <normaloff>:/reset</normaloff>:/reset</iconset> </property> <property name="text"> @@ -218,7 +240,6 @@ </widget> <layoutdefault spacing="6" margin="11"/> <resources> - <include location="../../pvsclient.qrc"/> <include location="../../pvsmgr.qrc"/> </resources> <connections/> diff --git a/icons/cf_icon_cam.svg b/icons/cf_icon_cam.svg index cd1599d..c51ab6d 100644 --- a/icons/cf_icon_cam.svg +++ b/icons/cf_icon_cam.svg @@ -22,6 +22,14 @@ <defs id="defs4"> <linearGradient + id="linearGradient5208" + osb:paint="solid"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop5210" /> + </linearGradient> + <linearGradient id="linearGradient3765"> <stop style="stop-color:#000000;stop-opacity:1;" @@ -76,20 +84,20 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="2.7559525" - inkscape:cx="-102.56898" - inkscape:cy="47.623858" + inkscape:zoom="5.511905" + inkscape:cx="76.742745" + inkscape:cy="65.372119" inkscape:document-units="px" inkscape:current-layer="layer2" showgrid="true" objecttolerance="10000" gridtolerance="10000" guidetolerance="10000" - inkscape:window-width="1262" - inkscape:window-height="693" - inkscape:window-x="583" - inkscape:window-y="111" - inkscape:window-maximized="0"> + inkscape:window-width="1280" + inkscape:window-height="1000" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="1"> <inkscape:grid type="xygrid" id="grid2410" @@ -118,8 +126,8 @@ style="display:inline;filter:url(#filter3249)" transform="translate(0,96)"> <path - style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="M 26.506119,-95.99996 C 11.874743,-95.99996 0,-83.87831 0,-68.942709 c 0,9.631705 4.9381305,18.090939 12.369524,22.885922 l 0,29.424765 c 0,3.99726 3.15246,7.2152714 7.068296,7.2152714 l 13.871538,0 -21.021393,34.1909936 c -0.978965,1.730866 -0.392394,3.938647 1.303177,4.937954 l 3.04823,1.803817 c 1.695632,0.999312 3.858421,0.400555 4.837381,-1.330322 l 24.069573,-39.6024426 7.863482,0 24.069623,39.6024426 c 0.978954,1.730866 3.141748,2.329613 4.837324,1.330322 l 3.048231,-1.803817 c 1.69563,-0.999318 2.282191,-3.207104 1.303232,-4.937954 l -21.021392,-34.1909936 17.405684,0 c 3.915838,0 7.068298,-3.2180114 7.068298,-7.2152714 l 0,-3.968395 c 2.540348,-1.203699 11.993052,-5.004891 20.498062,0.360752 4.0334,2.544611 4.44853,8.999808 8.48197,11.5444257 2.70567,1.7069772 5.06943,1.7069772 7.77512,0 2.01669,-1.2723054 0.70379,-3.3521357 0.70677,-5.7722107 0.0128,-12.025439 0.0128,-21.164789 0,-33.190229 -0.003,-2.420075 1.30988,-4.499899 -0.70677,-5.772211 -2.70569,-1.706988 -5.06945,-1.706988 -7.77512,0 -4.03344,2.544611 -4.44857,8.999805 -8.48197,11.544427 -8.50593,5.36626 -17.958965,1.541446 -20.498062,0.33818 l 0,-4.509541 C 97.5522,-50.851807 102.49033,-59.311045 102.49033,-68.942749 102.49033,-83.878351 90.615589,-96 75.984214,-96 64.705818,-96 55.071346,-88.802714 51.245167,-78.660813 47.418934,-88.802676 37.784464,-95.99996 26.506119,-95.99996 z" + style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.06365538;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 27.497854,-94.616806 c -14.315166,0 -25.933274,11.85968 -25.933274,26.472495 0,9.423546 4.8314088,17.699961 12.102197,22.391317 l 0,28.788841 c 0,3.910873 3.084329,7.0593383 6.915538,7.0593383 l 13.571748,0 L 13.58698,23.547251 c -0.957808,1.693458 -0.383914,3.853524 1.275013,4.831235 l 2.982353,1.764834 c 1.658986,0.977715 3.775033,0.391898 4.732836,-1.301572 l 23.549385,-38.7465627 7.693541,0 23.549433,38.7465627 c 0.957797,1.693458 3.073851,2.279266 4.732782,1.301572 l 2.982353,-1.764834 c 1.658984,-0.977721 2.232868,-3.137793 1.275067,-4.831235 l -20.567082,-33.4520657 17.029515,0 c 3.831212,0 6.91554,-3.1484653 6.91554,-7.0593383 l 0,-3.882629 c 2.485446,-1.177684 11.733864,-4.896726 20.055064,0.352956 3.94622,2.489616 4.35239,8.805305 8.29865,11.2949293 2.64719,1.6700861 4.95988,1.6700861 7.60709,0 1.9731,-1.2448093 0.68858,-3.2796903 0.69149,-5.6474633 0.0126,-11.765547 0.0126,-20.70738 0,-32.472929 -0.003,-2.367772 1.28157,-4.402648 -0.69149,-5.647463 -2.64721,-1.670097 -4.9599,-1.670097 -7.60709,0 -3.94626,2.489618 -4.35243,8.805304 -8.29865,11.294931 -8.3221,5.250286 -17.570842,1.508133 -20.055064,0.330872 l 0,-4.412081 c 7.270786,-4.691356 12.102184,-12.967774 12.102184,-22.391321 0,-14.612816 -11.618096,-26.472494 -25.933259,-26.472494 -11.034651,0 -20.460906,7.041739 -24.204393,16.964456 -3.743541,-9.92268 -13.169794,-16.964417 -24.204394,-16.964417 z" id="rect3212" sodipodi:nodetypes="csccccccccccccccccccssssssssccsscc" inkscape:connector-curvature="0" /> diff --git a/icons/cf_icon_eye.svg b/icons/cf_icon_eye.svg index 06d6f85..6f7f3f8 100644 --- a/icons/cf_icon_eye.svg +++ b/icons/cf_icon_eye.svg @@ -36,23 +36,23 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1156" + inkscape:window-width="1280" + inkscape:window-height="1000" id="namedview8" showgrid="true" - inkscape:zoom="4.2142857" - inkscape:cx="-20.387675" - inkscape:cy="53.464011" - inkscape:window-x="-2" - inkscape:window-y="-3" + inkscape:zoom="5.9599" + inkscape:cx="42.050215" + inkscape:cy="67.037619" + inkscape:window-x="0" + inkscape:window-y="24" inkscape:window-maximized="1" inkscape:current-layer="svg2" showguides="false" inkscape:snap-page="false" inkscape:snap-grids="true" /> <path - style="fill:#cccccc;fill-opacity:1;stroke:none" + style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0" id="path6" - d="m 118.85716,-192 q -10.85723,-16.38893 -27.214316,-24.51387 4.357145,7.22224 4.357145,15.62497 0,12.84723 -9.392852,21.97913 -9.392856,9.13197 -22.607145,9.13197 -13.214287,0 -22.607146,-9.13197 -9.392851,-9.1319 -9.392851,-21.97913 0,-8.40273 4.357146,-15.62497 -16.357142,8.12494 -27.2142853,24.51387 9.5000023,14.23607 23.8214253,22.6736 14.321429,8.4375 31.035711,8.4375 16.714283,0 31.035714,-8.4375 14.321374,-8.43753 23.821454,-22.6736 z m -51.428602,-26.6667 q 0,-1.38887 -0.999996,-2.36103 -0.999992,-0.97224 -2.42857,-0.97224 -8.92857,0 -15.321428,6.21524 -6.392856,6.2153 -6.392856,14.89583 0,1.38887 1,2.36113 1.000001,0.97227 2.428576,0.97227 1.42857,0 2.428566,-0.97227 1,-0.97226 1,-2.36113 0,-5.97213 4.357144,-10.2083 4.357141,-4.23613 10.499998,-4.23613 1.428578,0 2.42857,-0.97227 0.999996,-0.97217 0.999996,-2.3611 z M 128,-192 q 0,2.36107 -1.42855,4.79167 -10.00001,15.9722 -26.892896,25.59033 Q 82.785705,-152 63.999992,-152 45.214281,-152 28.321426,-161.65287 11.428572,-171.3056 1.4285712,-187.20833 0,-189.63893 0,-192 0,-194.3611 1.4285712,-196.7917 11.428572,-212.6944 28.321426,-222.34713 45.214281,-232 63.999992,-232 q 18.785713,0 35.678562,9.65287 16.892886,9.65273 26.892896,25.55543 Q 128,-194.3611 128,-192 z" /> + d="m 118.02062,-192 q -10.67506,-16.11394 -26.757696,-24.10255 4.284038,7.10106 4.284038,15.3628 0,12.63167 -9.235251,21.61034 -9.235255,8.97875 -22.227825,8.97875 -12.992567,0 -22.227825,-8.97875 -9.23525,-8.97867 -9.23525,-21.61034 0,-8.26174 4.284038,-15.3628 -16.082688,7.98861 -26.757662,24.10255 9.340603,13.9972 23.42173,22.29316 14.081132,8.29593 30.514969,8.29593 16.433837,0 30.514972,-8.29593 Q 108.67994,-178.0028 118.02062,-192 z m -50.565695,-26.21926 q 0,-1.36558 -0.983217,-2.32142 -0.983214,-0.95593 -2.387822,-0.95593 -8.778759,0 -15.064353,6.11096 -6.285591,6.11102 -6.285591,14.6459 0,1.36556 0.983221,2.32151 0.983223,0.95595 2.387828,0.95595 1.4046,0 2.387817,-0.95595 0.983222,-0.95595 0.983222,-2.32151 0,-5.87193 4.284036,-10.03702 4.284033,-4.16506 10.32382,-4.16506 1.404608,0 2.387822,-0.95596 0.983217,-0.95585 0.983217,-2.32147 z M 127.01005,-192 q 0,2.32146 -1.40458,4.71127 -9.83222,15.7042 -26.441665,25.16096 -16.609408,9.45662 -35.079919,9.45662 -18.470509,0 -35.079922,-9.49091 -16.609413,-9.49077 -26.441625,-25.12667 -1.4046014,-2.38981 -1.4046014,-4.71127 0,-2.32149 1.4046014,-4.7113 9.832212,-15.63587 26.441625,-25.12664 16.609413,-9.49091 35.079922,-9.49091 18.470511,0 35.079919,9.49091 16.609445,9.49077 26.441665,25.12664 1.40458,2.38981 1.40458,4.7113 z" /> </svg> diff --git a/icons/cf_icon_lock.svg b/icons/cf_icon_lock.svg index 40eac88..ceff44b 100644 --- a/icons/cf_icon_lock.svg +++ b/icons/cf_icon_lock.svg @@ -36,25 +36,25 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1156" + inkscape:window-width="1280" + inkscape:window-height="1000" id="namedview2995" showgrid="false" - inkscape:zoom="0.26339286" - inkscape:cx="1103.7208" - inkscape:cy="559.2271" - inkscape:window-x="-2" - inkscape:window-y="-3" + inkscape:zoom="0.37249375" + inkscape:cx="377.5311" + inkscape:cy="1119.8752" + inkscape:window-x="0" + inkscape:window-y="24" inkscape:window-maximized="1" inkscape:current-layer="svg2989" /> <g transform="matrix(1.269571,0,0,-1.269571,170.84746,1536)" id="g2991" - style="fill:#cccccc"> + style="fill:#cccccc;stroke:none;stroke-opacity:1;stroke-width:7.87667644999999972;stroke-miterlimit:4;stroke-dasharray:none"> <path d="m 704,512 q 0,53 -37.5,90.5 Q 629,640 576,640 523,640 485.5,602.5 448,565 448,512 q 0,-37 19,-67 19,-30 51,-47 L 449,169 q -5,-15 5,-28 10,-13 26,-13 h 192 q 16,0 26,13 10,13 5,28 l -69,229 q 32,17 51,47 19,30 19,67 z M 320,768 h 512 v 192 q 0,106 -75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 V 768 z m 832,-96 V 96 Q 1152,56 1124,28 1096,0 1056,0 H 96 Q 56,0 28,28 0,56 0,96 v 576 q 0,40 28,68 28,28 68,28 h 32 v 192 q 0,184 132,316 132,132 316,132 184,0 316,-132 132,-132 132,-316 V 768 h 32 q 40,0 68,-28 28,-28 28,-68 z" id="path2993" inkscape:connector-curvature="0" - style="fill:#cccccc" /> + style="fill:#cccccc;stroke:none;stroke-opacity:1;stroke-width:7.87667644999999972;stroke-miterlimit:4;stroke-dasharray:none" /> </g> </svg> diff --git a/icons/trash.svg b/icons/trash.svg new file mode 100644 index 0000000..e217a09 --- /dev/null +++ b/icons/trash.svg @@ -0,0 +1,1187 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="521.23871" + height="529.31995" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46+devel" + sodipodi:docname="trash.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + version="1.0" + inkscape:export-filename="/home/hrum/Pictures/openclipart/trash.png" + inkscape:export-xdpi="29" + inkscape:export-ydpi="29"> + <title + id="title162">trash</title> + <defs + id="defs4"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 526.18109 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective160" /> + <linearGradient + id="linearGradient3482" + inkscape:collect="always"> + <stop + id="stop3484" + offset="0" + style="stop-color:#ffffff;stop-opacity:0.75138122" /> + <stop + id="stop3486" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3470"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3472" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3474" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3438"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3440" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3442" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3398"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3400" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3402" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3390"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3392" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3394" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3334"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3336" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3338" /> + </linearGradient> + <linearGradient + id="linearGradient3308" + inkscape:collect="always"> + <stop + id="stop3310" + offset="0" + style="stop-color:#000000;stop-opacity:0.28729282" /> + <stop + id="stop3312" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3274"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3276" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3278" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3250"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3252" /> + <stop + id="stop3258" + offset="0.72804081" + style="stop-color:#000000;stop-opacity:0.81081081" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3254" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3240"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3242" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3244" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3228"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3230" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3232" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3137"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3139" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3141" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3129"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3131" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3133" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3121"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3123" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3125" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2958"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop2960" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop2962" /> + </linearGradient> + <linearGradient + id="linearGradient2898"> + <stop + style="stop-color:#eceee9;stop-opacity:1;" + offset="0" + id="stop2900" /> + <stop + style="stop-color:#c6b6b6;stop-opacity:0;" + offset="1" + id="stop2902" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient2904" + cx="204.14012" + cy="464.34125" + fx="199.9191" + fy="598.38995" + r="171.42857" + gradientTransform="matrix(0.9261318,-4.6209423e-8,6.1492962e-8,1.9887236,45.685314,-460.63562)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient2916" + cx="398.48984" + cy="499.07516" + fx="398.48984" + fy="499.07516" + r="171.42857" + gradientTransform="matrix(1.155248,0,0,0.5,-61.864707,180.4668)" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="linearGradient2944" + x1="368.31082" + y1="546.77179" + x2="502.32489" + y2="546.77179" + gradientUnits="userSpaceOnUse" + spreadMethod="reflect" + gradientTransform="translate(119.198,32.324881)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient2970" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="252.53815" + fy="545.35742" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2958" + id="radialGradient2972" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="277.07745" + fy="552.4173" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient2980" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="252.53815" + fy="545.35742" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2958" + id="radialGradient2982" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="277.07745" + fy="552.4173" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient2990" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="252.53815" + fy="545.35742" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2958" + id="radialGradient2992" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="277.07745" + fy="552.4173" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient3000" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="252.53815" + fy="545.35742" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2958" + id="radialGradient3002" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="277.07745" + fy="552.4173" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient3010" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="252.53815" + fy="545.35742" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2958" + id="radialGradient3012" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="277.07745" + fy="552.4173" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient3086" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="252.53815" + fy="545.35742" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2958" + id="radialGradient3088" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="277.07745" + fy="552.4173" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient3090" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="252.53815" + fy="545.35742" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2958" + id="radialGradient3092" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="277.07745" + fy="552.4173" + r="24.243662" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3121" + id="linearGradient3127" + x1="396.95291" + y1="442.70932" + x2="365.05893" + y2="360.93362" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3129" + id="linearGradient3135" + x1="449.62631" + y1="486.28427" + x2="349.36731" + y2="314.88644" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3137" + id="linearGradient3143" + x1="356.7598" + y1="756.88354" + x2="368.41394" + y2="205.34026" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(119.198,32.324881)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2898" + id="radialGradient3196" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="252.53815" + fy="545.35742" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2958" + id="radialGradient3198" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,4.1249996,0,-1763.9326)" + cx="264.65997" + cy="564.4585" + fx="277.07745" + fy="552.4173" + r="24.243662" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3228" + id="radialGradient3234" + cx="285.71426" + cy="532.36218" + fx="292.74445" + fy="648.23889" + r="171.42857" + gradientTransform="matrix(0.91304489,2.7805358e-8,0,0.81625055,24.844341,12.106971)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3240" + id="linearGradient3246" + x1="342.85715" + y1="551.68921" + x2="411.42856" + y2="551.68921" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(119.198,32.324881)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3250" + id="radialGradient3256" + cx="284.86301" + cy="667.49408" + fx="343.45184" + fy="706.10431" + r="173.74623" + gradientTransform="matrix(1,0,0,0.3662791,0,423.00496)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3274" + id="linearGradient3272" + x1="312.56506" + y1="728.25836" + x2="500.29697" + y2="590.70825" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3240" + id="radialGradient3286" + cx="400.02036" + cy="588.42487" + fx="400.02036" + fy="588.42487" + r="107.07617" + gradientTransform="matrix(0.1717355,0.708083,-1.4748645,0.2180553,1268.1112,213.41957)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3274" + id="linearGradient3296" + x1="738.84052" + y1="935.02405" + x2="300.94659" + y2="534.75629" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3121" + id="linearGradient3300" + gradientUnits="userSpaceOnUse" + x1="393.42719" + y1="410.52774" + x2="476.02936" + y2="498.66617" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="radialGradient3304" + cx="388.66751" + cy="655.15833" + fx="394.22461" + fy="754.88953" + r="107.07617" + gradientTransform="matrix(1,0,0,1.1603773,0,-101.8667)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3129" + id="linearGradient3322" + x1="519.14221" + y1="639.38013" + x2="452.30872" + y2="645.0625" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3334" + id="radialGradient3340" + cx="196.99835" + cy="623.29962" + fx="196.99835" + fy="623.29962" + r="69.276512" + gradientTransform="matrix(0.9798086,0.199938,-0.4666067,2.2866349,419.62974,-785.85654)" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter3382" + color-interpolation-filters="sRGB"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="2.1557008" + id="feGaussianBlur3384" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3390" + id="radialGradient3396" + cx="401.50946" + cy="662.97162" + fx="401.50946" + fy="662.97162" + r="112.07617" + gradientTransform="matrix(0.8217788,-0.4200565,0.7942332,0.7930358,-439.66434,275.57864)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3398" + id="linearGradient3404" + x1="415.92352" + y1="170.45996" + x2="508.94351" + y2="585.60388" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3390" + id="linearGradient3416" + x1="353.55341" + y1="625.84088" + x2="78.791908" + y2="532.90686" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(119.198,32.324881)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3438" + id="radialGradient3444" + cx="210.11172" + cy="721.03217" + fx="210.11172" + fy="721.03217" + r="54.548237" + gradientTransform="matrix(1,0,0,0.2592593,0,534.0979)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3240" + id="radialGradient3456" + cx="154.01448" + cy="570.1958" + fx="154.01448" + fy="570.1958" + r="18.40757" + gradientTransform="matrix(0.4422318,-1.5187565,3.8424618,1.1188486,-2050.2279,199.92413)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3240" + id="radialGradient3466" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.1818728,-1.2150059,3.9579448,0.5924599,-2066.1621,442.31135)" + cx="192.24854" + cy="571.40808" + fx="192.24854" + fy="571.40808" + r="18.40757" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3470" + id="linearGradient3476" + x1="159.61343" + y1="600.21936" + x2="158.57143" + y2="590.93365" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1182618,0,0,1.1182618,24.14155,-48.055699)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3482" + id="linearGradient3480" + gradientUnits="userSpaceOnUse" + x1="168.73528" + y1="618.07648" + x2="173.021" + y2="604.50507" + gradientTransform="matrix(1.1182618,0,0,1.1182618,24.14155,-48.055699)" /> + <filter + inkscape:collect="always" + id="filter3534" + color-interpolation-filters="sRGB"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.3702702" + id="feGaussianBlur3536" /> + </filter> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.7" + inkscape:cx="232.89597" + inkscape:cy="237.45225" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1053" + inkscape:window-height="815" + inkscape:window-x="163" + inkscape:window-y="208" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>trash</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>hrum</dc:title> + </cc:Agent> + </dc:creator> + <cc:license + rdf:resource="http://creativecommons.org/licenses/publicdomain/" /> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/publicdomain/"> + <cc:permits + rdf:resource="http://creativecommons.org/ns#Reproduction" /> + <cc:permits + rdf:resource="http://creativecommons.org/ns#Distribution" /> + <cc:permits + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-105.05586,-268.4838)"> + <rect + style="opacity:0.75138119;fill:none;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="rect3538" + width="521.23871" + height="529.31995" + x="105.05586" + y="268.4838" + inkscape:export-filename="C:\Documents and Settings\kostia.VVCDC\trash.png" + inkscape:export-xdpi="31.965542" + inkscape:export-ydpi="31.965542" /> + <path + sodipodi:type="arc" + style="opacity:0.85405405;fill:url(#radialGradient3256);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3248" + sodipodi:cx="284.86301" + sodipodi:cy="667.49408" + sodipodi:rx="173.74623" + sodipodi:ry="63.63961" + d="m 458.60924,667.49408 c 0,35.14719 -77.78884,63.63961 -173.74623,63.63961 -95.9574,0 -173.74623,-28.49242 -173.74623,-63.63961 0,-35.14719 77.78883,-63.63961 173.74623,-63.63961 95.95739,0 173.74623,28.49242 173.74623,63.63961 z" + transform="matrix(0.968254,0,0,1.0952381,112.07883,-53.469344)" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3143);stroke-width:6.93961;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 587.05514,398.98113 -341.1461,1.40625 c 12.9324,29.80885 43.88459,269.80279 44.13271,270.09375 -0.002,0.1258 0,0.249 0,0.375 0,30.92582 56.59151,56.03125 126.3125,56.03125 68.3945,0 124.122,-24.13691 126.21875,-54.25 0.5855,-0.25227 0.90625,-0.51736 0.90625,-0.8125 0,-8.57146 43.57589,-272.84375 43.57589,-272.84375 z" + id="path2314" + sodipodi:nodetypes="cccsscsc" /> + <path + sodipodi:nodetypes="cccsscsc" + id="path2918" + d="m 589.198,398.98113 -346.1461,1.40625 c 12.9324,29.80885 46.74173,269.80279 46.98985,270.09375 -0.002,0.1258 0,0.249 0,0.375 0,30.92582 56.59151,56.03125 126.3125,56.03125 68.3945,0 124.122,-24.13691 126.21875,-54.25 0.5855,-0.25227 0.90625,-0.51736 0.90625,-0.8125 0,-8.57146 45.71875,-272.84375 45.71875,-272.84375 z" + style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.93961;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + <path + style="fill:url(#linearGradient2944);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.93961;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + d="m 589.198,398.98113 -346.1461,1.40625 c 12.9324,29.80885 46.74173,269.80279 46.98985,270.09375 -0.002,0.1258 0,0.249 0,0.375 0,30.92582 56.59151,56.03125 126.3125,56.03125 68.3945,0 124.122,-24.13691 126.21875,-54.25 0.5855,-0.25227 0.90625,-0.51736 0.90625,-0.8125 0,-8.57146 45.71875,-272.84375 45.71875,-272.84375 z" + id="path2936" + sodipodi:nodetypes="cccsscsc" /> + <path + style="fill:url(#radialGradient3340);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3382)" + d="m 246.47722,755.37733 c 0,0 42.42641,4.04061 76.77159,-4.04061 34.34519,-8.08122 46.46702,-28.28427 46.46702,-28.28427 0,0 16.16244,-191.92898 -24.24366,-218.19295 -40.4061,-26.26396 -64.64976,12.12183 -80.8122,44.44671 -16.16244,32.32489 -30.30458,80.81221 -30.30458,94.95434 0,14.14214 6.06092,44.44672 6.06092,54.54824 0,10.10153 2.0203,54.54824 6.06091,56.56854 z" + id="path3332" /> + <path + transform="matrix(1.0032055,0,0,0.7897442,129.71073,109.64182)" + d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z" + sodipodi:ry="85.714287" + sodipodi:rx="171.42857" + sodipodi:cy="360.93362" + sodipodi:cx="285.71429" + id="path2312" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3135);stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path2906" + sodipodi:cx="285.71429" + sodipodi:cy="360.93362" + sodipodi:rx="171.42857" + sodipodi:ry="85.714287" + d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z" + transform="matrix(1.0032055,0,0,0.7897442,129.71073,109.64182)" /> + <path + transform="matrix(1.0032055,0,0,0.7897442,129.71073,109.64182)" + d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z" + sodipodi:ry="85.714287" + sodipodi:rx="171.42857" + sodipodi:cy="360.93362" + sodipodi:cx="285.71429" + id="path2908" + style="fill:url(#radialGradient2916);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3127);stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path2310" + sodipodi:cx="285.71429" + sodipodi:cy="360.93362" + sodipodi:rx="171.42857" + sodipodi:ry="85.714287" + d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z" + transform="matrix(0.9572542,0,0,0.7535704,142.83967,101.0245)" /> + <path + transform="matrix(0.9572542,0,0,0.7535704,142.83967,101.0245)" + d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z" + sodipodi:ry="85.714287" + sodipodi:rx="171.42857" + sodipodi:cy="360.93362" + sodipodi:cx="285.71429" + id="path2319" + style="fill:url(#radialGradient2904);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <g + style="opacity:0.65405405" + id="g3054" + transform="matrix(0.3717798,-0.06856265,0.1813592,0.9834169,-57.014971,-14.546594)" /> + <path + style="fill:url(#linearGradient3246);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 490.62657,458.97278 c 0,0 8.57143,111.42857 2.85714,148.57143 -5.71428,37.14285 -31.42857,40 -31.42857,80 0,40 14.28572,28.57142 14.28572,28.57142 0,0 -2.85715,-2.85714 25.71428,-45.71428 28.57143,-42.85714 28.57143,-42.85714 28.57143,-62.85714 0,-20 -8.57143,-105.71429 -8.57143,-120 0,-14.28572 0,-37.14286 0,-37.14286 l -31.42857,8.57143 z" + id="path3238" /> + <g + id="g3200" + transform="matrix(0.9718673,-0.00766365,0.00766365,0.9718673,124.65597,46.271524)"> + <g + transform="matrix(0.7437115,-0.01685799,0.02266156,0.9997432,52.198924,0.4117641)" + id="g2966"> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient2970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path2946" + sodipodi:cx="264.65997" + sodipodi:cy="564.4585" + sodipodi:rx="24.243662" + sodipodi:ry="100.0051" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" /> + <path + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + sodipodi:ry="100.0051" + sodipodi:rx="24.243662" + sodipodi:cy="564.4585" + sodipodi:cx="264.65997" + id="path2956" + style="fill:url(#radialGradient2972);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + style="opacity:0.65405405" + id="g2974" + transform="matrix(0.3764442,0.0347959,-0.09204074,0.9957552,380.98036,-41.344669)"> + <path + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + sodipodi:ry="100.0051" + sodipodi:rx="24.243662" + sodipodi:cy="564.4585" + sodipodi:cx="264.65997" + id="path2976" + style="fill:url(#radialGradient2980);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient2982);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path2978" + sodipodi:cx="264.65997" + sodipodi:cy="564.4585" + sodipodi:rx="24.243662" + sodipodi:ry="100.0051" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" /> + </g> + <g + style="opacity:0.57297297" + id="g2984" + transform="matrix(0.5242633,0.01154367,-0.02201351,0.9997577,236.86728,-5.0007997)"> + <path + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + sodipodi:ry="100.0051" + sodipodi:rx="24.243662" + sodipodi:cy="564.4585" + sodipodi:cx="264.65997" + id="path2986" + style="fill:url(#radialGradient2990);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient2992);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path2988" + sodipodi:cx="264.65997" + sodipodi:cy="564.4585" + sodipodi:rx="24.243662" + sodipodi:ry="100.0051" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" /> + </g> + <g + style="opacity:0.80540544" + transform="matrix(0.5971844,-0.02121212,0.03549783,0.9993698,138.23081,4.0638809)" + id="g2994"> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient3000);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path2996" + sodipodi:cx="264.65997" + sodipodi:cy="564.4585" + sodipodi:rx="24.243662" + sodipodi:ry="100.0051" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" /> + <path + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + sodipodi:ry="100.0051" + sodipodi:rx="24.243662" + sodipodi:cy="564.4585" + sodipodi:cx="264.65997" + id="path2998" + style="fill:url(#radialGradient3002);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + <g + style="opacity:0.43243247" + id="g3004" + transform="matrix(0.4508564,0.01809985,-0.04011317,0.9991951,303.27718,-22.616052)"> + <path + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + sodipodi:ry="100.0051" + sodipodi:rx="24.243662" + sodipodi:cy="564.4585" + sodipodi:cx="264.65997" + id="path3006" + style="fill:url(#radialGradient3010);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient3012);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3008" + sodipodi:cx="264.65997" + sodipodi:cy="564.4585" + sodipodi:rx="24.243662" + sodipodi:ry="100.0051" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" /> + </g> + <g + transform="matrix(0.8044485,0,0,1,31.514287,4.2857143)" + id="g3188"> + <path + transform="matrix(0.4234159,-0.07808524,0.206548,1.1200026,-69.993098,-86.387186)" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + sodipodi:ry="100.0051" + sodipodi:rx="24.243662" + sodipodi:cy="564.4585" + sodipodi:cx="264.65997" + id="path3056" + style="fill:url(#radialGradient3196);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient3198);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3058" + sodipodi:cx="264.65997" + sodipodi:cy="564.4585" + sodipodi:rx="24.243662" + sodipodi:ry="100.0051" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + transform="matrix(0.4234159,-0.07808524,0.206548,1.1200026,-64.993098,-82.101472)" /> + </g> + <g + id="g3066" + transform="matrix(0.5950001,-0.05526423,0.092483,0.9957144,6.7072288,8.0794777)" + style="opacity:0.80540544"> + <path + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + sodipodi:ry="100.0051" + sodipodi:rx="24.243662" + sodipodi:cy="564.4585" + sodipodi:cx="264.65997" + id="path3068" + style="fill:url(#radialGradient3086);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient3088);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3070" + sodipodi:cx="264.65997" + sodipodi:cy="564.4585" + sodipodi:rx="24.243662" + sodipodi:ry="100.0051" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" /> + </g> + <g + transform="matrix(0.4466271,-0.06421316,0.1423102,0.9898221,-15.116484,2.3949092)" + id="g3072" + style="opacity:0.43243247"> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient3090);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3074" + sodipodi:cx="264.65997" + sodipodi:cy="564.4585" + sodipodi:rx="24.243662" + sodipodi:ry="100.0051" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" /> + <path + transform="matrix(1.1388889,0,0,1.1388889,-31.370853,-78.144481)" + d="m 288.90364,564.4585 c 0,55.23129 -10.85426,100.00509 -24.24367,100.00509 -13.3894,0 -24.24366,-44.7738 -24.24366,-100.00509 0,-55.23129 10.85426,-100.0051 24.24366,-100.0051 13.38941,0 24.24367,44.77381 24.24367,100.0051 z" + sodipodi:ry="100.0051" + sodipodi:rx="24.243662" + sodipodi:cy="564.4585" + sodipodi:cx="264.65997" + id="path3076" + style="fill:url(#radialGradient3092);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + </g> + </g> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient3234);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3226" + sodipodi:cx="285.71429" + sodipodi:cy="360.93362" + sodipodi:rx="171.42857" + sodipodi:ry="85.714287" + d="m 457.14287,360.93362 c 0,47.3387 -76.75119,85.71429 -171.42858,85.71429 -94.67738,0 -171.42857,-38.37559 -171.42857,-85.71429 0,-47.33869 76.75119,-85.71428 171.42857,-85.71428 94.67739,0 171.42858,38.37559 171.42858,85.71428 z" + transform="matrix(0.9572542,0,0,0.7535704,142.83967,101.0245)" /> + <path + style="fill:#ffffff;fill-rule:evenodd;stroke:none" + d="m 473.48371,433.25849 17.14286,22.85714 31.42857,-2.85714 -14.28571,-25.71428 -34.28572,5.71428 z" + id="path3236" /> + <path + sodipodi:type="arc" + style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3260" + sodipodi:cx="400.02042" + sodipodi:cy="635.16919" + sodipodi:rx="107.07617" + sodipodi:ry="124.24876" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + transform="matrix(0.8461547,0.1741128,-0.2230954,1.1776509,66.856969,-211.22664)" /> + <path + transform="matrix(0.8461547,0.1741128,-0.2230954,1.1776509,66.856969,-211.22664)" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + sodipodi:ry="124.24876" + sodipodi:rx="107.07617" + sodipodi:cy="635.16919" + sodipodi:cx="400.02042" + id="path3264" + style="fill:url(#linearGradient3272);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + sodipodi:ry="124.24876" + sodipodi:rx="107.07617" + sodipodi:cy="635.16919" + sodipodi:cx="400.02042" + id="path3262" + style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient3286);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3282" + sodipodi:cx="400.02042" + sodipodi:cy="635.16919" + sodipodi:rx="107.07617" + sodipodi:ry="124.24876" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + transform="matrix(0.8461547,0.1741128,-0.2230954,1.1776509,66.856969,-211.22664)" /> + <path + sodipodi:type="arc" + style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3280" + sodipodi:cx="400.02042" + sodipodi:cy="635.16919" + sodipodi:rx="107.07617" + sodipodi:ry="124.24876" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" /> + <path + transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + sodipodi:ry="124.24876" + sodipodi:rx="107.07617" + sodipodi:cy="635.16919" + sodipodi:cx="400.02042" + id="path3288" + style="fill:url(#linearGradient3296);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:url(#linearGradient3300);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3298" + sodipodi:cx="400.02042" + sodipodi:cy="635.16919" + sodipodi:rx="107.07617" + sodipodi:ry="124.24876" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" /> + <path + transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + sodipodi:ry="124.24876" + sodipodi:rx="107.07617" + sodipodi:cy="635.16919" + sodipodi:cx="400.02042" + id="path3302" + style="fill:url(#radialGradient3304);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + sodipodi:type="arc" + style="fill:none;stroke:url(#linearGradient3322);stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3314" + sodipodi:cx="400.02042" + sodipodi:cy="635.16919" + sodipodi:rx="107.07617" + sodipodi:ry="124.24876" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + transform="matrix(0.8095822,0.1665873,-0.2134527,1.1267505,53.180089,-181.28297)" /> + <path + sodipodi:type="arc" + style="fill:url(#linearGradient3404);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3396);stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3386" + sodipodi:cx="400.02042" + sodipodi:cy="635.16919" + sodipodi:rx="107.07617" + sodipodi:ry="124.24876" + d="m 507.09659,635.16919 c 0,68.62069 -47.93964,124.24876 -107.07617,124.24876 -59.13654,0 -107.07618,-55.62807 -107.07618,-124.24876 0,-68.62069 47.93964,-124.24876 107.07618,-124.24876 59.13653,0 107.07617,55.62807 107.07617,124.24876 z" + transform="matrix(0.6935881,0.1427193,-0.1828699,0.9653135,72.073668,-71.215779)" /> + <path + style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3534)" + d="m 167,627.93361 11.42857,-0.71428 5,-15 c 0,0 -2.14286,2.14285 0,-6.42858 2.14286,-8.57143 5.71429,-7.85714 6.42857,-13.57143 0.71429,-5.71428 -1.42857,-5.71428 0.71429,-10 2.14286,-4.28571 3.57143,-7.85714 3.57143,-17.14285 0,-9.28572 5.71428,-15.71429 5.71428,-15.71429 L 202,540.79075 208.42857,527.93361 195.57143,526.50504 192,542.21932 l 0,10.71429 c 0,0 -0.71429,10 -2.85714,15 -2.14286,5 -6.42857,15 -6.42857,18.57143 0,3.57143 2.14285,7.14286 -0.71429,11.42857 -2.85714,4.28571 -6.42857,13.57143 -6.42857,13.57143 l -5,7.14286 L 167,627.93361 z" + id="path3492" + transform="matrix(1.1182618,0,0,1.1182618,24.14155,-48.055699)" /> + <path + style="fill:url(#linearGradient3416);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 171.72593,706.89001 0,-18.18274 c 0,0 107.07617,-149.50258 111.11678,-181.82746 4.04061,-32.32488 4.04061,-34.34519 4.04061,-34.34519 l 6.06092,-2.0203 -16.16244,-2.02031 c 0,0 -16.16244,-14.14214 -32.32488,-6.06091 -16.16245,8.08122 -52.52794,26.26396 -60.60916,54.54823 -8.08122,28.28427 -16.16244,70.71068 -16.16244,90.91373 0,20.20305 -8.08122,40.4061 -8.08122,40.4061 0,0 2.02031,56.56855 12.12183,58.58885 z" + id="path3408" /> + <path + sodipodi:type="arc" + style="fill:url(#radialGradient3444);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + id="path3436" + sodipodi:cx="210.11172" + sodipodi:cy="721.03217" + sodipodi:rx="54.548237" + sodipodi:ry="14.142136" + d="m 264.65996,721.03217 c 0,7.81048 -24.42208,14.14213 -54.54824,14.14213 -30.12615,0 -54.54823,-6.33165 -54.54823,-14.14213 0,-7.81049 24.42208,-14.14214 54.54823,-14.14214 30.12616,0 54.54824,6.33165 54.54824,14.14214 z" + transform="matrix(1.4285714,0,0,1.4285714,-57.723001,-280.72952)" /> + <path + style="fill:#b3b3b3;fill-rule:evenodd;stroke:none" + d="m 246.99514,555.25215 7.18884,-15.17641 -13.5789,0 -3.99379,16.77393 10.38385,-1.59752 z" + id="path3490" /> + <path + style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.11826181px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 235.81252,548.06332 9.58511,6.39007 -9.58511,2.39628 -11.98138,-9.58511 11.98138,0.79876 z" + id="path3488" /> + <path + style="fill:#434343;fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z" + id="path3446" /> + <path + id="path3448" + d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z" + style="fill:url(#radialGradient3456);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="fill:url(#radialGradient3466);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z" + id="path3464" /> + <path + id="path3468" + d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z" + style="opacity:0.7845304;fill:url(#linearGradient3476);fill-opacity:1;fill-rule:evenodd;stroke:none" /> + <path + style="opacity:0.7845304;fill:url(#linearGradient3480);fill-opacity:1;fill-rule:evenodd;stroke:none" + d="m 223.83116,547.26456 c 0,0 -5.59131,0.79877 -8.78634,10.38387 -3.19505,9.58509 -1.59753,30.35281 -6.39008,37.54163 -4.79254,7.18884 -5.5913,6.39008 -7.98758,15.97518 -2.39627,9.5851 -7.18883,11.98137 0.79876,16.77393 7.98759,4.79254 7.98759,7.98758 7.98759,7.98758 l 0,13.57889 11.98137,1.59752 3.99379,-15.17641 c 0,0 -3.99379,-6.39007 -8.78634,-11.18261 -4.79256,-4.79256 -4.79256,-7.18884 -3.19504,-10.38387 1.59753,-3.19503 6.39007,-14.37765 10.38387,-22.36524 3.99379,-7.98758 3.99379,-11.18261 3.99379,-19.1702 0,-7.98758 0.79875,-15.1764 4.79254,-17.57268 3.9938,-2.39628 5.59131,-7.98759 5.59131,-7.98759 l -14.37764,0 z" + id="path3478" /> + </g> +</svg> @@ -15,6 +15,7 @@ <file alias="reset">icons/keyboard_key.svg</file> <file alias="student2tutorextension">icons/student2tutor_extension.svg</file> <file alias="helpme">icons/help.svg</file> + <file alias="trash">icons/trash.svg</file> <file alias="AUTHORS">AUTHORS</file> <file alias="TRANSLATION">TRANSLATION</file> <file alias="pvsmgr.qm">build/pvsmgr_de_DE.qm</file> diff --git a/src/server/connectionframe/connectionframe.cpp b/src/server/connectionframe/connectionframe.cpp index b09139c..dbe408c 100644 --- a/src/server/connectionframe/connectionframe.cpp +++ b/src/server/connectionframe/connectionframe.cpp @@ -50,7 +50,7 @@ static QIcon *term = NULL, *cam = NULL, *eye = NULL, *lock = NULL; * @param height */ ConnectionFrame::ConnectionFrame(QWidget *parent, int width, int height) : - QGroupBox(parent), _client(NULL), _timerId(0), _timerCounter(0), _selected(false), _isTutor(false) + QGroupBox(parent), _client(NULL), _timerId(0), _timerCounter(0), _isSelected(false), _isTutor(false) { //defines the ui-stuff @@ -101,7 +101,11 @@ ConnectionFrame::ConnectionFrame(QWidget *parent, int width, int height) : ConnectionFrame::~ConnectionFrame() { - // + if (_client != NULL) + { + _client->deleteLater(); + } + _iconLayout->deleteLater(); } /** @@ -295,9 +299,9 @@ void ConnectionFrame::timerEvent(QTimerEvent* event) */ void ConnectionFrame::setSelection(bool selected) { - if (_selected == selected) + if (_isSelected == selected) return; - _selected = selected; + _isSelected = selected; this->updateAppearance(); } @@ -322,7 +326,7 @@ void ConnectionFrame::updateAppearance() if (_client == NULL) { // Unconnected Frame - if (_selected) + if (_isSelected) this->setStyleSheet(style_selectedStudent); else this->setStyleSheet(style_disconnected); @@ -336,13 +340,13 @@ void ConnectionFrame::updateAppearance() // Normal client, no special stuff active - if (_selected && _isTutor){ + if (_isSelected && _isTutor){ this->setStyleSheet(style_selectedTutor); } else if (_isTutor){ this->setStyleSheet(style_tutor); } - else if (_selected){ + else if (_isSelected){ this->setStyleSheet(style_selectedStudent); } diff --git a/src/server/connectionframe/connectionframe.h b/src/server/connectionframe/connectionframe.h index 72f641d..5a4e1df 100644 --- a/src/server/connectionframe/connectionframe.h +++ b/src/server/connectionframe/connectionframe.h @@ -32,7 +32,7 @@ private: Client *_client; int _timerId, _timerCounter; - bool _selected; + bool _isSelected; bool _isTutor; static const int _startDragDistance = 40; @@ -51,9 +51,10 @@ public: const QPixmap& getFramePixmap() const { return _remoteScreen; } void setSize(int width, int height); + const inline QPoint& getPreviousPosition() const { return _previousPosition; } void assignClient(Client *client); void setSelection(bool selected); - const inline bool selected() const { return _selected; } + const inline bool isSelected() const { return _isSelected; } const QString& computerId() const { return _computerId; } Client* client() const { return _client; } diff --git a/src/server/mainwindow/mainwindow.cpp b/src/server/mainwindow/mainwindow.cpp index a6c90c0..a52690f 100644 --- a/src/server/mainwindow/mainwindow.cpp +++ b/src/server/mainwindow/mainwindow.cpp @@ -44,6 +44,8 @@ const QString MainWindow::sStrSourceOffline = tr("The projection source is offli const QString MainWindow::sStrDestNdef = tr("Please select a projection destination."); const QString MainWindow::sStrDestOffline = tr("The projection destination is offline."); const QString MainWindow::sStrSourceDestSame = tr("Selected projection target is tutor."); +const QString MainWindow::sStrClientOnline = tr("Selected client is currently online."); +const QString MainWindow::sStrNoDestAv = tr("No projection destination available."); /***************************************************************************//** * Initialize MainWindow and ListenServer. @@ -53,11 +55,8 @@ const QString MainWindow::sStrSourceDestSame = tr("Selected projection target is MainWindow::MainWindow(QString ipListUrl, QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow), _tbIconSize(24), _tbArea(Qt::LeftToolBarArea) { - - _tutorFrame = NULL; - _selectedFrame = NULL; _mode = Mode::Multicast; - _streamingSource = NULL; + _streamingSource = 0; _sessionNameWindow = new SessionNameWindow(this); _helpWindow = new HelpWindow(this); @@ -81,6 +80,9 @@ MainWindow::MainWindow(QString ipListUrl, QWidget* parent) : ui->action_Exit->setStatusTip(tr("Exit")); ui->action_Lock->setStatusTip(tr("Lock or Unlock all Clients")); + _tileWidth = 10; + _tileHeight = 10; + // Initialize FileDownloader. if (!ipListUrl.isEmpty()) { @@ -128,9 +130,6 @@ MainWindow::MainWindow(QString ipListUrl, QWidget* parent) : setUnifiedTitleAndToolBarOnMac(true); this->showMaximized(); // show the Mainwindow maximized - _tileWidth = 10; - _tileHeight = 10; - _listenServer = new ListenServer(CLIENT_PORT); connect(_listenServer, SIGNAL(newClient(Client*)), this, SLOT(onClientConnected(Client*))); _discoveryListener = new DiscoveryListener(); @@ -266,27 +265,22 @@ void MainWindow::tellClientCurrentSituation(Client* client) if (_mode == Mode::Broadcast){ // _watchers.insert(client->id(), client); client->setWatcher(true); - client->startVncClient(_streamingSource); + Client* c = getClientFromId(_streamingSource); + if (c != NULL) { + client->startVncClient(c); + } } else if (_mode == Mode::LockedMulticast) client->lockScreen(true); + } /***************************************************************************//** - * Checks if client and manager runs on same machine. - * @param client - * @return Return true, if pvsmanager is running on client. + * Returns connected client which belongs to given id. + * Iterating over ConnectionFrames and comparing id to given id. + * @param id + * @return Client with given id, if not NULL. */ -bool MainWindow::isManagerMachine(Client* client) -{ - foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) - if (address != QHostAddress(QHostAddress::LocalHost) - && client != NULL - && client->ip() == address.toString()) - return true; - return false; -} - Client* MainWindow::getClientFromId(int id) { for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it) @@ -300,6 +294,38 @@ Client* MainWindow::getClientFromId(int id) return NULL; } +/***************************************************************************//** + * Return the Frame, which is currently beeing Tutor. + * Iterating over all ConnectionFrames, and looking for flag _isTutor. + * @return Frame with flag _isTutor = true, + * else NULL if no Tutor is available. + */ +ConnectionFrame* MainWindow::getTutorFrame() +{ + for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it) + { + if (((*it) != NULL) && ((*it)->isTutor())) + return (*it); + } + return NULL; +} + +/***************************************************************************//** + * Return the Frame, which is currently selected by user. + * Iterating over all ConnectionFrame and looking for flag _isSelected. + * @return Frame with flag _isSelected = true, + * else NULL if no frame is selected. + */ +ConnectionFrame* MainWindow::getSelectedFrame() +{ + for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it) + { + if (((*it) != NULL) && ((*it)->isSelected())) + return (*it); + } + return NULL; +} + /* * Overridden methods */ @@ -345,6 +371,14 @@ void MainWindow::resizeEvent(QResizeEvent* e) (*it)->move((oldpos.x() / _tileWidth) * nw, (oldpos.y() / _tileHeight) * nh); (*it)->setSize(nw, nh); } + + // Resize trash and set position. + const int width = ui->frmRoom->geometry().width() - (nw + 1); + const int height = ui->frmRoom->geometry().height() - (nh + 1); + ui->trash->move(width, height); + ui->trash->resize(nw, nh); + // qDebug() << "Trash pos: " << ui->trash->pos(); + _tileWidth = nw; _tileHeight = nh; } @@ -366,9 +400,9 @@ void MainWindow::mouseReleaseEvent(QMouseEvent* e) const QSize frame(ui->frmRoom->size()); if (frame.width() > pos.x() && frame.height() > pos.y()) { - if (_selectedFrame != NULL) { - _selectedFrame->setSelection(false); - _selectedFrame = NULL; + if (getSelectedFrame() != NULL) + { + getSelectedFrame()->setSelection(false); } } } @@ -384,8 +418,8 @@ void MainWindow::reset() (*it)->client()->lockScreen(false); // Stop server (Clients get stopped on ACK) - if (_streamingSource != NULL) - _streamingSource->stopVncServer(); + if (getClientFromId(_streamingSource) != NULL) + getClientFromId(_streamingSource)->stopVncServer(); } /* @@ -425,6 +459,35 @@ void MainWindow::onPlaceFrame(ConnectionFrame* frame) y = 0; else if (y > s.height() - _tileHeight) y = (_tilesY - 1) * _tileHeight; + + const QRect &trashCenter = ui->trash->geometry(); + // Check if x coordinate is in trash position. + if (trashCenter.contains(p)) + { + // Do not offer deleting online client. + if (frame->client() != NULL) + { + QMessageBox::critical(this, tr("Selection"), sStrClientOnline); + frame->move(frame->getPreviousPosition()); + return; + } + else + { + int ret = QMessageBox::question(this, "Warning", "Sure, You want to delete selected client?", 0, 1, 2); + if (ret == 1) + { + frame->hide(); + frame->deleteLater(); + _clientFrames.removeOne(frame); + return; + } + else + { + frame->move(frame->getPreviousPosition()); + return; + } + } + } qDebug("Move D"); frame->move(x, y); savePosition(frame); @@ -447,15 +510,18 @@ void MainWindow::onPlaceFrame(ConnectionFrame* frame) void MainWindow::onFrameClicked(ConnectionFrame* frame) { // If same frame is clicked again,, do nothing - if (_selectedFrame == frame) + if (getSelectedFrame() == frame) return; // If another frame has been selected, unselect it // Set the ui selected and set a new reference - if (_selectedFrame != NULL) - _selectedFrame->setSelection(false); - _selectedFrame = frame; - _selectedFrame->setSelection(true); + if (getSelectedFrame() != NULL) + { + getSelectedFrame()->setSelection(false); + } + frame->setSelection(true); + qDebug() << "ID of frame: " << frame->computerId(); + qDebug() << "ID of selectedFrame: " << getSelectedFrame()->computerId(); } /***************************************************************************//** @@ -471,6 +537,14 @@ void MainWindow::onSessionNameClick() */ void MainWindow::onSessionNameUpdate() { + // Stop all projections and clear all clients, which where connected to old sessionName. + reset(); + for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it) + { + (*it)->hide(); + (*it)->deleteLater(); + } + _clientFrames.clear(); _sessionNameLabel->setText(tr("Session Name: %1 [click to edit]").arg(Global::sessionName())); } @@ -489,7 +563,7 @@ void MainWindow::changeProjection(Client *from, Mode mode, Client *to) // Set all clients as watchers for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it) { - if ((*it)->client() != NULL && (*it)->client() != _streamingSource) + if ((*it)->client() != NULL && (*it)->client() != getClientFromId(_streamingSource)) { // _watchers.insert((*it)->client()->id(), (*it)->client()); (*it)->client()->setWatcher(true); @@ -528,17 +602,20 @@ void MainWindow::changeProjection(Client *from, Mode mode, Client *to) _mode = mode; // if there is a server running which is not "from" stop it. - if (_streamingSource != NULL && _streamingSource != from) - _streamingSource->stopVncServer(); + if (getClientFromId(_streamingSource) != NULL && getClientFromId(_streamingSource) != from) + getClientFromId(_streamingSource)->stopVncServer(); // Set new streaming source - _streamingSource = from; + _streamingSource = from->id(); // If streaming source is already active avoid a restart - if (_streamingSource->isActiveVncServer()) - this->onVncServerStateChange(_streamingSource); - else // Could not take shortcut, (re)start VNC server on source - _streamingSource->startVncServer(); + Client* c = getClientFromId(_streamingSource); + if (c != NULL) { + if (c->isActiveVncServer()) + this->onVncServerStateChange(c); + else // Could not take shortcut, (re)start VNC server on source + c->startVncServer(); + } } /***************************************************************************//** @@ -558,12 +635,14 @@ void MainWindow::onButtonTutorToAll() { ui->action_Lock->setChecked(false); - if (_tutorFrame == NULL) + if (getTutorFrame() == NULL) QMessageBox::critical(this, tr("Projection"), sStrTutorNdef); - else if (_tutorFrame->client() == NULL) + else if (getTutorFrame()->client() == NULL) QMessageBox::critical(this, tr("Projection"), sStrTutorOffline); + else if (_clientFrames.size() == 1) + QMessageBox::critical(this, tr("Projection"), sStrNoDestAv); else - changeProjection(_tutorFrame->client(), Mode::Broadcast); + changeProjection(getTutorFrame()->client(), Mode::Broadcast); } /***************************************************************************//** @@ -575,12 +654,12 @@ void MainWindow::onButtonStudentToAll() { ui->action_Lock->setChecked(false); - if (_selectedFrame == NULL) + if (getSelectedFrame() == NULL) QMessageBox::critical(this, tr("Projection"), sStrSourceNdef); - if (_selectedFrame->client() == NULL) + if (getSelectedFrame()->client() == NULL) QMessageBox::critical(this, tr("Projection"), sStrSourceOffline); else - changeProjection(_selectedFrame->client(), Mode::Broadcast); + changeProjection(getSelectedFrame()->client(), Mode::Broadcast); } /***************************************************************************//** @@ -591,18 +670,18 @@ void MainWindow::onButtonTutorToStudent() { ui->action_Lock->setChecked(false); - if (_selectedFrame == NULL) + if (getSelectedFrame() == NULL) QMessageBox::critical(this, tr("Projection"), sStrDestNdef); - else if (_tutorFrame == NULL) + else if (getTutorFrame() == NULL) QMessageBox::critical(this, tr("Projection"), sStrTutorNdef); - else if (_selectedFrame == _tutorFrame) + else if (getSelectedFrame() == getTutorFrame()) QMessageBox::critical(this, tr("Projection"), sStrSourceDestSame); - else if (_selectedFrame->client() == NULL) + else if (getSelectedFrame()->client() == NULL) QMessageBox::critical(this, tr("Projection"), sStrDestOffline); - else if (_tutorFrame->client() == NULL) + else if (getTutorFrame()->client() == NULL) QMessageBox::critical(this, tr("Projection"), sStrTutorOffline); else - changeProjection(_tutorFrame->client(), Mode::Multicast, _selectedFrame->client()); + changeProjection(getTutorFrame()->client(), Mode::Multicast, getSelectedFrame()->client()); } /***************************************************************************//** @@ -613,18 +692,18 @@ void MainWindow::onButtonStudentToTutor() { ui->action_Lock->setChecked(false); - if (_selectedFrame == NULL) + if (getSelectedFrame() == NULL) QMessageBox::critical(this, tr("Projection"), sStrSourceNdef); - else if (_tutorFrame == NULL) + else if (getTutorFrame() == NULL) QMessageBox::critical(this, tr("Projection"), sStrTutorNdef); - else if (_tutorFrame == _selectedFrame) + else if (getTutorFrame() == getSelectedFrame()) QMessageBox::critical(this, tr("Projection"), sStrSourceDestSame); - else if (_selectedFrame->client() == NULL) + else if (getSelectedFrame()->client() == NULL) QMessageBox::critical(this, tr("Projection"), sStrSourceOffline); - else if (_tutorFrame->client() == NULL) + else if (getTutorFrame()->client() == NULL) QMessageBox::critical(this, tr("Projection"), sStrTutorOffline); else - changeProjection(_selectedFrame->client(), Mode::Multicast, _tutorFrame->client()); + changeProjection(getSelectedFrame()->client(), Mode::Multicast, getTutorFrame()->client()); } @@ -635,18 +714,18 @@ void MainWindow::onButtonStudentToTutorExclusive() { ui->action_Lock->setChecked(false); - if (_selectedFrame == NULL) + if (getSelectedFrame() == NULL) QMessageBox::critical(this, tr("Projection"), sStrSourceNdef); - else if (_tutorFrame == NULL) + else if (getTutorFrame() == NULL) QMessageBox::critical(this, tr("Projection"), sStrTutorNdef); - else if (_tutorFrame == _selectedFrame) + else if (getTutorFrame() == getSelectedFrame()) QMessageBox::critical(this, tr("Projection"), sStrSourceDestSame); - else if (_selectedFrame->client() == NULL) + else if (getSelectedFrame()->client() == NULL) QMessageBox::critical(this, tr("Projection"), sStrSourceOffline); - else if (_tutorFrame->client() == NULL) + else if (getTutorFrame()->client() == NULL) QMessageBox::critical(this, tr("Projection"), sStrTutorOffline); else - changeProjection(_selectedFrame->client(), Mode::LockedMulticast, _tutorFrame->client()); + changeProjection(getSelectedFrame()->client(), Mode::LockedMulticast, getTutorFrame()->client()); } @@ -674,9 +753,7 @@ void MainWindow::onButtonLock(bool checked) for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it) { - // Check if client is Tutor or the manager is also running on this machine. - bool isManager = isManagerMachine((*it)->client()); - if ((*it)->client() == NULL || isManager) + if ((*it)->client() == NULL) continue; (*it)->client()->lockScreen(checked); } @@ -699,30 +776,33 @@ void MainWindow::onButtonSetAsTutor() ui->action_Lock->setChecked(false); // If no frame is selected, warning. - if (_selectedFrame == NULL) + if (getSelectedFrame() == NULL) { QMessageBox::critical(this, tr("Selection"), tr("No client is selected.")); return; } // If frame of inactive client has been selected unselect it - if (_selectedFrame->client() == NULL) + if (getSelectedFrame()->client() == NULL) { QMessageBox::critical(this, tr("Selection"), tr("The selected client is not connected.")); return; } else // If selected client is locked, first unlock - _selectedFrame->client()->lockScreen(false); + { + getSelectedFrame()->client()->lockScreen(false); + } // If same frame is already tutor, do nothing - if (_selectedFrame == _tutorFrame) + if (getSelectedFrame() == getTutorFrame()) return; // Else unset the old and set the new tutor - if (_tutorFrame != NULL) - _tutorFrame->setTutor(false); - _tutorFrame = _selectedFrame; - _tutorFrame->setTutor(true); + if (getTutorFrame() != NULL) + { + getTutorFrame()->setTutor(false); + } + getSelectedFrame()->setTutor(true); } /***************************************************************************//** @@ -882,7 +962,7 @@ void MainWindow::onClientAuthenticated(Client* client) */ void MainWindow::onVncServerStateChange(Client* client) { - if (client == _streamingSource) + if (client == getClientFromId(_streamingSource)) EnableButtons(); if (client->isActiveVncServer()) @@ -910,7 +990,7 @@ void MainWindow::onVncServerStateChange(Client* client) if ( (*it)->client() != NULL) { // if (_watchers.contains((*it)->client()->id())) - if (getClientFromId((*it)->client()->id())->isWatcher()) + if ((*it)->client()->isWatcher()) { // Unlock destination and connect VNCclient (*it)->client()->lockScreen(false); @@ -924,8 +1004,7 @@ void MainWindow::onVncServerStateChange(Client* client) else { // Lock others and stop their clients - bool isManager = isManagerMachine((*it)->client()); - (*it)->client()->lockScreen(_mode == Mode::LockedMulticast && isManager != true); + (*it)->client()->lockScreen(_mode == Mode::LockedMulticast); (*it)->client()->stopVncClient(); } } @@ -957,25 +1036,33 @@ void MainWindow::onVncServerStateChange(Client* client) */ void MainWindow::onVncClientStateChange(Client* client) { - // VNC Client stopped -> remove from watchers - if (!client->isActiveVncClient()){ - // _watchers.remove(client->id()); - getClientFromId(client->id())->setWatcher(false); - - // If noboody is watching the multicast stop VNC server - // if (_watchers.isEmpty() && _mode != Mode::Broadcast) - // _streamingSource->stopVncServer(); - bool noWatchers = true; - for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it) - { - if ((*it)->client() != NULL) + if (client != NULL) + { + // VNC Client stopped -> remove from watchers + if (!client->isActiveVncClient()){ + // _watchers.remove(client->id()); + if (getClientFromId(client->id()) != NULL) + getClientFromId(client->id())->setWatcher(false); + + // If noboody is watching the multicast stop VNC server + // if (_watchers.isEmpty() && _mode != Mode::Broadcast) + // _streamingSource->stopVncServer(); + bool noWatchers = true; + for (QList<ConnectionFrame*>::iterator it(_clientFrames.begin()); it != _clientFrames.end(); ++it) { - if ((*it)->client()->isWatcher()) - noWatchers = false; + if ((*it)->client() != NULL) + { + if ((*it)->client()->isWatcher()) + noWatchers = false; + } + } + if (noWatchers && _mode != Mode::Broadcast) + { + Client* c = getClientFromId(_streamingSource); + if (c != NULL) + c->stopVncServer(); } } - if (noWatchers && _mode != Mode::Broadcast) - _streamingSource->stopVncServer(); } } diff --git a/src/server/mainwindow/mainwindow.h b/src/server/mainwindow/mainwindow.h index fffa49a..524a0b1 100644 --- a/src/server/mainwindow/mainwindow.h +++ b/src/server/mainwindow/mainwindow.h @@ -39,7 +39,6 @@ private: int _tbIconSize; Qt::ToolBarArea _tbArea; int _tileWidth, _tileHeight; - ConnectionFrame *_tutorFrame, *_selectedFrame; static const int _tilesX = 9; static const int _tilesY = 7; @@ -54,7 +53,7 @@ private: Multicast, LockedMulticast } _mode; - Client * _streamingSource; + int _streamingSource; QMap<int, Client*> _watchers; QList<ConnectionFrame*> _clientFrames; @@ -70,6 +69,8 @@ private: static const QString sStrDestNdef; static const QString sStrDestOffline; static const QString sStrSourceDestSame; + static const QString sStrClientOnline; + static const QString sStrNoDestAv; void placeFrameInFreeSlot(ConnectionFrame* frame); ConnectionFrame* createFrame(); @@ -77,7 +78,6 @@ private: void savePosition(ConnectionFrame *cf); void changeProjection(Client *from, Mode mode = Mode::Broadcast, Client *to = NULL); void tellClientCurrentSituation(Client* client); - bool isManagerMachine(Client* client); void reset(); void closeEvent(QCloseEvent *e); @@ -86,6 +86,8 @@ private: void mouseReleaseEvent(QMouseEvent* e); Client* getClientFromId(int id); + ConnectionFrame* getTutorFrame(); + ConnectionFrame* getSelectedFrame(); protected slots: void onTutorListDownloaded(QByteArray& tutorList); diff --git a/src/server/net/client.cpp b/src/server/net/client.cpp index 135157c..584b254 100644 --- a/src/server/net/client.cpp +++ b/src/server/net/client.cpp @@ -11,6 +11,7 @@ #include "../../shared/util.h" #include <QPixmap> #include <cassert> +#include <QNetworkInterface> #define CHALLENGE_LEN 20 @@ -310,10 +311,24 @@ void Client::stopVncClient() } } +/***************************************************************************//** + * Checks if client and manager runs on same machine. + * @return Return true, if pvsmanager is running on client. + */ +bool Client::isManagerMachine() +{ + foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) + if (address != QHostAddress(QHostAddress::LocalHost) + && this != NULL + && this->ip() == address.toString()) + return true; + return false; +} + /******************************************************************************/ void Client::lockScreen(bool lock) { - if (!_isTutor && _locked != lock){ + if (!_isTutor && _locked != lock && !isManagerMachine()){ _locked = lock; NetworkMessage msg; msg.setField(_ID, _LOCK); diff --git a/src/server/net/client.h b/src/server/net/client.h index 1031838..6872959 100644 --- a/src/server/net/client.h +++ b/src/server/net/client.h @@ -71,6 +71,8 @@ private: static int _clientIdCounter; + bool isManagerMachine(); + void handleMsg(); void sendMessage(NetworkMessage& message); |