All packet buffers are now uint8_t instead of char. Few memory leaks and NULL issues fixed.
This commit is contained in:
parent
7149a0d33c
commit
1427b28d00
57 changed files with 1506 additions and 325 deletions
358
client/assets/chat.svg
Normal file
358
client/assets/chat.svg
Normal file
|
@ -0,0 +1,358 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:ns1="http://sozi.baierouge.fr"
|
||||||
|
id="svg5816"
|
||||||
|
sodipodi:docname="internet-group-chat.svg"
|
||||||
|
viewBox="0 0 48 48"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||||
|
inkscape:version="0.46"
|
||||||
|
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
|
||||||
|
>
|
||||||
|
<defs
|
||||||
|
id="defs3"
|
||||||
|
>
|
||||||
|
<radialGradient
|
||||||
|
id="radialGradient6719"
|
||||||
|
xlink:href="#linearGradient5060"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cy="486.65"
|
||||||
|
cx="605.71"
|
||||||
|
gradientTransform="matrix(-2.7744 0 0 1.9697 112.76 -872.89)"
|
||||||
|
r="117.14"
|
||||||
|
inkscape:collect="always"
|
||||||
|
/>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient5060"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop5062"
|
||||||
|
style="stop-color:black"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop5064"
|
||||||
|
style="stop-color:black;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
<radialGradient
|
||||||
|
id="radialGradient6717"
|
||||||
|
xlink:href="#linearGradient5060"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cy="486.65"
|
||||||
|
cx="605.71"
|
||||||
|
gradientTransform="matrix(2.7744 0 0 1.9697 -1891.6 -872.89)"
|
||||||
|
r="117.14"
|
||||||
|
inkscape:collect="always"
|
||||||
|
/>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient5048"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop5050"
|
||||||
|
style="stop-color:black;stop-opacity:0"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop5056"
|
||||||
|
style="stop-color:black"
|
||||||
|
offset=".5"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop5052"
|
||||||
|
style="stop-color:black;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6715"
|
||||||
|
y2="609.51"
|
||||||
|
xlink:href="#linearGradient5048"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x2="302.86"
|
||||||
|
gradientTransform="matrix(2.7744 0 0 1.9697 -1892.2 -872.89)"
|
||||||
|
y1="366.65"
|
||||||
|
x1="302.86"
|
||||||
|
inkscape:collect="always"
|
||||||
|
/>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient29418"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop29420"
|
||||||
|
style="stop-color:#f5f5f5"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop29422"
|
||||||
|
style="stop-color:#e9e9e9"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient29429"
|
||||||
|
y2="26.258"
|
||||||
|
xlink:href="#linearGradient29418"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x2="39.037"
|
||||||
|
gradientTransform="matrix(1.0076 0 0 .98765 -3.0719 .27461)"
|
||||||
|
y1="10.916"
|
||||||
|
x1="26.012"
|
||||||
|
inkscape:collect="always"
|
||||||
|
/>
|
||||||
|
<radialGradient
|
||||||
|
id="radialGradient29439"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cy="27.645"
|
||||||
|
cx="29.496"
|
||||||
|
gradientTransform="matrix(1 0 0 .34649 -5.1771e-17 18.067)"
|
||||||
|
r="11.516"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop29435"
|
||||||
|
style="stop-color:#000000"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop29437"
|
||||||
|
style="stop-color:#000000;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</radialGradient
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient29443"
|
||||||
|
y2="24.144"
|
||||||
|
xlink:href="#linearGradient29418"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x2="27.273"
|
||||||
|
gradientTransform="matrix(-.97723 0 0 .99588 50.603 9.1156)"
|
||||||
|
y1="10.957"
|
||||||
|
x1="35.004"
|
||||||
|
inkscape:collect="always"
|
||||||
|
/>
|
||||||
|
</defs
|
||||||
|
>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
bordercolor="#666666"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-y="105"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
inkscape:window-height="743"
|
||||||
|
inkscape:grid-bbox="true"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:window-x="214"
|
||||||
|
showgrid="false"
|
||||||
|
borderopacity="0.13333333"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
inkscape:cx="-127.22708"
|
||||||
|
inkscape:cy="-13.353097"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-width="872"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
/>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
>
|
||||||
|
<g
|
||||||
|
id="g6707"
|
||||||
|
style="opacity:.62887"
|
||||||
|
transform="matrix(.015187 0 0 .020868 32.508 31.904)"
|
||||||
|
>
|
||||||
|
<rect
|
||||||
|
id="rect6709"
|
||||||
|
style="opacity:.40206;color:black;fill:url(#linearGradient6715)"
|
||||||
|
height="478.36"
|
||||||
|
width="1339.6"
|
||||||
|
y="-150.7"
|
||||||
|
x="-1559.3"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path6711"
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
style="opacity:.40206;color:black;fill:url(#radialGradient6717)"
|
||||||
|
d="m-219.62-150.68v478.33c142.88 0.9 345.4-107.17 345.4-239.2 0-132.02-159.44-239.13-345.4-239.13z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path6713"
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
style="opacity:.40206;color:black;fill:url(#radialGradient6719)"
|
||||||
|
d="m-1559.3-150.68v478.33c-142.8 0.9-345.4-107.17-345.4-239.2 0-132.02 159.5-239.13 345.4-239.13z"
|
||||||
|
/>
|
||||||
|
</g
|
||||||
|
>
|
||||||
|
<g
|
||||||
|
id="g6865"
|
||||||
|
transform="matrix(.015187 0 0 .020868 42.258 21.904)"
|
||||||
|
>
|
||||||
|
<rect
|
||||||
|
id="rect6867"
|
||||||
|
style="opacity:.40206;color:black;fill:url(#linearGradient6715)"
|
||||||
|
height="478.36"
|
||||||
|
width="1339.6"
|
||||||
|
y="-150.7"
|
||||||
|
x="-1559.3"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path6869"
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
style="opacity:.40206;color:black;fill:url(#radialGradient6717)"
|
||||||
|
d="m-219.62-150.68v478.33c142.88 0.9 345.4-107.17 345.4-239.2 0-132.02-159.44-239.13-345.4-239.13z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path6871"
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
style="opacity:.40206;color:black;fill:url(#radialGradient6719)"
|
||||||
|
d="m-1559.3-150.68v478.33c-142.8 0.9-345.4-107.17-345.4-239.2 0-132.02 159.5-239.13 345.4-239.13z"
|
||||||
|
/>
|
||||||
|
</g
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
id="path29431"
|
||||||
|
sodipodi:rx="11.515739"
|
||||||
|
sodipodi:ry="3.9901025"
|
||||||
|
style="opacity:.12025;color:#000000;display:block;fill:url(#radialGradient29439)"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
d="m41.012 27.645a11.516 3.9901 0 1 1 -23.031 0 11.516 3.9901 0 1 1 23.031 0z"
|
||||||
|
transform="matrix(1.3728 0 0 1.0924 -10.337 .23562)"
|
||||||
|
sodipodi:cy="27.645426"
|
||||||
|
sodipodi:cx="29.496454"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="rect29408"
|
||||||
|
style="color:#000000;display:block;stroke:#787878;fill:url(#linearGradient29429)"
|
||||||
|
d="m18.402 6.5709c-1.072 0-1.921 0.8634-1.921 1.9135v15.062c0 1.05 0.849 1.883 1.921 1.883h14.137c0.856 1.103 2.523 2.893 6.517 4.382-1.778-2.049-1.774-3.44-1.574-4.382h2.897c1.071 0 1.952-0.833 1.952-1.883v-15.062c0-1.0497-0.881-1.9131-1.952-1.9131h-21.977z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path29445"
|
||||||
|
sodipodi:nodetypes="cccccccccccc"
|
||||||
|
style="color:#000000;display:block;stroke:#ffffff;fill:none"
|
||||||
|
d="m18.813 7.5755c-0.918 0-1.292 0.437-1.292 1.337v13.868c0 0.9 0.727 1.614 1.646 1.614h13.884c0.733 0.946 1.303 1.975 3.515 3.1-0.414-0.898-0.065-2.152 0.216-3.1h3.493c0.918 0 1.016-0.36 1.016-1.26v-14.222c0-0.8995-0.25-1.286-1.168-1.286l-21.31-0.0505z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path29441"
|
||||||
|
style="color:#000000;display:block;stroke:#787878;fill:url(#linearGradient29443)"
|
||||||
|
d="m29.776 15.464c1.039 0 1.862 0.871 1.862 1.93v15.187c0 1.059-0.823 1.898-1.862 1.898h-13.712c-0.831 1.113-2.447 2.918-6.3216 4.42 1.7246-2.066 1.7216-3.469 1.5266-4.42h-2.8093c-1.039 0-1.8933-0.839-1.8933-1.898v-15.187c0-1.059 0.8543-1.93 1.8933-1.93h21.316z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path29449"
|
||||||
|
sodipodi:nodetypes="cccccccccccc"
|
||||||
|
style="color:#000000;display:block;stroke:#ffffff;fill:none"
|
||||||
|
d="m29.389 16.453c0.943 0 1.235 0.461 1.235 1.422v14.204c0 0.96-0.242 1.368-1.184 1.368h-13.902c-0.753 1.01-2.068 2.596-3.511 3.251 0.403-1.167 0.248-2.136 0.173-3.251h-3.4072c-0.9425 0-1.2123-0.408-1.2123-1.368v-14.078c0-0.96 0.2698-1.548 1.2123-1.548h20.596z"
|
||||||
|
/>
|
||||||
|
</g
|
||||||
|
>
|
||||||
|
<metadata
|
||||||
|
>
|
||||||
|
<rdf:RDF
|
||||||
|
>
|
||||||
|
<cc:Work
|
||||||
|
>
|
||||||
|
<dc:format
|
||||||
|
>image/svg+xml</dc:format
|
||||||
|
>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||||
|
/>
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||||
|
/>
|
||||||
|
<dc:publisher
|
||||||
|
>
|
||||||
|
<cc:Agent
|
||||||
|
rdf:about="http://openclipart.org/"
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>Openclipart</dc:title
|
||||||
|
>
|
||||||
|
</cc:Agent
|
||||||
|
>
|
||||||
|
</dc:publisher
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>tango inetrnet group chat</dc:title
|
||||||
|
>
|
||||||
|
<dc:date
|
||||||
|
>2010-03-29T08:03:30</dc:date
|
||||||
|
>
|
||||||
|
<dc:description
|
||||||
|
>"Group chat" icon from <a href="http://tango.freedesktop.org/Tango_Desktop_Project"> Tango Project </a> \n<br><br> \nSince version 0.8.90 Tango Project icons are Public Domain: <a href="http://tango.freedesktop.org/Frequently_Asked_Questions#Terms_of_Use.3F"> Tango Project FAQ </a></dc:description
|
||||||
|
>
|
||||||
|
<dc:source
|
||||||
|
>https://openclipart.org/detail/35209/tango-inetrnet-group-chat-by-warszawianka</dc:source
|
||||||
|
>
|
||||||
|
<dc:creator
|
||||||
|
>
|
||||||
|
<cc:Agent
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>warszawianka</dc:title
|
||||||
|
>
|
||||||
|
</cc:Agent
|
||||||
|
>
|
||||||
|
</dc:creator
|
||||||
|
>
|
||||||
|
<dc:subject
|
||||||
|
>
|
||||||
|
<rdf:Bag
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>balloon</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>externalsource</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>icon</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>speech</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>tango</rdf:li
|
||||||
|
>
|
||||||
|
</rdf:Bag
|
||||||
|
>
|
||||||
|
</dc:subject
|
||||||
|
>
|
||||||
|
</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
|
||||||
|
>
|
||||||
|
</svg
|
||||||
|
>
|
After Width: | Height: | Size: 11 KiB |
BIN
client/assets/door.png
(Stored with Git LFS)
BIN
client/assets/door.png
(Stored with Git LFS)
Binary file not shown.
BIN
client/assets/dos.png
(Stored with Git LFS)
BIN
client/assets/dos.png
(Stored with Git LFS)
Binary file not shown.
140
client/assets/email.svg
Normal file
140
client/assets/email.svg
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:cc="http://web.resource.org/cc/"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:ns1="http://sozi.baierouge.fr"
|
||||||
|
id="svg1"
|
||||||
|
sodipodi:docname="email.svg"
|
||||||
|
viewBox="0 0 60 60"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
version="1.0"
|
||||||
|
y="0"
|
||||||
|
x="0"
|
||||||
|
inkscape:version="0.37"
|
||||||
|
sodipodi:docbase="/home/danny/flat/scalable/apps"
|
||||||
|
>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
bordercolor="#666666"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1016"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
inkscape:zoom="4.91194112"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:cx="22.5591972"
|
||||||
|
inkscape:cy="35.1510176"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-height="685"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path589"
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
style="stroke-linejoin:round;fill-rule:evenodd;stroke:#333333;stroke-linecap:round;stroke-width:17.927;fill:#b3b3b3"
|
||||||
|
d="m69.819 119.6h303.75v171.31h-303.75l-0.001-171.31z"
|
||||||
|
transform="matrix(.17049 0 0 .17824 -7.3882 -6.0097)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path590"
|
||||||
|
sodipodi:nodetypes="ccc"
|
||||||
|
style="stroke-linejoin:round;stroke:#333333;stroke-linecap:round;stroke-width:10.756;fill:none"
|
||||||
|
d="m69.819 119.6l150.12 90.41 153.63-90.41"
|
||||||
|
transform="matrix(.17049 0 0 .17824 -7.3882 -6.0097)"
|
||||||
|
/>
|
||||||
|
<metadata
|
||||||
|
>
|
||||||
|
<rdf:RDF
|
||||||
|
>
|
||||||
|
<cc:Work
|
||||||
|
>
|
||||||
|
<dc:format
|
||||||
|
>image/svg+xml</dc:format
|
||||||
|
>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||||
|
/>
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||||
|
/>
|
||||||
|
<dc:publisher
|
||||||
|
>
|
||||||
|
<cc:Agent
|
||||||
|
rdf:about="http://openclipart.org/"
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>Openclipart</dc:title
|
||||||
|
>
|
||||||
|
</cc:Agent
|
||||||
|
>
|
||||||
|
</dc:publisher
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>ftmail generic</dc:title
|
||||||
|
>
|
||||||
|
<dc:date
|
||||||
|
>2011-01-31T02:06:24</dc:date
|
||||||
|
>
|
||||||
|
<dc:description
|
||||||
|
>Originally uploaded by Danny Allen for OCAL 0.18 this icon is part of the flat theme</dc:description
|
||||||
|
>
|
||||||
|
<dc:source
|
||||||
|
>https://openclipart.org/detail/113293/ftmail-generic-by-anonymous</dc:source
|
||||||
|
>
|
||||||
|
<dc:creator
|
||||||
|
>
|
||||||
|
<cc:Agent
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>Anonymous</dc:title
|
||||||
|
>
|
||||||
|
</cc:Agent
|
||||||
|
>
|
||||||
|
</dc:creator
|
||||||
|
>
|
||||||
|
<dc:subject
|
||||||
|
>
|
||||||
|
<rdf:Bag
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>flat</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>icon</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>theme</rdf:li
|
||||||
|
>
|
||||||
|
</rdf:Bag
|
||||||
|
>
|
||||||
|
</dc:subject
|
||||||
|
>
|
||||||
|
</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
|
||||||
|
>
|
||||||
|
</svg
|
||||||
|
>
|
After Width: | Height: | Size: 3.7 KiB |
15
client/assets/forums.svg
Normal file
15
client/assets/forums.svg
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<svg width="351" height="406" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="imagebot_9" y2="0.21591" x2="0.09717" y1="0.14096" x1="0.0652">
|
||||||
|
<stop id="imagebot_13" offset="0" stop-color="#f2f207" stop-opacity="0.98828"/>
|
||||||
|
<stop id="imagebot_12" offset="1" stop-color="#ffff00" stop-opacity="0.99609"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g id="imagebot_1">
|
||||||
|
<title/>
|
||||||
|
<path d="M 234.344 156.525 C 259.676 145.184 293.706 138.257 293.706 138.257 L 396.844 117.065 L 407.929 247.641 S 411.728 298.853 426.097 335.26 C 398.724 386.566 335.074 395.468 335.074 395.468 L 251.134 412.718 L 232.17 189.347 S 230.524 167.872 234.344 156.525 Z" fill="url(#imagebot_9)" stroke-width="4" stroke="#000000" id="imagebot_5" transform="rotate(186.106 160.584 237.45) matrix(1 0 0 1 -168.373 -27.4409)"/>
|
||||||
|
<path id="imagebot_15" d="M234.34399,156.52499C259.67599,145.18401 293.70599,138.257 293.70599,138.257L396.84399,117.065L407.92899,247.64101S411.728,298.853 426.09698,335.26001C398.724,386.56601 335.07401,395.46799 335.07401,395.46799L251.134,412.71799L232.17,189.347S230.524,167.87199 234.34399,156.52499z" fill="url(#imagebot_9)" stroke-width="4" stroke="#000000" transform="rotate(208.188 148.084 157.451) matrix(1 0 0 1 -180.873 -107.441)"/>
|
||||||
|
<path id="imagebot_14" d="M234.34399,156.52499C259.67599,145.18401 293.70599,138.257 293.70599,138.257L396.84399,117.065L407.92899,247.64101S411.728,298.853 426.09698,335.26001C398.724,386.56601 335.07401,395.46799 335.07401,395.46799L251.134,412.71799L232.17,189.347S230.524,167.87199 234.34399,156.52499z" fill="url(#imagebot_9)" stroke-width="4" stroke="#000000" transform="rotate(340.413 218.084 189.951) matrix(1 0 0 1 -110.873 -74.9409)"/>
|
||||||
|
</g>
|
||||||
|
<metadata>image/svg+xmlOpenclipartBlank sticky note 12006-12-26T00:00:00https://openclipart.org/detail/17621/-by--17621lemmling</metadata>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
223
client/assets/games.svg
Normal file
223
client/assets/games.svg
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:cc="http://web.resource.org/cc/"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:ns1="http://sozi.baierouge.fr"
|
||||||
|
id="svg1"
|
||||||
|
sodipodi:docname="package_games.svg"
|
||||||
|
viewBox="0 0 60 60"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
version="1.0"
|
||||||
|
y="0"
|
||||||
|
x="0"
|
||||||
|
inkscape:version="0.37"
|
||||||
|
sodipodi:docbase="/home/danny/flat/scalable/apps"
|
||||||
|
>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
bordercolor="#666666"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1016"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
inkscape:zoom="4.91194111"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:cx="13.5478734"
|
||||||
|
inkscape:cy="25.0607802"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-height="693"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1059"
|
||||||
|
style="stroke-linejoin:round;stroke:#333333;stroke-linecap:round;stroke-dasharray:3.03596,3.03596;stroke-width:3.036;fill:none"
|
||||||
|
d="m-45.043 19.028c3.053-14.251 6.049-17.403 6.049-17.403"
|
||||||
|
sodipodi:nodetypes="cc"
|
||||||
|
transform="matrix(.71741 .73814 -.73814 .71741 83.477 42.026)"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
/>
|
||||||
|
<rect
|
||||||
|
id="rect1049"
|
||||||
|
style="fill-rule:evenodd;stroke:#333333;stroke-width:3.036;fill:#b3b3b3"
|
||||||
|
transform="matrix(.71741 .73814 -.73814 .71741 83.477 42.026)"
|
||||||
|
height="17.635"
|
||||||
|
width="33.83"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
y="18.612"
|
||||||
|
x="-61.901"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1048"
|
||||||
|
sodipodi:rx="12.05637264"
|
||||||
|
sodipodi:ry="12.05637264"
|
||||||
|
style="fill-rule:evenodd;stroke:#333333;stroke-width:3.036;fill:#7f7f7f"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
d="m-51.824 29.229a12.056 12.056 0 1 0 -24.113 0 12.056 12.056 0 1 0 24.113 0h-12.057z"
|
||||||
|
transform="matrix(.71741 .73814 -.73814 .71741 111.44 70.796)"
|
||||||
|
sodipodi:cy="29.22925758"
|
||||||
|
sodipodi:cx="-63.88077927"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1047"
|
||||||
|
sodipodi:rx="12.05637264"
|
||||||
|
sodipodi:ry="12.05637264"
|
||||||
|
style="fill-rule:evenodd;stroke:#333333;stroke-width:3.036;fill:#7f7f7f"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
d="m-51.824 29.229a12.056 12.056 0 1 0 -24.113 0 12.056 12.056 0 1 0 24.113 0h-12.057z"
|
||||||
|
transform="matrix(.71741 .73814 -.73814 .71741 83.477 42.026)"
|
||||||
|
sodipodi:cy="29.22925758"
|
||||||
|
sodipodi:cx="-63.88077927"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1052"
|
||||||
|
sodipodi:rx="3.05907965"
|
||||||
|
sodipodi:ry="3.05907965"
|
||||||
|
style="fill-rule:evenodd;stroke:#333333;stroke-width:1.4746;fill:#4c4c4c"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
d="m-55.063 4.2168a3.0591 3.0591 0 1 0 -6.119 0 3.0591 3.0591 0 1 0 6.119 0h-3.06z"
|
||||||
|
transform="matrix(.59080 .60788 -.60788 .59080 77.124 72.997)"
|
||||||
|
sodipodi:cy="4.21678305"
|
||||||
|
sodipodi:cx="-58.12251282"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1053"
|
||||||
|
sodipodi:rx="3.05907965"
|
||||||
|
sodipodi:ry="3.05907965"
|
||||||
|
style="fill-rule:evenodd;stroke:#333333;stroke-width:1.4746;fill:#4c4c4c"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
d="m-55.063 4.2168a3.0591 3.0591 0 1 0 -6.119 0 3.0591 3.0591 0 1 0 6.119 0h-3.06z"
|
||||||
|
transform="matrix(.59080 .60788 -.60788 .59080 85.515 81.631)"
|
||||||
|
sodipodi:cy="4.21678305"
|
||||||
|
sodipodi:cx="-58.12251282"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1054"
|
||||||
|
sodipodi:rx="3.05907965"
|
||||||
|
sodipodi:ry="3.05907965"
|
||||||
|
style="fill-rule:evenodd;stroke:#333333;stroke-width:1.4746;fill:#4c4c4c"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
d="m-55.063 4.2168a3.0591 3.0591 0 1 0 -6.119 0 3.0591 3.0591 0 1 0 6.119 0h-3.06z"
|
||||||
|
transform="matrix(.59080 .60788 -.60788 .59080 76.602 82.028)"
|
||||||
|
sodipodi:cy="4.21678305"
|
||||||
|
sodipodi:cx="-58.12251282"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1055"
|
||||||
|
sodipodi:rx="3.05907965"
|
||||||
|
sodipodi:ry="3.05907965"
|
||||||
|
style="fill-rule:evenodd;stroke:#333333;stroke-width:1.4746;fill:#4c4c4c"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
d="m-55.063 4.2168a3.0591 3.0591 0 1 0 -6.119 0 3.0591 3.0591 0 1 0 6.119 0h-3.06z"
|
||||||
|
transform="matrix(.59080 .60788 -.60788 .59080 85.767 73.12)"
|
||||||
|
sodipodi:cy="4.21678305"
|
||||||
|
sodipodi:cx="-58.12251282"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1058"
|
||||||
|
style="fill-rule:evenodd;stroke:#333333;stroke-width:1.2144;fill:#4c4c4c"
|
||||||
|
transform="matrix(.71741 .73814 -.73814 .71741 57.92 67.596)"
|
||||||
|
d="m-65.562-14c-0.555 0-1 0.446-1 1v4.4688h-4.469c-0.554 0-1 0.446-1 1v2.8437c0 0.554 0.446 1 1 1h4.469v4.4688c-0.001 0.5539 0.446 0.9999 1 0.9999h2.843c0.554 0 1-0.446 1-0.99995v-4.4688l4.469 0.0001c0.554 0 1-0.446 1-1v-2.8437c0-0.554-0.446-1-1-1h-4.469v-4.4688c0-0.554-0.446-1-1-1h-2.843z"
|
||||||
|
sodipodi:stroke-cmyk="(0 0 0 0.8)"
|
||||||
|
/>
|
||||||
|
<metadata
|
||||||
|
>
|
||||||
|
<rdf:RDF
|
||||||
|
>
|
||||||
|
<cc:Work
|
||||||
|
>
|
||||||
|
<dc:format
|
||||||
|
>image/svg+xml</dc:format
|
||||||
|
>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||||
|
/>
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||||
|
/>
|
||||||
|
<dc:publisher
|
||||||
|
>
|
||||||
|
<cc:Agent
|
||||||
|
rdf:about="http://openclipart.org/"
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>Openclipart</dc:title
|
||||||
|
>
|
||||||
|
</cc:Agent
|
||||||
|
>
|
||||||
|
</dc:publisher
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>ftpackage games</dc:title
|
||||||
|
>
|
||||||
|
<dc:date
|
||||||
|
>2011-01-31T02:14:23</dc:date
|
||||||
|
>
|
||||||
|
<dc:description
|
||||||
|
>Originally uploaded by Danny Allen for OCAL 0.18 this icon is part of the flat theme</dc:description
|
||||||
|
>
|
||||||
|
<dc:source
|
||||||
|
>https://openclipart.org/detail/116275/ftpackage-games-by-anonymous</dc:source
|
||||||
|
>
|
||||||
|
<dc:creator
|
||||||
|
>
|
||||||
|
<cc:Agent
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>Anonymous</dc:title
|
||||||
|
>
|
||||||
|
</cc:Agent
|
||||||
|
>
|
||||||
|
</dc:creator
|
||||||
|
>
|
||||||
|
<dc:subject
|
||||||
|
>
|
||||||
|
<rdf:Bag
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>flat</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>icon</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>theme</rdf:li
|
||||||
|
>
|
||||||
|
</rdf:Bag
|
||||||
|
>
|
||||||
|
</dc:subject
|
||||||
|
>
|
||||||
|
</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
|
||||||
|
>
|
||||||
|
</svg
|
||||||
|
>
|
After Width: | Height: | Size: 7 KiB |
BIN
client/assets/if.png
(Stored with Git LFS)
BIN
client/assets/if.png
(Stored with Git LFS)
Binary file not shown.
BIN
client/assets/logo.xcf
(Stored with Git LFS)
BIN
client/assets/logo.xcf
(Stored with Git LFS)
Binary file not shown.
494
client/assets/logoff.svg
Normal file
494
client/assets/logoff.svg
Normal file
|
@ -0,0 +1,494 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:ns1="http://sozi.baierouge.fr"
|
||||||
|
id="svg11300"
|
||||||
|
sodipodi:docname="system-log-out.svg"
|
||||||
|
sodipodi:modified="true"
|
||||||
|
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
|
||||||
|
viewBox="0 0 48 48"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:export-xdpi="90.000000"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||||
|
inkscape:export-ydpi="90.000000"
|
||||||
|
inkscape:version="0.46"
|
||||||
|
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
|
||||||
|
>
|
||||||
|
<defs
|
||||||
|
id="defs3"
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient9864"
|
||||||
|
y2="27.759"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
y1="19.804"
|
||||||
|
gradientTransform="translate(-12.021)"
|
||||||
|
x2="18.031"
|
||||||
|
x1="46.846"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop9856"
|
||||||
|
style="stop-color:#4e4e4e"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop9858"
|
||||||
|
style="stop-color:#ababab"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
<radialGradient
|
||||||
|
id="radialGradient9876"
|
||||||
|
cx="27.884"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cy="7.1396"
|
||||||
|
r="9.7227"
|
||||||
|
gradientTransform="matrix(2.5658 0 0 1.4033 -49.804 -9.4833)"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop9870"
|
||||||
|
style="stop-color:#4e4e4e"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop9872"
|
||||||
|
style="stop-color:#616161;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</radialGradient
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient9886"
|
||||||
|
y2="24.765"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
y1="19.108"
|
||||||
|
gradientTransform="translate(-13.137)"
|
||||||
|
x2="34.007"
|
||||||
|
x1="31.853"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop9882"
|
||||||
|
style="stop-color:#525252"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop9884"
|
||||||
|
style="stop-color:#525252;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient9902"
|
||||||
|
y2="18.064"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
y1="21.511"
|
||||||
|
gradientTransform="translate(-12.021)"
|
||||||
|
x2="33.711"
|
||||||
|
x1="31.079"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop9898"
|
||||||
|
style="stop-color:#cecece"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop9900"
|
||||||
|
style="stop-color:#9e9e9e"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6371"
|
||||||
|
y2="43.25"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x2="40.25"
|
||||||
|
gradientTransform="translate(-12.021)"
|
||||||
|
y1="31.625"
|
||||||
|
x1="40.25"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop6367"
|
||||||
|
style="stop-color:#ffffff"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop6369"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
<filter
|
||||||
|
id="filter6421"
|
||||||
|
height="1.2083"
|
||||||
|
width="1.2831"
|
||||||
|
y="-.10415"
|
||||||
|
x="-.14154"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur6423"
|
||||||
|
stdDeviation="2.07"
|
||||||
|
inkscape:collect="always"
|
||||||
|
/>
|
||||||
|
</filter
|
||||||
|
>
|
||||||
|
<filter
|
||||||
|
id="filter6451"
|
||||||
|
height="1.2391"
|
||||||
|
width="1.1336"
|
||||||
|
y="-.11953"
|
||||||
|
x="-.066813"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur6453"
|
||||||
|
stdDeviation="0.76879489"
|
||||||
|
inkscape:collect="always"
|
||||||
|
/>
|
||||||
|
</filter
|
||||||
|
>
|
||||||
|
<radialGradient
|
||||||
|
id="radialGradient6461"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cy="36.421"
|
||||||
|
cx="24.837"
|
||||||
|
gradientTransform="matrix(1 0 0 .53672 0 16.873)"
|
||||||
|
r="15.645"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop8664"
|
||||||
|
style="stop-color:#000000"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop8666"
|
||||||
|
style="stop-color:#000000;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</radialGradient
|
||||||
|
>
|
||||||
|
<radialGradient
|
||||||
|
id="radialGradient6463"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cy="2.8969"
|
||||||
|
cx="19.701"
|
||||||
|
gradientTransform="matrix(1.2534 0 0 .9539 -15.479 11.277)"
|
||||||
|
r="17.171"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop8652"
|
||||||
|
style="stop-color:#ffffff"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop8654"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</radialGradient
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6465"
|
||||||
|
y2="43.45"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x2="19.756"
|
||||||
|
gradientTransform="matrix(.96872 0 0 .96892 .36168 .73782)"
|
||||||
|
y1="13.663"
|
||||||
|
x1="8.7601"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop9890"
|
||||||
|
style="stop-color:#ffffff"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop9892"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6473"
|
||||||
|
y2="29.068"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x2="18.729"
|
||||||
|
y1="44"
|
||||||
|
x1="18.729"
|
||||||
|
inkscape:collect="always"
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
id="stop6469"
|
||||||
|
style="stop-color:#babdb6"
|
||||||
|
offset="0"
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
id="stop6471"
|
||||||
|
style="stop-color:#babdb6;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
/>
|
||||||
|
</linearGradient
|
||||||
|
>
|
||||||
|
</defs
|
||||||
|
>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
bordercolor="#666666"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-y="86"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:grid-bbox="true"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="-103.37653"
|
||||||
|
inkscape:window-height="762"
|
||||||
|
showgrid="false"
|
||||||
|
borderopacity="0.25490196"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
stroke="#a40000"
|
||||||
|
inkscape:cy="5.4914491"
|
||||||
|
inkscape:window-x="468"
|
||||||
|
inkscape:window-width="966"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
fill="#727e0a"
|
||||||
|
/>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
>
|
||||||
|
<rect
|
||||||
|
id="rect9828"
|
||||||
|
style="fill-rule:evenodd;color:#000000;stroke:#555753;stroke-miterlimit:10;fill:#eeeeec"
|
||||||
|
inkscape:r_cy="true"
|
||||||
|
inkscape:r_cx="true"
|
||||||
|
rx=".70711"
|
||||||
|
ry=".70710"
|
||||||
|
height="41.942"
|
||||||
|
width="31.996"
|
||||||
|
y="2.5692"
|
||||||
|
x="1.4809"
|
||||||
|
/>
|
||||||
|
<rect
|
||||||
|
id="rect9840"
|
||||||
|
style="fill-rule:evenodd;color:#000000;fill:url(#linearGradient6473)"
|
||||||
|
inkscape:r_cy="true"
|
||||||
|
inkscape:r_cx="true"
|
||||||
|
height="26.759"
|
||||||
|
width="31"
|
||||||
|
y="17.241"
|
||||||
|
x="1.9792"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path6425"
|
||||||
|
sodipodi:nodetypes="cczcc"
|
||||||
|
style="opacity:.55429;filter:url(#filter6451);fill-rule:evenodd;fill:#000000"
|
||||||
|
d="m2.1042 43.875l21.375-8.875s3.514-2.22 0.25-3.5c-3.415-1.34-7 0.5-7 0.5l-14.625 11.875z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path9852"
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
style="fill-rule:evenodd;color:#000000;fill:url(#linearGradient9864)"
|
||||||
|
d="m2.0168 43.945l-0.0388-40.89 19.942 0.0437 0.045 29.919-19.948 10.927z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path1360"
|
||||||
|
style="opacity:.42222;color:#000000;display:block;fill:#ffffff"
|
||||||
|
inkscape:r_cy="true"
|
||||||
|
inkscape:r_cx="true"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
d="m1.949 43.945l20.148-10.883-18.562 8.928 0.0005-38.98-1.5704 0.0003-0.0161 40.935z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path9866"
|
||||||
|
style="fill-rule:evenodd;color:#000000;fill:url(#radialGradient9876)"
|
||||||
|
inkscape:r_cy="true"
|
||||||
|
inkscape:r_cx="true"
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
d="m2.024 43.757l-0.0448-40.702 19.941-0.0005-0.179 30.626-19.717 10.077z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path9878"
|
||||||
|
sodipodi:nodetypes="cccsscc"
|
||||||
|
style="fill-rule:evenodd;color:#000000;fill:url(#linearGradient9886)"
|
||||||
|
d="m17.622 18.456l1.923 2.453-1.459 4.817s0.265 1.503 1.039 0.486c0.773-1.016 2.972-3.582 2.585-5.458-0.287-1.392-1.083-2.055-1.083-2.055l-3.005-0.243z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path9862"
|
||||||
|
sodipodi:nodetypes="csccscs"
|
||||||
|
style="fill-rule:evenodd;color:#000000;fill:url(#linearGradient9902)"
|
||||||
|
d="m19.456 17.351s2.164 1.002 2.232 1.879c0.102 1.301-4.243 5.435-4.243 5.435-0.508 0.619-1.347 0.067-0.883-0.53 0 0 3.466-4.118 3.248-4.441-0.274-0.406-1.967-1.039-1.967-1.039-1.016-0.751 0.268-2.305 1.613-1.304z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path6355"
|
||||||
|
style="opacity:.87429;filter:url(#filter6421);fill-rule:evenodd;fill:url(#linearGradient6371)"
|
||||||
|
d="m22.229 3.5l-0.5 29.75-18 9.75 29.25 0.25-0.25-39.75h-10.5z"
|
||||||
|
/>
|
||||||
|
<g
|
||||||
|
id="g6455"
|
||||||
|
transform="matrix(-1 0 0 1 48.201 -.047335)"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
id="path8660"
|
||||||
|
sodipodi:rx="15.644737"
|
||||||
|
sodipodi:ry="8.3968935"
|
||||||
|
style="opacity:.29947;fill-rule:evenodd;color:#000000;fill:url(#radialGradient6461)"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
d="m40.482 36.421a15.645 8.3969 0 1 1 -31.29 0 15.645 8.3969 0 1 1 31.29 0z"
|
||||||
|
transform="matrix(.77849 0 0 .77849 -7.5798 1.5981)"
|
||||||
|
sodipodi:cy="36.421127"
|
||||||
|
sodipodi:cx="24.837126"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path8643"
|
||||||
|
sodipodi:nodetypes="cccccccc"
|
||||||
|
style="stroke-linejoin:round;fill-rule:evenodd;color:#000000;stroke:#a40000;stroke-linecap:round;stroke-miterlimit:10;fill:#cc0000"
|
||||||
|
d="m1.7318 17.594v12.761h7.9323v5.821l12.224-12.223-12.297-12.297 0.0003 5.941-7.8595-0.003z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path8645"
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
style="opacity:.50802;fill-rule:evenodd;color:#000000;fill:url(#radialGradient6463)"
|
||||||
|
d="m9.924 12.478v5.638h-7.8494v6.415c10.258-3.827 9.8804 3.243 19.219-0.585l-11.37-11.468z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
id="path8658"
|
||||||
|
sodipodi:nodetypes="cccccccc"
|
||||||
|
style="opacity:.48128;color:#000000;stroke:url(#linearGradient6465);stroke-miterlimit:10;fill:none"
|
||||||
|
d="m2.6834 18.566v10.79h7.9016v4.125l9.543-9.539-9.606-9.945v4.572l-7.8386-0.003z"
|
||||||
|
/>
|
||||||
|
</g
|
||||||
|
>
|
||||||
|
</g
|
||||||
|
>
|
||||||
|
<metadata
|
||||||
|
>
|
||||||
|
<rdf:RDF
|
||||||
|
>
|
||||||
|
<cc:Work
|
||||||
|
>
|
||||||
|
<dc:format
|
||||||
|
>image/svg+xml</dc:format
|
||||||
|
>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||||
|
/>
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||||
|
/>
|
||||||
|
<dc:publisher
|
||||||
|
>
|
||||||
|
<cc:Agent
|
||||||
|
rdf:about="http://openclipart.org/"
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>Openclipart</dc:title
|
||||||
|
>
|
||||||
|
</cc:Agent
|
||||||
|
>
|
||||||
|
</dc:publisher
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>tango system log out</dc:title
|
||||||
|
>
|
||||||
|
<dc:date
|
||||||
|
>2010-03-26T15:33:56</dc:date
|
||||||
|
>
|
||||||
|
<dc:description
|
||||||
|
>"Log out" icon from <a href="http://tango.freedesktop.org/Tango_Desktop_Project"> Tango Project </a> \n<br><br> \nSince version 0.8.90 Tango Project icons are Public Domain: <a href="http://tango.freedesktop.org/Frequently_Asked_Questions#Terms_of_Use.3F"> Tango Project FAQ </a></dc:description
|
||||||
|
>
|
||||||
|
<dc:source
|
||||||
|
>https://openclipart.org/detail/34279/tango-system-log-out-by-warszawianka</dc:source
|
||||||
|
>
|
||||||
|
<dc:creator
|
||||||
|
>
|
||||||
|
<cc:Agent
|
||||||
|
>
|
||||||
|
<dc:title
|
||||||
|
>warszawianka</dc:title
|
||||||
|
>
|
||||||
|
</cc:Agent
|
||||||
|
>
|
||||||
|
</dc:creator
|
||||||
|
>
|
||||||
|
<dc:subject
|
||||||
|
>
|
||||||
|
<rdf:Bag
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>arrow</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>door</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>exit</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>externalsource</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>icon</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>logout</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>open</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>quit</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>red</rdf:li
|
||||||
|
>
|
||||||
|
<rdf:li
|
||||||
|
>tango</rdf:li
|
||||||
|
>
|
||||||
|
</rdf:Bag
|
||||||
|
>
|
||||||
|
</dc:subject
|
||||||
|
>
|
||||||
|
</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
|
||||||
|
>
|
||||||
|
</svg
|
||||||
|
>
|
After Width: | Height: | Size: 13 KiB |
BIN
client/assets/menu.xcf
(Stored with Git LFS)
BIN
client/assets/menu.xcf
(Stored with Git LFS)
Binary file not shown.
25
client/assets/profile.svg
Normal file
25
client/assets/profile.svg
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!--part of the rodentia icon theme by sixsixfive released under CC0 (https://creativecommons.org/publicdomain/zero/1.0/) on openclipart-->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48">
|
||||||
|
<defs id="0">
|
||||||
|
<linearGradient id="5">
|
||||||
|
<stop id="B" stop-color="#fff"/>
|
||||||
|
<stop id="C" offset="1" stop-color="#fff" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="6">
|
||||||
|
<stop id="D" stop-color="#fff" stop-opacity="0.8"/>
|
||||||
|
<stop id="E" offset="1" stop-color="#fff" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="7">
|
||||||
|
<stop id="F" stop-color="#2e3436"/>
|
||||||
|
<stop id="G" offset="1" stop-color="#2e3436" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient cx="46.37" cy="56.54" r="27.457" id="8" xlink:href="#7" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.1371237,0,48.787205)"/>
|
||||||
|
<linearGradient y1="5.353" x2="0" y2="42.619" id="9" xlink:href="#6" gradientUnits="userSpaceOnUse"/>
|
||||||
|
<linearGradient x1="-3.655" y1="-42.14" x2="23.875" y2="28.921" id="A" xlink:href="#5" gradientUnits="userSpaceOnUse"/>
|
||||||
|
</defs>
|
||||||
|
<path d="m 73.831503,56.540211 a 27.457239,3.7650394 0 1 1 -54.914478,0 27.457239,3.7650394 0 1 1 54.914478,0 z" transform="matrix(0.8607554,0,0,0.837344,-15.916898,-4.1187776)" id="1" opacity="0.8" fill="url(#8)"/>
|
||||||
|
<path d="m 23.745885,4.8366182 c -8.802495,0.2375247 -10.458576,6.7343608 -9.9886,11.6217548 0.07298,0.759003 0.419647,1.45117 0.969359,2.065153 0.05164,-0.481788 0.12211,-0.955708 0.221266,-1.422426 -0.03689,0.4142 -0.05268,0.838085 -0.05268,1.264379 0,3.935025 1.61426,7.411391 4.067087,9.461775 -0.163396,0.961944 -0.531105,1.783069 -1.074723,2.781635 L 8.6997677,32.579213 C 4.2458962,33.609558 3.9089135,39.951429 4.2112201,43.168393 43.88856,43.055802 4.1345553,43.234679 43.870593,43.0841 43.734607,39.567206 43.237712,33.315864 38.70771,32.347411 L 30.004563,30.69318 c -6.6e-4,-0.0281 0.002,-0.05618 0,-0.08429 l -0.537361,-2.960756 c 2.339084,-2.069434 3.866895,-5.456647 3.866894,-9.282654 0,-0.03864 3.11e-4,-0.07736 0,-0.115901 0.03777,0.192801 0.07538,0.383427 0.105366,0.547897 0.498845,-0.67264 0.381843,-1.824112 0.516288,-2.728952 0.699546,-4.708055 -1.951521,-11.0931996 -9.3248,-11.2319048 -0.298997,-0.00562 -0.601105,-0.00766 -0.885065,0 z" id="2" fill="#555753" fill-rule="evenodd" stroke="#323232" stroke-width="1.042"/>
|
||||||
|
<path d="m 23.78125,5.875 c -4.145538,0.1118622 -6.347373,1.6089948 -7.625,3.59375 -1.22166,1.897812 -1.540263,4.384838 -1.375,6.59375 0.315181,-0.04369 0.633133,0.05826 0.864128,0.277101 0.230994,0.218837 0.349978,0.530818 0.323372,0.847899 -0.03023,0.339413 0,0.751967 0,1.1875 0,3.649433 1.474225,6.800987 3.65625,8.625 0.29833,0.239773 0.44211,0.623187 0.375,1 -0.192613,1.133951 -0.659641,2.066728 -1.21875,3.09375 -0.141443,0.268269 -0.392227,0.462056 -0.6875,0.53125 l -9.1875,2 c -1.7745211,0.410513 -2.6766636,1.807072 -3.21875,3.71875 -0.4455205,1.571137 -0.4984358,3.30909 -0.4375,4.75 12.500668,0.01464 24.999191,-0.01402 37.5,-0.0625 -0.09526,-1.572458 -0.287738,-3.356234 -0.8125,-4.9375 C 41.292687,35.150733 40.321102,33.764327 38.5,33.375 l -8.6875,-1.65625 c -0.458981,-0.08914 -0.803287,-0.471698 -0.84375,-0.9375 -0.01111,-0.02048 -0.02153,-0.04133 -0.03125,-0.0625 -0.0011,-0.04656 3.67e-4,-0.01517 0,-0.03125 l -0.5,-2.84375 c -0.06266,-0.360806 0.06768,-0.728136 0.34375,-0.96875 2.084914,-1.844563 3.500001,-4.954264 3.5,-8.5 10e-7,-0.04422 2.09e-4,-0.09906 0,-0.125 0.0018,-0.375471 0.204523,-0.721233 0.53125,-0.90625 0.04124,-0.412683 0.04587,-0.904925 0.125,-1.4375 0.311211,-2.0945 -0.137889,-4.613833 -1.46875,-6.5625 C 30.137889,7.3950828 27.981251,5.9699752 24.59375,5.90625 24.302819,5.90078 24.040853,5.867995 23.78125,5.875 z" id="3" opacity="0.8" fill="none" stroke="url(#9)" stroke-width="1.042"/>
|
||||||
|
<path d="m 23.75,5.34375 c -4.279827,0.1154859 -6.68992,1.7114873 -8.0625,3.84375 -1.37258,2.132263 -1.665114,4.851739 -1.4375,7.21875 0.02159,0.224531 0.110797,0.443755 0.1875,0.65625 0.0042,-0.02047 -0.0043,-0.04208 0,-0.0625 0.03452,-0.276142 0.286358,-0.472018 0.5625,-0.4375 0.276142,0.03452 0.472018,0.286358 0.4375,0.5625 -0.03373,0.378688 -0.03125,0.819319 -0.03125,1.25 0,2.849561 0.86456,5.44344 2.28125,7.375 4.794221,-2.62034 9.862678,-5.232077 15.15625,-7.28125 2.17e-4,-0.03134 0,-0.06234 0,-0.09375 10e-7,-0.04128 2.63e-4,-0.09244 0,-0.125 -0.0054,-0.243706 0.166594,-0.455421 0.40625,-0.5 0.02067,-0.109172 0.08035,-0.15874 0.09375,-0.28125 0.05011,-0.457953 0.0505,-0.967353 0.125,-1.46875 0.331462,-2.230794 -0.14191,-4.8887 -1.5625,-6.96875 C 30.48566,6.9512002 28.169597,5.4104305 24.625,5.34375 24.329833,5.3382 24.022394,5.3364 23.75,5.34375 z" id="4" fill="url(#A)" fill-rule="evenodd"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
BIN
client/in/logo.png
(Stored with Git LFS)
BIN
client/in/logo.png
(Stored with Git LFS)
Binary file not shown.
BIN
client/in/menu/48chat.png
(Stored with Git LFS)
Normal file
BIN
client/in/menu/48chat.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
client/in/menu/48email.png
(Stored with Git LFS)
Normal file
BIN
client/in/menu/48email.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
client/in/menu/48forums.png
(Stored with Git LFS)
Normal file
BIN
client/in/menu/48forums.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
client/in/menu/48games.png
(Stored with Git LFS)
Normal file
BIN
client/in/menu/48games.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
client/in/menu/48logoff.png
(Stored with Git LFS)
Normal file
BIN
client/in/menu/48logoff.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
client/in/menu/48profile.png
(Stored with Git LFS)
Normal file
BIN
client/in/menu/48profile.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
client/in/welcome/logo.png
(Stored with Git LFS)
Normal file
BIN
client/in/welcome/logo.png
(Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -72,8 +72,8 @@ void configStartup(char *file) {
|
||||||
_configName = utilAppNameWithNewExtensionGet(file, "ini");
|
_configName = utilAppNameWithNewExtensionGet(file, "ini");
|
||||||
|
|
||||||
// Numeric Defaults.
|
// Numeric Defaults.
|
||||||
__configData.videoWidth = 800;
|
__configData.videoWidth = 640;
|
||||||
__configData.videoHeight = 600;
|
__configData.videoHeight = 480;
|
||||||
__configData.videoDepth = 16;
|
__configData.videoDepth = 16;
|
||||||
__configData.serialCom = 0;
|
__configData.serialCom = 0;
|
||||||
__configData.serverPort = 16550;
|
__configData.serverPort = 16550;
|
||||||
|
|
|
@ -359,7 +359,7 @@ static uint8_t vbeIsDesiredMode(void) {
|
||||||
// Packed or Direct Color mode.
|
// Packed or Direct Color mode.
|
||||||
if (_vbeModeInfo.memoryModel == VBE_MM_PACKED || _vbeModeInfo.memoryModel == VBE_MM_DCOLOR) {
|
if (_vbeModeInfo.memoryModel == VBE_MM_PACKED || _vbeModeInfo.memoryModel == VBE_MM_DCOLOR) {
|
||||||
// Resolution minimum of 640x480.
|
// Resolution minimum of 640x480.
|
||||||
if (_vbeModeInfo.xResolution >= 800 && _vbeModeInfo.yResolution >= 600) {
|
if (_vbeModeInfo.xResolution >= 640 && _vbeModeInfo.yResolution >= 480) {
|
||||||
// Multiple of 8
|
// Multiple of 8
|
||||||
if (DIVISIBLE_BY_EIGHT(_vbeModeInfo.xResolution) && DIVISIBLE_BY_EIGHT(_vbeModeInfo.yResolution)) {
|
if (DIVISIBLE_BY_EIGHT(_vbeModeInfo.xResolution) && DIVISIBLE_BY_EIGHT(_vbeModeInfo.yResolution)) {
|
||||||
// Valid mode!
|
// Valid mode!
|
||||||
|
|
|
@ -94,7 +94,7 @@ void fileCacheCheck(fileCallback callback, char *vpaths[]) {
|
||||||
|
|
||||||
static void fileCheckNext(void) {
|
static void fileCheckNext(void) {
|
||||||
PacketEncodeDataT encoded = { 0 };
|
PacketEncodeDataT encoded = { 0 };
|
||||||
char *packetData = NULL;
|
uint8_t *packetData = NULL;
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
uint32_t temp = 0;
|
uint32_t temp = 0;
|
||||||
uint8_t doRecheck = 0;
|
uint8_t doRecheck = 0;
|
||||||
|
@ -169,7 +169,7 @@ static void fileShowDialog(void) {
|
||||||
T_TITLE, P("Downloading..."),
|
T_TITLE, P("Downloading..."),
|
||||||
T_LABEL, T_DONE,
|
T_LABEL, T_DONE,
|
||||||
T_TIMER, O(_timTimer),
|
T_TIMER, O(_timTimer),
|
||||||
T_EVENT, P(timTimerTimeout),
|
T_EVENT, P(timTimerTimeout), // ***TODO*** This should probably be placed on the desktop so it can run while the first file is checked.
|
||||||
T_VALUE, 4 * 5,
|
T_VALUE, 4 * 5,
|
||||||
T_ENABLED, 1,
|
T_ENABLED, 1,
|
||||||
T_TIMER, T_DONE,
|
T_TIMER, T_DONE,
|
||||||
|
@ -195,7 +195,7 @@ static void fileShowError(char *message) {
|
||||||
static void packetHandler(PacketDecodeDataT *packet) {
|
static void packetHandler(PacketDecodeDataT *packet) {
|
||||||
FileResponseT response = 0;
|
FileResponseT response = 0;
|
||||||
PacketEncodeDataT encoded = { 0 };
|
PacketEncodeDataT encoded = { 0 };
|
||||||
char *packetData = NULL;
|
uint8_t *packetData = NULL;
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
uint32_t temp = 0;
|
uint32_t temp = 0;
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,7 @@ void fontRender(FontT *font, char *string, ColorT foreground, ColorT background,
|
||||||
offset = cy * (font->span / 2) * font->height + cx * ((float)font->width / 8.0f);
|
offset = cy * (font->span / 2) * font->height + cx * ((float)font->width / 8.0f);
|
||||||
|
|
||||||
for (yl=0; yl<font->height; yl++) {
|
for (yl=0; yl<font->height; yl++) {
|
||||||
|
// We do 4 pixels unrolled hoping it's fast.
|
||||||
data = font->bits[offset];
|
data = font->bits[offset];
|
||||||
offset += (font->span / 2);
|
offset += (font->span / 2);
|
||||||
|
|
||||||
|
@ -132,6 +133,8 @@ void fontRender(FontT *font, char *string, ColorT foreground, ColorT background,
|
||||||
surfacePutPixel(x + 2, yp, data & 0x20 ? foreground : background);
|
surfacePutPixel(x + 2, yp, data & 0x20 ? foreground : background);
|
||||||
surfacePutPixel(x + 3, yp, data & 0x10 ? foreground : background);
|
surfacePutPixel(x + 3, yp, data & 0x10 ? foreground : background);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
yp++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Full Byte.
|
// Full Byte.
|
||||||
|
@ -145,7 +148,7 @@ void fontRender(FontT *font, char *string, ColorT foreground, ColorT background,
|
||||||
// We do 8 pixels unrolled hoping it's fast.
|
// We do 8 pixels unrolled hoping it's fast.
|
||||||
data = font->bits[offset];
|
data = font->bits[offset];
|
||||||
offset += font->span;
|
offset += font->span;
|
||||||
#ifndef FONT_DEBUGGING
|
|
||||||
surfacePutPixel(x, yp, data & 0x80 ? foreground : background);
|
surfacePutPixel(x, yp, data & 0x80 ? foreground : background);
|
||||||
surfacePutPixel(x + 1, yp, data & 0x40 ? foreground : background);
|
surfacePutPixel(x + 1, yp, data & 0x40 ? foreground : background);
|
||||||
surfacePutPixel(x + 2, yp, data & 0x20 ? foreground : background);
|
surfacePutPixel(x + 2, yp, data & 0x20 ? foreground : background);
|
||||||
|
@ -154,7 +157,7 @@ void fontRender(FontT *font, char *string, ColorT foreground, ColorT background,
|
||||||
surfacePutPixel(x + 5, yp, data & 0x04 ? foreground : background);
|
surfacePutPixel(x + 5, yp, data & 0x04 ? foreground : background);
|
||||||
surfacePutPixel(x + 6, yp, data & 0x02 ? foreground : background);
|
surfacePutPixel(x + 6, yp, data & 0x02 ? foreground : background);
|
||||||
surfacePutPixel(x + 7, yp, data & 0x01 ? foreground : background);
|
surfacePutPixel(x + 7, yp, data & 0x01 ? foreground : background);
|
||||||
#endif
|
|
||||||
yp++;
|
yp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -472,11 +472,14 @@ void guiMouseProcess(MouseT *mouse) {
|
||||||
|
|
||||||
void guiPaint(WidgetT *widget) {
|
void guiPaint(WidgetT *widget) {
|
||||||
|
|
||||||
|
PendingEventsT *event = NULL;
|
||||||
|
|
||||||
// Process any pending events.
|
// Process any pending events.
|
||||||
while (arrlen(_guiPendingEvents)) {
|
while (arrlen(_guiPendingEvents)) {
|
||||||
_guiPendingEvents[0]->callback(_guiPendingEvents[0]->widget);
|
event = _guiPendingEvents[0];
|
||||||
DEL(_guiPendingEvents[0]);
|
|
||||||
arrdel(_guiPendingEvents, 0);
|
arrdel(_guiPendingEvents, 0);
|
||||||
|
_guiPendingEvents[0]->callback(event->widget);
|
||||||
|
DEL(event);
|
||||||
}
|
}
|
||||||
arrfree(_guiPendingEvents);
|
arrfree(_guiPendingEvents);
|
||||||
|
|
||||||
|
@ -662,7 +665,7 @@ DesktopT *guiStartup(void) {
|
||||||
_guiColor[COLOR_LISTBOX_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
|
_guiColor[COLOR_LISTBOX_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
|
||||||
|
|
||||||
// Load font. ***TODO*** This should probably be provided by an API call to remove it from in here.
|
// Load font. ***TODO*** This should probably be provided by an API call to remove it from in here.
|
||||||
_guiFont = fontLoad(cacheFilenameGet("system:vga8x14"));
|
_guiFont = fontLoad(cacheFilenameGet("gui:vga8x14.dat"));
|
||||||
|
|
||||||
// Create desktop and return it. Remember it for later.
|
// Create desktop and return it. Remember it for later.
|
||||||
_guiDesktop = desktopNew();
|
_guiDesktop = desktopNew();
|
||||||
|
|
|
@ -57,11 +57,11 @@ static ButtonT *_btnThree = NULL;
|
||||||
|
|
||||||
//***TODO*** This depends on the cache system which isn't really part of the GUI.
|
//***TODO*** This depends on the cache system which isn't really part of the GUI.
|
||||||
static char *_iconFiles[MSGBOX_ICON_COUNT] = {
|
static char *_iconFiles[MSGBOX_ICON_COUNT] = {
|
||||||
"system:exclamation",
|
"gui:exclamation.png",
|
||||||
"system:warning",
|
"gui:warning.png",
|
||||||
"system:information",
|
"gui:information.png",
|
||||||
"system:message",
|
"gui:message.png",
|
||||||
"system:question"
|
"gui:question.png"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,7 @@ static void setButtons(uint8_t enabled) {
|
||||||
|
|
||||||
|
|
||||||
static void timLoginProgress(WidgetT *widget) {
|
static void timLoginProgress(WidgetT *widget) {
|
||||||
char *packetData;
|
uint8_t *packetData;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
PacketEncodeDataT encoded;
|
PacketEncodeDataT encoded;
|
||||||
TimerT *t = (TimerT *)widget;
|
TimerT *t = (TimerT *)widget;
|
||||||
|
|
|
@ -193,7 +193,7 @@ static uint8_t startup(int argc, char *argv[]) {
|
||||||
guiStartup();
|
guiStartup();
|
||||||
netStartup();
|
netStartup();
|
||||||
|
|
||||||
_pointer = imageLoad(cacheFilenameGet("system:mouse"));
|
_pointer = imageLoad(cacheFilenameGet("gui:mouse.png"));
|
||||||
_alpha = imagePixelGet(_pointer, 5, 0);
|
_alpha = imagePixelGet(_pointer, 5, 0);
|
||||||
|
|
||||||
tableLoad();
|
tableLoad();
|
||||||
|
@ -300,12 +300,33 @@ int main(int argc, char *argv[]) {
|
||||||
if (hasValidSettings()) {
|
if (hasValidSettings()) {
|
||||||
// We have what we need, start the client.
|
// We have what we need, start the client.
|
||||||
welcomeShow();
|
welcomeShow();
|
||||||
|
eventLoop();
|
||||||
} else {
|
} else {
|
||||||
// Run the setup.
|
// Run the setup.
|
||||||
settingsShow(checkSettings);
|
settingsShow(checkSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
eventLoop();
|
/*
|
||||||
|
uint8_t length = 79;
|
||||||
|
uint8_t packet[] = {
|
||||||
|
0x00, 0x0b, 0x01, 0x03, 0x00, 0x00, 0x00, 0xf6, 0x0c, 0x00, 0x00, 0x32, 0x64,
|
||||||
|
0x64, 0x38, 0x37, 0x61, 0x39, 0x65, 0x62, 0x37, 0x62, 0x30, 0x35, 0x62, 0x33,
|
||||||
|
0x38, 0x61, 0x66, 0x30, 0x33, 0x39, 0x36, 0x61, 0x38, 0x33, 0x32, 0x62, 0x35,
|
||||||
|
0x63, 0x61, 0x66, 0x63, 0x35, 0x31, 0x65, 0x61, 0x33, 0x36, 0x64, 0x33, 0x35,
|
||||||
|
0x32, 0x33, 0x37, 0x36, 0x33, 0x38, 0x64, 0x62, 0x33, 0x32, 0x35, 0x33, 0x30,
|
||||||
|
0x33, 0x37, 0x35, 0x36, 0x32, 0x32, 0x36, 0x32, 0x63, 0x34, 0x00, 0x44, 0x7e,
|
||||||
|
0x00
|
||||||
|
};
|
||||||
|
PacketDecodeDataT decoded;
|
||||||
|
|
||||||
|
if (packetDecode(__packetThreadData, &decoded, (char *)packet, length)) {
|
||||||
|
logWrite("Packet decoded: %d\n", decoded.packetType);
|
||||||
|
} else {
|
||||||
|
logWrite("Packet NOT decoded.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
shutdown();
|
||||||
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,119 +33,124 @@
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
|
|
||||||
|
|
||||||
static void btnLogoffClick(WidgetT *widget);
|
|
||||||
static void btnOptionsClick(WidgetT *widget);
|
|
||||||
static void btnMsgBoxLogoff(MsgBoxButtonT button);
|
static void btnMsgBoxLogoff(MsgBoxButtonT button);
|
||||||
static void menuFilesReady(void);
|
static void menuFilesReady(void);
|
||||||
static void picDoorClick(WidgetT *widget);
|
static void picChatClick(WidgetT *widget);
|
||||||
static void setButtons(uint8_t enabled);
|
static void picEmailClick(WidgetT *widget);
|
||||||
|
static void picForumsClick(WidgetT *widget);
|
||||||
|
static void picGamesClick(WidgetT *widget);
|
||||||
|
static void picLogoffClick(WidgetT *widget);
|
||||||
|
static void picProfileClick(WidgetT *widget);
|
||||||
|
|
||||||
|
|
||||||
static WindowT *_winMenu = NULL;
|
static PictureT *_picChat = NULL;
|
||||||
static PictureT *_picDoor = NULL;
|
static PictureT *_picEmail = NULL;
|
||||||
static PictureT *_picDOS = NULL;
|
static PictureT *_picForums = NULL;
|
||||||
static PictureT *_picIF = NULL;
|
static PictureT *_picGames = NULL;
|
||||||
static ButtonT *_btnOptions = NULL;
|
static PictureT *_picLogoff = NULL;
|
||||||
static ButtonT *_btnLogoff = NULL;
|
static PictureT *_picProfile = NULL;
|
||||||
|
|
||||||
|
|
||||||
static void btnLogoffClick(WidgetT *widget) {
|
|
||||||
(void)widget;
|
|
||||||
|
|
||||||
setButtons(0);
|
|
||||||
msgBoxTwo("Logoff?", MSGBOX_ICON_QUESTION, "This will disconnect you from the server.", "Okay", btnMsgBoxLogoff, "Cancel", btnMsgBoxLogoff);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void btnMsgBoxLogoff(MsgBoxButtonT button) {
|
static void btnMsgBoxLogoff(MsgBoxButtonT button) {
|
||||||
|
|
||||||
if (button == MSGBOX_BUTTON_ONE) {
|
if (button == MSGBOX_BUTTON_ONE) {
|
||||||
guiDelete(D(_winMenu));
|
guiDelete(D(_picProfile));
|
||||||
|
guiDelete(D(_picLogoff));
|
||||||
|
guiDelete(D(_picGames));
|
||||||
|
guiDelete(D(_picForums));
|
||||||
|
guiDelete(D(_picEmail));
|
||||||
|
guiDelete(D(_picChat));
|
||||||
// ***TODO*** Need a way to close all other windows.
|
// ***TODO*** Need a way to close all other windows.
|
||||||
hangupShow(welcomeShow);
|
hangupShow(welcomeShow);
|
||||||
} else {
|
|
||||||
setButtons(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void btnOptionsClick(WidgetT *widget) {
|
|
||||||
(void)widget;
|
|
||||||
// ***TODO***
|
|
||||||
msgBoxOne("Options", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void menuFilesReady(void) {
|
static void menuFilesReady(void) {
|
||||||
char *dos = strdup(cacheFilenameGet("menu:dosgames.png"));
|
uint16_t x = vbeDisplayWidthGet() - 49;
|
||||||
char *door = strdup(cacheFilenameGet("menu:doorgames.png"));
|
uint16_t y = vbeDisplayHeightGet() - 49;
|
||||||
char *fiction = strdup(cacheFilenameGet("menu:interactivefiction.png"));
|
|
||||||
|
|
||||||
TagItemT uiMenu[] = {
|
_picLogoff = pictureNew(x, y, cacheFilenameGet("menu:48logoff.png"));
|
||||||
T_START,
|
pictureClickHandlerSet(_picLogoff, picLogoffClick);
|
||||||
T_WINDOW, O(_winMenu),
|
guiAttach(guiRootGet(), W(_picLogoff));
|
||||||
T_TITLE, P("KangaWorld Main Menu"),
|
x -= 49;
|
||||||
T_X, vbeDisplayWidthGet() - 360, T_Y, vbeDisplayHeightGet() - 285,
|
|
||||||
T_WIDTH, 350, T_HEIGHT, 275,
|
|
||||||
|
|
||||||
T_PICTURE, O(_picDOS),
|
_picForums = pictureNew(x, y, cacheFilenameGet("menu:48forums.png"));
|
||||||
T_FILENAME, P(dos),
|
pictureClickHandlerSet(_picForums, picForumsClick);
|
||||||
T_X, 18, T_Y, 18,
|
guiAttach(guiRootGet(), W(_picForums));
|
||||||
T_PICTURE, T_DONE,
|
x -= 49;
|
||||||
|
|
||||||
T_PICTURE, O(_picDoor),
|
_picEmail = pictureNew(x, y, cacheFilenameGet("menu:48email.png"));
|
||||||
T_FILENAME, P(door),
|
pictureClickHandlerSet(_picEmail, picEmailClick);
|
||||||
T_X, 18, T_Y, 77,
|
guiAttach(guiRootGet(), W(_picEmail));
|
||||||
T_CLICK, P(picDoorClick),
|
x -= 49;
|
||||||
T_PICTURE, T_DONE,
|
|
||||||
|
|
||||||
T_PICTURE, O(_picIF),
|
_picGames = pictureNew(x, y, cacheFilenameGet("menu:48games.png"));
|
||||||
T_FILENAME, P(fiction),
|
pictureClickHandlerSet(_picGames, picGamesClick);
|
||||||
T_X, 18, T_Y, 136,
|
guiAttach(guiRootGet(), W(_picGames));
|
||||||
T_PICTURE, T_DONE,
|
x -= 49;
|
||||||
|
|
||||||
T_BUTTON, O(_btnOptions),
|
_picChat = pictureNew(x, y, cacheFilenameGet("menu:48chat.png"));
|
||||||
T_TITLE, P("Options"),
|
pictureClickHandlerSet(_picChat, picChatClick);
|
||||||
T_X, 23, T_Y, 202,
|
guiAttach(guiRootGet(), W(_picChat));
|
||||||
T_CLICK, P(btnOptionsClick),
|
x -= 49;
|
||||||
T_BUTTON, T_DONE,
|
|
||||||
|
|
||||||
T_BUTTON, O(_btnLogoff),
|
_picProfile = pictureNew(x, y, cacheFilenameGet("menu:48profile.png"));
|
||||||
T_TITLE, P("Logoff"),
|
pictureClickHandlerSet(_picProfile, picProfileClick);
|
||||||
T_X, 245, T_Y, 202,
|
guiAttach(guiRootGet(), W(_picProfile));
|
||||||
T_CLICK, P(btnLogoffClick),
|
|
||||||
T_BUTTON, T_DONE,
|
|
||||||
|
|
||||||
T_WINDOW, T_DONE,
|
|
||||||
T_END
|
|
||||||
};
|
|
||||||
|
|
||||||
tagListRun(uiMenu);
|
|
||||||
|
|
||||||
DEL(fiction);
|
|
||||||
DEL(door);
|
|
||||||
DEL(dos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void menuShow(void) {
|
void menuShow(void) {
|
||||||
char *fileList[] = {
|
char *fileList[] = {
|
||||||
"menu:dosgames.png",
|
"menu:48chat.png",
|
||||||
"menu:doorgames.png",
|
"menu:48email.png",
|
||||||
"menu:interactivefiction.png",
|
"menu:48forums.png",
|
||||||
|
"menu:48games.png",
|
||||||
|
"menu:48logoff.png",
|
||||||
|
"menu:48profile.png",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
fileCacheCheck(menuFilesReady, fileList);
|
fileCacheCheck(menuFilesReady, fileList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void picDoorClick(WidgetT *widget) {
|
static void picChatClick(WidgetT *widget) {
|
||||||
|
(void)widget;
|
||||||
|
// ***TODO***
|
||||||
|
msgBoxOne("Chat", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void setButtons(uint8_t enabled) {
|
static void picEmailClick(WidgetT *widget) {
|
||||||
// ***TODO*** This should disable the entire dialog instead of just the buttons. Need to finish the Enable GUI code first.
|
(void)widget;
|
||||||
widgetEnableSet(W(_btnOptions), enabled);
|
// ***TODO***
|
||||||
widgetEnableSet(W(_btnLogoff), enabled);
|
msgBoxOne("E-Mail", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void picForumsClick(WidgetT *widget) {
|
||||||
|
(void)widget;
|
||||||
|
// ***TODO***
|
||||||
|
msgBoxOne("Forums", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void picGamesClick(WidgetT *widget) {
|
||||||
|
(void)widget;
|
||||||
|
// ***TODO***
|
||||||
|
msgBoxOne("Games", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void picLogoffClick(WidgetT *widget) {
|
||||||
|
(void)widget;
|
||||||
|
msgBoxTwo("Logoff?", MSGBOX_ICON_QUESTION, "This will disconnect you from the server.", "Okay", btnMsgBoxLogoff, "Cancel", btnMsgBoxLogoff);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void picProfileClick(WidgetT *widget) {
|
||||||
|
(void)widget;
|
||||||
|
// ***TODO***
|
||||||
|
msgBoxOne("Options", MSGBOX_ICON_MESSAGE, "Yeah, this doesn't do anything yet.", "Okay", NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -262,7 +262,7 @@ void signupShow(void) {
|
||||||
static void timSignUpProgress(WidgetT *widget) {
|
static void timSignUpProgress(WidgetT *widget) {
|
||||||
PacketEncodeDataT encoded;
|
PacketEncodeDataT encoded;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
char *packetData;
|
uint8_t *packetData;
|
||||||
TimerT *t = (TimerT *)widget;
|
TimerT *t = (TimerT *)widget;
|
||||||
|
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
|
|
|
@ -18,9 +18,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
// ***TODO*** Maybe add a cacheFOpen() and cacheFClose() for reading and writing directly to virtual pathnames?
|
|
||||||
|
|
||||||
|
|
||||||
#include "thirdparty/SHA256/sha256.h"
|
#include "thirdparty/SHA256/sha256.h"
|
||||||
|
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
|
|
@ -22,10 +22,10 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
||||||
void comPacketSender(char *data, uint32_t length, void *userData) {
|
void comPacketSender(uint8_t *data, uint32_t length, void *userData) {
|
||||||
(void)userData;
|
(void)userData;
|
||||||
|
|
||||||
comWrite(__configData.serialCom - 1, data, length);
|
comWrite(__configData.serialCom - 1, (char *)data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,67 +39,3 @@ int comReceiveBufferFlush(int com) {
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
TASKBEGIN(comWaitWithTimeout)
|
|
||||||
int32_t r;
|
|
||||||
uint32_t quarterTicks;
|
|
||||||
int32_t count;
|
|
||||||
int32_t bufferIndex;
|
|
||||||
char incoming[2];
|
|
||||||
ComWaitWithTimeoutT *args;
|
|
||||||
|
|
||||||
taskCode({
|
|
||||||
// Returns number of bytes read into buffer.
|
|
||||||
// Value is positive if "expect" was found.
|
|
||||||
// Value is negative if not found.
|
|
||||||
|
|
||||||
logWrite("Entering comWaitWithTimeout\n");
|
|
||||||
|
|
||||||
self->args = (ComWaitWithTimeoutT *)data;
|
|
||||||
|
|
||||||
while (self->quarterTicks <= self->args->quarterSeconds) {
|
|
||||||
|
|
||||||
// logWrite("Calling comRead\n");
|
|
||||||
self->r = comRead(self->args->com, self->incoming, 1);
|
|
||||||
// logWrite("Back from comRead with %d\n", self->r);
|
|
||||||
|
|
||||||
if (self->r == 1) {
|
|
||||||
self->args->buffer[self->bufferIndex++] = self->incoming[0];
|
|
||||||
self->args->buffer[self->bufferIndex] = 0;
|
|
||||||
if (self->incoming[0] == self->args->expecting[self->count]) {
|
|
||||||
self->count++;
|
|
||||||
if (self->count == (int)strlen(self->args->expecting)) {
|
|
||||||
// Found our expect.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self->count = 0;
|
|
||||||
}
|
|
||||||
if (self->bufferIndex == self->args->len - 1) {
|
|
||||||
// Out of buffer.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// logWrite("Yielding from comWaitWithTimeout\n");
|
|
||||||
taskYield();
|
|
||||||
// logWrite("Back in comWaitWithTimeout\n");
|
|
||||||
|
|
||||||
if (__timerQuarterSecondTick) {
|
|
||||||
self->quarterTicks++;
|
|
||||||
logWrite("Tick\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logWrite("Exiting comWaitWithTimeout\n");
|
|
||||||
|
|
||||||
if (self->count == (int)strlen(self->args->expecting)) {
|
|
||||||
self->args->result = self->bufferIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->args->result = -self->bufferIndex;
|
|
||||||
});
|
|
||||||
TASKEND
|
|
||||||
*/
|
|
||||||
|
|
|
@ -26,16 +26,6 @@
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct ComWaitWithTimeoutS {
|
|
||||||
int32_t result;
|
|
||||||
uint8_t com;
|
|
||||||
char *buffer;
|
|
||||||
int32_t len;
|
|
||||||
uint32_t quarterSeconds;
|
|
||||||
char *expecting;
|
|
||||||
} ComWaitWithTimeoutT;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
|
||||||
#define SER_SUCCESS 0
|
#define SER_SUCCESS 0
|
||||||
|
@ -62,7 +52,7 @@ int comWrite(int com, const char *data, int len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void comPacketSender(char *data, uint32_t length, void *userData);
|
void comPacketSender(uint8_t *data, uint32_t length, void *userData);
|
||||||
int comReceiveBufferFlush(int com);
|
int comReceiveBufferFlush(int com);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -104,19 +104,21 @@ void netPacketHandlerStop(void) {
|
||||||
|
|
||||||
void netProcess(void) {
|
void netProcess(void) {
|
||||||
int32_t r;
|
int32_t r;
|
||||||
char buffer[1024];
|
uint8_t buffer[1024];
|
||||||
PacketDecodeDataT *packet;
|
PacketDecodeDataT *packet;
|
||||||
PacketDecodeDataT decoded;
|
PacketDecodeDataT decoded;
|
||||||
PacketEncodeDataT encoded;
|
PacketEncodeDataT encoded;
|
||||||
|
|
||||||
// ***TODO*** Detect disconnection. Maybe have callbacks registered that can notify tasks?
|
// ***TODO*** Detect disconnection. Maybe have callbacks registered that can notify open windows?
|
||||||
|
|
||||||
if (_netRunning) {
|
if (_netRunning) {
|
||||||
|
|
||||||
// Read pending bytes.
|
// Read pending bytes.
|
||||||
r = comRead(__configData.serialCom - 1, buffer, 1024);
|
r = comRead(__configData.serialCom - 1, (char *)buffer, 1024);
|
||||||
// New data or not, process anything in the queue.
|
// New data or not, process anything in the queue.
|
||||||
if (packetDecode(__packetThreadData, &decoded, buffer, r)) {
|
if (packetDecode(__packetThreadData, &decoded, buffer, r)) {
|
||||||
|
//logWrite("Packet In: %d\n", decoded.packetType);
|
||||||
|
//packetDebugPrint((uint8_t *)decoded.data, decoded.length);
|
||||||
switch (decoded.packetType) {
|
switch (decoded.packetType) {
|
||||||
case PACKET_TYPE_PING:
|
case PACKET_TYPE_PING:
|
||||||
// Reply with PONG
|
// Reply with PONG
|
||||||
|
@ -139,7 +141,7 @@ void netProcess(void) {
|
||||||
packet->channel = decoded.channel;
|
packet->channel = decoded.channel;
|
||||||
packet->length = decoded.length;
|
packet->length = decoded.length;
|
||||||
packet->packetType = decoded.packetType;
|
packet->packetType = decoded.packetType;
|
||||||
packet->data = (char *)malloc(decoded.length);
|
packet->data = (uint8_t *)malloc(decoded.length);
|
||||||
memcpy(packet->data, decoded.data, decoded.length);
|
memcpy(packet->data, decoded.data, decoded.length);
|
||||||
// Send it to the subscriber.
|
// Send it to the subscriber.
|
||||||
_systemHandlers[r](packet);
|
_systemHandlers[r](packet);
|
||||||
|
@ -153,7 +155,7 @@ void netProcess(void) {
|
||||||
packet->channel = decoded.channel;
|
packet->channel = decoded.channel;
|
||||||
packet->length = decoded.length;
|
packet->length = decoded.length;
|
||||||
packet->packetType = decoded.packetType;
|
packet->packetType = decoded.packetType;
|
||||||
packet->data = (char *)malloc(decoded.length);
|
packet->data = (uint8_t *)malloc(decoded.length);
|
||||||
memcpy(packet->data, decoded.data, decoded.length);
|
memcpy(packet->data, decoded.data, decoded.length);
|
||||||
// Send it to the subscriber.
|
// Send it to the subscriber.
|
||||||
_channels[r].value(packet);
|
_channels[r].value(packet);
|
||||||
|
|
|
@ -149,7 +149,7 @@ static void packetHandler(PacketDecodeDataT *packet) {
|
||||||
shdel(__runtimeData.strings, packet->data);
|
shdel(__runtimeData.strings, packet->data);
|
||||||
}
|
}
|
||||||
// Store in string table.
|
// Store in string table.
|
||||||
shput(__runtimeData.strings, packet->data, strdup(&packet->data[strlen(packet->data) + 1]));
|
shput(__runtimeData.strings, packet->data, strdup((char *)&packet->data[strlen((char *)packet->data) + 1]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PACKET_TYPE_VERSION:
|
case PACKET_TYPE_VERSION:
|
||||||
|
@ -195,10 +195,10 @@ static void settingsFinished(WidgetT *widget) {
|
||||||
|
|
||||||
void welcomeShow(void) {
|
void welcomeShow(void) {
|
||||||
|
|
||||||
char *logo = strdup(cacheFilenameGet("system:logo"));
|
char *logo = strdup(cacheFilenameGet("welcome:logo.png"));
|
||||||
char *init = strdup(cacheFilenameGet("system:init"));
|
char *init = strdup(cacheFilenameGet("welcome:init.png"));
|
||||||
char *dial = strdup(cacheFilenameGet("system:dialing"));
|
char *dial = strdup(cacheFilenameGet("welcome:dialing.png"));
|
||||||
char *conn = strdup(cacheFilenameGet("system:connect"));
|
char *conn = strdup(cacheFilenameGet("welcome:connect.png"));
|
||||||
|
|
||||||
// 450x128 logo
|
// 450x128 logo
|
||||||
|
|
||||||
|
@ -300,7 +300,7 @@ static void timWelcomeProgress(WidgetT *widget) {
|
||||||
|
|
||||||
case S_INIT_MODEM:
|
case S_INIT_MODEM:
|
||||||
// Just read anything to clear the buffer.
|
// Just read anything to clear the buffer.
|
||||||
len = comRead(__configData.serialCom - 1, buffer, 1023);
|
comRead(__configData.serialCom - 1, buffer, 1023);
|
||||||
// Send actual init
|
// Send actual init
|
||||||
snprintf(buffer, 1023, "%s%c", "AT+SOCK1", 13);
|
snprintf(buffer, 1023, "%s%c", "AT+SOCK1", 13);
|
||||||
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));
|
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));
|
||||||
|
|
|
@ -38,10 +38,8 @@ INCLUDEPATH += \
|
||||||
HEADERS = \
|
HEADERS = \
|
||||||
$$SHARED/stddclmr.h \
|
$$SHARED/stddclmr.h \
|
||||||
$$SHARED/thirdparty/memwatch/memwatch.h \
|
$$SHARED/thirdparty/memwatch/memwatch.h \
|
||||||
$$SHARED/thirdparty/stb_image.h \
|
$$SHARED/thirdparty/stb_image.h
|
||||||
$$GUI/font.h
|
|
||||||
|
|
||||||
SOURCES = \
|
SOURCES = \
|
||||||
$$SHARED/thirdparty/memwatch/memwatch.c \
|
$$SHARED/thirdparty/memwatch/memwatch.c \
|
||||||
$$GUI/font.c \
|
|
||||||
src/main.c
|
src/main.c
|
||||||
|
|
|
@ -27,54 +27,10 @@
|
||||||
#define STBI_ONLY_PNG
|
#define STBI_ONLY_PNG
|
||||||
#include "stb_image.h"
|
#include "stb_image.h"
|
||||||
|
|
||||||
#include "font.h"
|
|
||||||
#include "stddclmr.h"
|
#include "stddclmr.h"
|
||||||
|
|
||||||
|
|
||||||
void drawChar(FontT *font, char c);
|
|
||||||
void makeFont(char *source, char *target, int pixelsW, int pixelsH, int charsW, int charCount);
|
void makeFont(char *source, char *target, int pixelsW, int pixelsH, int charsW, int charCount);
|
||||||
void test(char *fontfile);
|
|
||||||
|
|
||||||
|
|
||||||
void drawChar(FontT *font, char c) {
|
|
||||||
uint8_t cx;
|
|
||||||
uint8_t cy;
|
|
||||||
uint16_t offset;
|
|
||||||
uint8_t yl;
|
|
||||||
uint8_t data;
|
|
||||||
uint8_t odd;
|
|
||||||
uint16_t t;
|
|
||||||
|
|
||||||
// Find character position in font grid.
|
|
||||||
cx = c % font->span;
|
|
||||||
cy = c / font->span;
|
|
||||||
|
|
||||||
// Which half of the byte do we want?
|
|
||||||
odd = ((cx & 1) == 1);
|
|
||||||
|
|
||||||
// Find offset byte based on font bits.
|
|
||||||
offset = cy * (font->span / 2) * font->height;
|
|
||||||
t = cx * ((float)font->width / 8.0f);
|
|
||||||
offset += t;
|
|
||||||
|
|
||||||
for (yl=0; yl<font->height; yl++) {
|
|
||||||
data = font->bits[offset];
|
|
||||||
offset += (font->span / 2);
|
|
||||||
|
|
||||||
if (odd) {
|
|
||||||
printf("%c", data & 0x08 ? '#' : ' ');
|
|
||||||
printf("%c", data & 0x04 ? '#' : ' ');
|
|
||||||
printf("%c", data & 0x02 ? '#' : ' ');
|
|
||||||
printf("%c", data & 0x01 ? '#' : ' ');
|
|
||||||
} else {
|
|
||||||
printf("%c", data & 0x80 ? '#' : ' ');
|
|
||||||
printf("%c", data & 0x40 ? '#' : ' ');
|
|
||||||
printf("%c", data & 0x20 ? '#' : ' ');
|
|
||||||
printf("%c", data & 0x10 ? '#' : ' ');
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void makeFont(char *source, char *target, int pixelsW, int pixelsH, int charsW, int charCount) {
|
void makeFont(char *source, char *target, int pixelsW, int pixelsH, int charsW, int charCount) {
|
||||||
|
@ -125,15 +81,6 @@ void makeFont(char *source, char *target, int pixelsW, int pixelsH, int charsW,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void test(char *fontfile) {
|
|
||||||
FontT *font = fontLoad(fontfile);
|
|
||||||
printf("Solid Smile\n"); drawChar(font, 0x02);
|
|
||||||
printf("Question Mark\n"); drawChar(font, '?');
|
|
||||||
printf("x\n"); drawChar(font, 'x');
|
|
||||||
fontUnload(&font);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
(void)argc;
|
(void)argc;
|
||||||
(void)argv;
|
(void)argv;
|
||||||
|
@ -143,7 +90,5 @@ int main(int argc, char *argv[]) {
|
||||||
makeFont("/home/scott/code/kpmpgsmkii/font/in/vga8x14.png", "/home/scott/code/kpmpgsmkii/font/out/vga8x14.dat", 8, 14, 16, 256);
|
makeFont("/home/scott/code/kpmpgsmkii/font/in/vga8x14.png", "/home/scott/code/kpmpgsmkii/font/out/vga8x14.dat", 8, 14, 16, 256);
|
||||||
makeFont("/home/scott/code/kpmpgsmkii/font/in/vga8x16.png", "/home/scott/code/kpmpgsmkii/font/out/vga8x16.dat", 8, 16, 16, 256);
|
makeFont("/home/scott/code/kpmpgsmkii/font/in/vga8x16.png", "/home/scott/code/kpmpgsmkii/font/out/vga8x16.dat", 8, 16, 16, 256);
|
||||||
|
|
||||||
test("/home/scott/code/kpmpgsmkii/font/out/vga4x8.dat");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,11 +20,11 @@
|
||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
CONFIG *= ORDERED
|
CONFIG *= ORDERED
|
||||||
|
|
||||||
SUBDIRS = \
|
#SUBDIRS = \
|
||||||
# client \
|
# client \
|
||||||
# server
|
# server
|
||||||
# precache
|
# precache
|
||||||
font
|
# font
|
||||||
# primes
|
# primes
|
||||||
|
|
||||||
OTHER_FILES = \
|
OTHER_FILES = \
|
||||||
|
|
|
@ -27,6 +27,7 @@ SYSTEM = $$CLIENT/system
|
||||||
THIRDP = $$CLIENT/thirdparty
|
THIRDP = $$CLIENT/thirdparty
|
||||||
|
|
||||||
INCLUDEPATH += \
|
INCLUDEPATH += \
|
||||||
|
$$CLIENT \
|
||||||
$$SHARED \
|
$$SHARED \
|
||||||
$$SHARED/thirdparty \
|
$$SHARED/thirdparty \
|
||||||
$$SYSTEM \
|
$$SYSTEM \
|
||||||
|
|
|
@ -28,21 +28,25 @@
|
||||||
#include "stddclmr.h"
|
#include "stddclmr.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define CLIENT "/home/scott/code/kpmpgsmkii/client/in/"
|
||||||
|
#define FONT "/home/scott/code/kpmpgsmkii/font/out/"
|
||||||
|
#define OUT "/home/scott/code/kpmpgsmkii/precache/out/"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
CachePreMakeListT list[] = {
|
CachePreMakeListT list[] = {
|
||||||
{ "dconnect.png", "system:connect" },
|
{ CLIENT"welcome/dconnect.png", "welcome:connect.png" },
|
||||||
{ "ddialing.png", "system:dialing" },
|
{ CLIENT"welcome/ddialing.png", "welcome:dialing.png" },
|
||||||
{ "dinit.png", "system:init" },
|
{ CLIENT"welcome/dinit.png", "welcome:init.png" },
|
||||||
{ "logo.png", "system:logo" },
|
{ CLIENT"welcome/logo.png", "welcome:logo.png" },
|
||||||
{ "mbie32.png", "system:exclamation" },
|
{ CLIENT"gui/mbie32.png", "gui:exclamation.png" },
|
||||||
{ "mbii32.png", "system:information" },
|
{ CLIENT"gui/mbii32.png", "gui:information.png" },
|
||||||
{ "mbim32.png", "system:message" },
|
{ CLIENT"gui/mbim32.png", "gui:message.png" },
|
||||||
{ "mbiq32.png", "system:question" },
|
{ CLIENT"gui/mbiq32.png", "gui:question.png" },
|
||||||
{ "mbiw32.png", "system:warning" },
|
{ CLIENT"gui/mbiw32.png", "gui:warning.png" },
|
||||||
{ "mouse.png", "system:mouse" },
|
{ CLIENT"gui/mouse.png", "gui:mouse.png" },
|
||||||
{ "vga8x14.dat", "system:vga8x14" },
|
{ FONT"vga8x14.dat", "gui:vga8x14.dat" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
(void)argc;
|
(void)argc;
|
||||||
|
@ -50,8 +54,8 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
// Also run optipng -o7 on images.
|
// Also run optipng -o7 on images.
|
||||||
|
|
||||||
cachePrePack("client.pre", list);
|
cachePrePack(OUT"client.pre", list);
|
||||||
cachePreUnpack("client.pre");
|
cachePreUnpack(OUT"client.pre");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ static uint8_t clientDequeuePacket(ClientThreadT *client);
|
||||||
|
|
||||||
static uint8_t clientDequeuePacket(ClientThreadT *client) {
|
static uint8_t clientDequeuePacket(ClientThreadT *client) {
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
char *data = NULL;
|
uint8_t *data = NULL;
|
||||||
PacketDecodeDataT decode = { 0 };
|
PacketDecodeDataT decode = { 0 };
|
||||||
ClientRawPacketT *packet = NULL;
|
ClientRawPacketT *packet = NULL;
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ void clientQueuePacket(ClientThreadT *client, uint8_t *data, uint32_t length) {
|
||||||
|
|
||||||
packet = (ClientRawPacketT *)malloc(sizeof(ClientRawPacketT));
|
packet = (ClientRawPacketT *)malloc(sizeof(ClientRawPacketT));
|
||||||
if (packet) {
|
if (packet) {
|
||||||
packet->data = (char *)malloc(length);
|
packet->data = (uint8_t *)malloc(length);
|
||||||
if (packet->data) {
|
if (packet->data) {
|
||||||
memcpy(packet->data, data, length);
|
memcpy(packet->data, data, length);
|
||||||
packet->length = length;
|
packet->length = length;
|
||||||
|
@ -125,7 +125,7 @@ void *clientThread(void *data) {
|
||||||
time_t ticks = { 0 };
|
time_t ticks = { 0 };
|
||||||
time_t lastTicks = { 0 };
|
time_t lastTicks = { 0 };
|
||||||
int8_t pingTimeout = 0;
|
int8_t pingTimeout = 0;
|
||||||
char *packetData = NULL;
|
uint8_t *packetData = NULL;
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
|
|
||||||
// Process packets until we're done.
|
// Process packets until we're done.
|
||||||
|
@ -174,6 +174,7 @@ void *clientThread(void *data) {
|
||||||
// ***TODO*** Write ping stats to database.
|
// ***TODO*** Write ping stats to database.
|
||||||
|
|
||||||
// Clean up client data on the way out.
|
// Clean up client data on the way out.
|
||||||
|
// ***TODO*** valgrind says this isn't working.
|
||||||
while (arrlen(client->packetQueue) > 0) {
|
while (arrlen(client->packetQueue) > 0) {
|
||||||
if (client->packetQueue[0]->data) DEL(client->packetQueue[0]->data);
|
if (client->packetQueue[0]->data) DEL(client->packetQueue[0]->data);
|
||||||
arrdel(client->packetQueue, 0);
|
arrdel(client->packetQueue, 0);
|
||||||
|
@ -185,6 +186,9 @@ void *clientThread(void *data) {
|
||||||
|
|
||||||
if (client->handle) fclose(client->handle);
|
if (client->handle) fclose(client->handle);
|
||||||
|
|
||||||
|
peer = client->peer;
|
||||||
|
peer->data = NULL;
|
||||||
|
|
||||||
DEL(client);
|
DEL(client);
|
||||||
|
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
|
|
||||||
typedef struct ClientRawPacketS {
|
typedef struct ClientRawPacketS {
|
||||||
char *data;
|
uint8_t *data;
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
} ClientRawPacketT;
|
} ClientRawPacketT;
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ static void clientApiFileRequestNext(ClientThreadT *client, PacketDecodeDataT *d
|
||||||
void clientApiFileRequest(ClientThreadT *client, PacketDecodeDataT *data) {
|
void clientApiFileRequest(ClientThreadT *client, PacketDecodeDataT *data) {
|
||||||
FileRequestsT request = 0;
|
FileRequestsT request = 0;
|
||||||
PacketEncodeDataT encoded = { 0 };
|
PacketEncodeDataT encoded = { 0 };
|
||||||
char *packetData = NULL;
|
uint8_t *packetData = NULL;
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
|
|
||||||
// Must be logged in to do file operations.
|
// Must be logged in to do file operations.
|
||||||
|
@ -73,7 +73,7 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
|
||||||
char *path = NULL;
|
char *path = NULL;
|
||||||
char *sha256 = NULL;
|
char *sha256 = NULL;
|
||||||
PacketEncodeDataT encoded = { 0 };
|
PacketEncodeDataT encoded = { 0 };
|
||||||
char *packetData = NULL;
|
uint8_t *packetData = NULL;
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
char shaInDB[128] = { 0 };
|
char shaInDB[128] = { 0 };
|
||||||
char buffer[1024] = { 0 };
|
char buffer[1024] = { 0 };
|
||||||
|
@ -115,6 +115,8 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
|
||||||
client->handle = fopen(buffer2, "rb");
|
client->handle = fopen(buffer2, "rb");
|
||||||
if (!client->handle) {
|
if (!client->handle) {
|
||||||
logWrite("Unable to open [%s]\n", buffer2);
|
logWrite("Unable to open [%s]\n", buffer2);
|
||||||
|
DEL(sha256);
|
||||||
|
DEL(path);
|
||||||
// ***TODO*** Handle error
|
// ***TODO*** Handle error
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -133,8 +135,12 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
|
||||||
encoded.encrypt = 0;
|
encoded.encrypt = 0;
|
||||||
packetEncode(client->packetThreadData, &encoded, packetData, length);
|
packetEncode(client->packetThreadData, &encoded, packetData, length);
|
||||||
packetSend(client->packetThreadData, &encoded);
|
packetSend(client->packetThreadData, &encoded);
|
||||||
|
//packetDebugPrint((uint8_t *)encoded.dataPointer, encoded.length);
|
||||||
DEL(packetData);
|
DEL(packetData);
|
||||||
|
|
||||||
|
DEL(sha256);
|
||||||
|
DEL(path);
|
||||||
|
|
||||||
// Start sending actual file data.
|
// Start sending actual file data.
|
||||||
clientApiFileRequestNext(client, data);
|
clientApiFileRequestNext(client, data);
|
||||||
}
|
}
|
||||||
|
@ -145,7 +151,7 @@ static void clientApiFileRequestNext(ClientThreadT *client, PacketDecodeDataT *d
|
||||||
uint32_t temp = 0;
|
uint32_t temp = 0;
|
||||||
PacketEncodeDataT encoded = { 0 };
|
PacketEncodeDataT encoded = { 0 };
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
char packetData[PACKET_MAX];
|
uint8_t packetData[PACKET_MAX];
|
||||||
|
|
||||||
// Do we have an open file?
|
// Do we have an open file?
|
||||||
if (client->handle) {
|
if (client->handle) {
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
|
|
||||||
void clientApiLogin(ClientThreadT *client, PacketDecodeDataT *data) {
|
void clientApiLogin(ClientThreadT *client, PacketDecodeDataT *data) {
|
||||||
char *packetData = NULL;
|
uint8_t *packetData = NULL;
|
||||||
char *user = NULL;
|
char *user = NULL;
|
||||||
char *pass = NULL;
|
char *pass = NULL;
|
||||||
PacketEncodeDataT encoded = { 0 };
|
PacketEncodeDataT encoded = { 0 };
|
||||||
|
|
|
@ -34,7 +34,7 @@ void clientApiSignup(ClientThreadT *client, PacketDecodeDataT *data) {
|
||||||
uint8_t result = 0;
|
uint8_t result = 0;
|
||||||
char *string = NULL;
|
char *string = NULL;
|
||||||
char *buffer = NULL;
|
char *buffer = NULL;
|
||||||
char *packetData = NULL;
|
uint8_t *packetData = NULL;
|
||||||
PacketEncodeDataT encoded = { 0 };
|
PacketEncodeDataT encoded = { 0 };
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ void clientApiVersionOkay(ClientThreadT *client, PacketDecodeDataT *data) {
|
||||||
uint64_t x = 0;
|
uint64_t x = 0;
|
||||||
uint32_t y = 0;
|
uint32_t y = 0;
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
char *buffer = NULL;
|
uint8_t *buffer = NULL;
|
||||||
PacketEncodeDataT encoded = { 0 };
|
PacketEncodeDataT encoded = { 0 };
|
||||||
DBTableT *record = NULL;
|
DBTableT *record = NULL;
|
||||||
DBTableT **table = NULL;
|
DBTableT **table = NULL;
|
||||||
|
@ -50,7 +50,7 @@ void clientApiVersionOkay(ClientThreadT *client, PacketDecodeDataT *data) {
|
||||||
x = strlen(record->name);
|
x = strlen(record->name);
|
||||||
y = strlen(record->data);
|
y = strlen(record->data);
|
||||||
length = x + y + 2;
|
length = x + y + 2;
|
||||||
buffer = (char *)malloc(length);
|
buffer = (uint8_t *)malloc(length);
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
consoleMessageQueue("%ld: Unable to allocate buffer for string packet!\n", client->threadIndex);
|
consoleMessageQueue("%ld: Unable to allocate buffer for string packet!\n", client->threadIndex);
|
||||||
break;
|
break;
|
||||||
|
@ -87,7 +87,7 @@ void clientApiVersionOkay(ClientThreadT *client, PacketDecodeDataT *data) {
|
||||||
x = strlen(record->name);
|
x = strlen(record->name);
|
||||||
y = atol(record->data);
|
y = atol(record->data);
|
||||||
length = x + 5;
|
length = x + 5;
|
||||||
buffer = (char *)malloc(length);
|
buffer = (uint8_t *)malloc(length);
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
consoleMessageQueue("%ld: Unable to allocate buffer for number packet!\n", client->threadIndex);
|
consoleMessageQueue("%ld: Unable to allocate buffer for number packet!\n", client->threadIndex);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -36,7 +36,7 @@ static uint32_t _serverClients = 0;
|
||||||
static pthread_mutex_t _serverMutex = { 0 };
|
static pthread_mutex_t _serverMutex = { 0 };
|
||||||
|
|
||||||
|
|
||||||
static void serverPacketSender(char *data, uint32_t length, void *userData);
|
static void serverPacketSender(uint8_t *data, uint32_t length, void *userData);
|
||||||
|
|
||||||
|
|
||||||
void serverDisconnectClient(ClientThreadT *client) {
|
void serverDisconnectClient(ClientThreadT *client) {
|
||||||
|
@ -59,7 +59,7 @@ void serverDisconnectClient(ClientThreadT *client) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void serverPacketSender(char *data, uint32_t length, void *userData) {
|
static void serverPacketSender(uint8_t *data, uint32_t length, void *userData) {
|
||||||
ENetPeer *peer = (ENetPeer *)userData;
|
ENetPeer *peer = (ENetPeer *)userData;
|
||||||
ENetPacket *packet = NULL;
|
ENetPacket *packet = NULL;
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ static uint8_t _encryptionReady = 0;
|
||||||
|
|
||||||
|
|
||||||
static void *packetAesContextCreate(uint8_t *key, uint8_t *iv);
|
static void *packetAesContextCreate(uint8_t *key, uint8_t *iv);
|
||||||
static uint8_t packetCRC(char *data, uint16_t length, uint8_t startAt);
|
static uint8_t packetCRC(uint8_t *data, uint16_t length, uint8_t startAt);
|
||||||
static uint16_t packetDHCompute(uint32_t a, uint32_t m, uint32_t n);
|
static uint16_t packetDHCompute(uint32_t a, uint32_t m, uint32_t n);
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,10 +73,10 @@ static void *packetAesContextCreate(uint8_t *key, uint8_t *iv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char *packetContentPack(uint16_t *length, char *format, ...) {
|
uint8_t *packetContentPack(uint16_t *length, char *format, ...) {
|
||||||
va_list args = { 0 };
|
va_list args = { 0 };
|
||||||
static char work[PACKET_MAX] = { 0 };
|
static char work[PACKET_MAX] = { 0 };
|
||||||
char *result = NULL;
|
uint8_t *result = NULL;
|
||||||
char *buffer = NULL;
|
char *buffer = NULL;
|
||||||
int32_t value32 = 0;
|
int32_t value32 = 0;
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ char *packetContentPack(uint16_t *length, char *format, ...) {
|
||||||
|
|
||||||
// Copy working buffer to result to return.
|
// Copy working buffer to result to return.
|
||||||
if (*length > 0) {
|
if (*length > 0) {
|
||||||
result = (char *)malloc(*length);
|
result = (uint8_t *)malloc(*length);
|
||||||
memcpy(result, work, *length);
|
memcpy(result, work, *length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ char *packetContentPack(uint16_t *length, char *format, ...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void packetContentUnpack(char *buffer, char *format, ...) {
|
void packetContentUnpack(uint8_t *buffer, char *format, ...) {
|
||||||
va_list args = { 0 };
|
va_list args = { 0 };
|
||||||
char **string = NULL;
|
char **string = NULL;
|
||||||
int32_t *value32 = NULL;
|
int32_t *value32 = NULL;
|
||||||
|
@ -140,7 +140,7 @@ void packetContentUnpack(char *buffer, char *format, ...) {
|
||||||
// Copy string including the terminating zero.
|
// Copy string including the terminating zero.
|
||||||
string = va_arg(args, char **);
|
string = va_arg(args, char **);
|
||||||
if (&buffer[length] != NULL) {
|
if (&buffer[length] != NULL) {
|
||||||
*string = strdup(&buffer[length]);
|
*string = strdup((const char *)&buffer[length]);
|
||||||
length += strlen(*string) + 1;
|
length += strlen(*string) + 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -156,7 +156,7 @@ void packetContentUnpack(char *buffer, char *format, ...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static uint8_t packetCRC(char *data, uint16_t length, uint8_t startAt) {
|
static uint8_t packetCRC(uint8_t *data, uint16_t length, uint8_t startAt) {
|
||||||
uint16_t x = 0;
|
uint16_t x = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -191,7 +191,7 @@ void packetDebugPrint(uint8_t *data, uint16_t length) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeData, char *input, uint16_t inputLength) {
|
uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeData, uint8_t *input, uint16_t inputLength) {
|
||||||
//uint8_t sequence = 0;
|
//uint8_t sequence = 0;
|
||||||
uint16_t unpadded = 0;
|
uint16_t unpadded = 0;
|
||||||
int32_t x = 0;
|
int32_t x = 0;
|
||||||
|
@ -304,7 +304,7 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
|
||||||
|
|
||||||
// Copy packet data to new buffer, if any.
|
// Copy packet data to new buffer, if any.
|
||||||
if (threadData->length - 4 > 0) {
|
if (threadData->length - 4 > 0) {
|
||||||
decodeData->data = (char *)malloc(threadData->length - 4); // 4 for 3 byte header and 1 byte CRC.
|
decodeData->data = (uint8_t *)malloc(threadData->length - 4); // 4 for 3 byte header and 1 byte CRC.
|
||||||
if (!decodeData) continue;
|
if (!decodeData) continue;
|
||||||
memcpy(decodeData->data, &threadData->decodeBuffer[3], threadData->length - 4); // Skip header and CRC.
|
memcpy(decodeData->data, &threadData->decodeBuffer[3], threadData->length - 4); // Skip header and CRC.
|
||||||
decodeData->length = threadData->length - 4;
|
decodeData->length = threadData->length - 4;
|
||||||
|
@ -316,6 +316,9 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
|
||||||
// Fix length to remove header and checksum.
|
// Fix length to remove header and checksum.
|
||||||
threadData->length -= 4;
|
threadData->length -= 4;
|
||||||
|
|
||||||
|
logWrite("Packet In: %d Length: %d\n\r", decodeData->packetType, decodeData->length);
|
||||||
|
//packetDebugPrint((uint8_t *)decodeData->data, decodeData->length);
|
||||||
|
|
||||||
// Is this a DH_REQUEST?
|
// Is this a DH_REQUEST?
|
||||||
if (decodeData->packetType == PACKET_TYPE_DH_REQUEST) {
|
if (decodeData->packetType == PACKET_TYPE_DH_REQUEST) {
|
||||||
memcpy(threadData->dhModulus, decodeData->data, PACKET_ENCRYPT_KEY_SIZE * sizeof(uint16_t));
|
memcpy(threadData->dhModulus, decodeData->data, PACKET_ENCRYPT_KEY_SIZE * sizeof(uint16_t));
|
||||||
|
@ -332,7 +335,7 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
|
||||||
encoded.packetType = PACKET_TYPE_DH_RESPONSE;
|
encoded.packetType = PACKET_TYPE_DH_RESPONSE;
|
||||||
encoded.channel = 0; // Doesn't matter for DH_RESPONSE.
|
encoded.channel = 0; // Doesn't matter for DH_RESPONSE.
|
||||||
encoded.encrypt = 0; // Must be 0 for DH_RESPONSE.
|
encoded.encrypt = 0; // Must be 0 for DH_RESPONSE.
|
||||||
packetEncode(threadData, &encoded, (char *)threadData->dhMyPublic, PACKET_ENCRYPT_KEY_SIZE * sizeof(uint16_t));
|
packetEncode(threadData, &encoded, (uint8_t *)threadData->dhMyPublic, PACKET_ENCRYPT_KEY_SIZE * sizeof(uint16_t));
|
||||||
packetSend(threadData, &encoded);
|
packetSend(threadData, &encoded);
|
||||||
_encryptionReady = 1; // Responding side.
|
_encryptionReady = 1; // Responding side.
|
||||||
continue;
|
continue;
|
||||||
|
@ -411,13 +414,13 @@ static uint16_t packetDHCompute(uint32_t a, uint32_t m, uint32_t n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t packetEncode(PacketThreadDataT *threadData, PacketEncodeDataT *data, char *input, uint16_t length) {
|
uint8_t packetEncode(PacketThreadDataT *threadData, PacketEncodeDataT *data, uint8_t *input, uint16_t length) {
|
||||||
uint16_t x = 0;
|
uint16_t x = 0;
|
||||||
uint8_t crc = 0;
|
uint8_t crc = 0;
|
||||||
uint8_t control = 0;
|
uint8_t control = 0;
|
||||||
uint16_t paddedSize = 0;
|
uint16_t paddedSize = 0;
|
||||||
uint16_t inputLength = 0;
|
uint16_t inputLength = 0;
|
||||||
char *inputBuffer = NULL;
|
uint8_t *inputBuffer = NULL;
|
||||||
|
|
||||||
// Returns 1 on success, 0 on failure.
|
// Returns 1 on success, 0 on failure.
|
||||||
|
|
||||||
|
@ -437,9 +440,9 @@ uint8_t packetEncode(PacketThreadDataT *threadData, PacketEncodeDataT *data, cha
|
||||||
control = (((uint8_t)data->control) << 6) + (data->encrypt << 5) + (data->sequence & 0x1f);
|
control = (((uint8_t)data->control) << 6) + (data->encrypt << 5) + (data->sequence & 0x1f);
|
||||||
|
|
||||||
// Calculate CRC over header bytes.
|
// Calculate CRC over header bytes.
|
||||||
crc = packetCRC((char *)&control, 1, crc);
|
crc = packetCRC(&control, 1, crc);
|
||||||
crc = packetCRC((char *)&data->packetType, 1, crc);
|
crc = packetCRC((uint8_t *)&data->packetType, 1, crc);
|
||||||
crc = packetCRC((char *)&data->channel, 1, crc);
|
crc = packetCRC(&data->channel, 1, crc);
|
||||||
|
|
||||||
// Add header bytes.
|
// Add header bytes.
|
||||||
threadData->encodeBuffer[data->length++] = control;
|
threadData->encodeBuffer[data->length++] = control;
|
||||||
|
@ -462,7 +465,7 @@ uint8_t packetEncode(PacketThreadDataT *threadData, PacketEncodeDataT *data, cha
|
||||||
pkcs7_padding_pad_buffer(threadData->encryptionBuffer, length, paddedSize, 16);
|
pkcs7_padding_pad_buffer(threadData->encryptionBuffer, length, paddedSize, 16);
|
||||||
AES_CBC_encrypt_buffer(threadData->aesContext, threadData->encryptionBuffer, paddedSize);
|
AES_CBC_encrypt_buffer(threadData->aesContext, threadData->encryptionBuffer, paddedSize);
|
||||||
// Encrypted, select proper buffer.
|
// Encrypted, select proper buffer.
|
||||||
inputBuffer = (char *)threadData->encryptionBuffer;
|
inputBuffer = threadData->encryptionBuffer;
|
||||||
inputLength = paddedSize;
|
inputLength = paddedSize;
|
||||||
} else {
|
} else {
|
||||||
// Not encrypted, select proper buffer.
|
// Not encrypted, select proper buffer.
|
||||||
|
@ -521,7 +524,7 @@ void packetEncryptionSetup(PacketThreadDataT *threadData) {
|
||||||
encoded.packetType = PACKET_TYPE_DH_REQUEST;
|
encoded.packetType = PACKET_TYPE_DH_REQUEST;
|
||||||
encoded.channel = 0; // Doesn't matter for DH_REQUEST.
|
encoded.channel = 0; // Doesn't matter for DH_REQUEST.
|
||||||
encoded.encrypt = 0; // Must be 0 for DH_REQUEST.
|
encoded.encrypt = 0; // Must be 0 for DH_REQUEST.
|
||||||
packetEncode(threadData, &encoded, (char *)dhData, PACKET_ENCRYPT_KEY_SIZE * 3 * sizeof(uint16_t));
|
packetEncode(threadData, &encoded, (uint8_t *)dhData, PACKET_ENCRYPT_KEY_SIZE * 3 * sizeof(uint16_t));
|
||||||
packetSend(threadData, &encoded);
|
packetSend(threadData, &encoded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -530,6 +533,8 @@ void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data) {
|
||||||
// Valid control type?
|
// Valid control type?
|
||||||
if (data->control != PACKET_CONTROL_BAD && data->control <= PACKET_CONTROL_COUNT) {
|
if (data->control != PACKET_CONTROL_BAD && data->control <= PACKET_CONTROL_COUNT) {
|
||||||
_packetSender(data->dataPointer, data->length, threadData->senderData);
|
_packetSender(data->dataPointer, data->length, threadData->senderData);
|
||||||
|
logWrite("Packet Out: %d Length: %d\n\r", data->packetType, data->length);
|
||||||
|
//packetDebugPrint((uint8_t *)data->dataPointer, data->length);
|
||||||
} else {
|
} else {
|
||||||
logWrite("Invalid PACKET_CONTROL!\n\r");
|
logWrite("Invalid PACKET_CONTROL!\n\r");
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,10 +40,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define PACKET_MAX 1024 // Maximum number of bytes per packet.
|
#define PACKET_MAX 4096 // Maximum number of bytes per packet.
|
||||||
#define PACKET_SEQUENCE_MAX 32 // Five bits of data, 32 max. Represents size of replay history. Also maximum number of packets on the wire at a time.
|
#define PACKET_SEQUENCE_MAX 32 // Five bits of data, 32 max. Represents size of replay history. Also maximum number of packets on the wire at a time.
|
||||||
|
|
||||||
#define PACKET_INPUT_QUEUE_SIZE 4096
|
#define PACKET_INPUT_QUEUE_SIZE 8192
|
||||||
#define PACKET_BUFFER_SIZE (PACKET_MAX * 2 + 2 + 8) // Worst case, every byte is a PACKET_FRAME. Add two for ending frame. Add 8 for worst case header and CRC.
|
#define PACKET_BUFFER_SIZE (PACKET_MAX * 2 + 2 + 8) // Worst case, every byte is a PACKET_FRAME. Add two for ending frame. Add 8 for worst case header and CRC.
|
||||||
|
|
||||||
#define PACKET_FRAME 0x7e
|
#define PACKET_FRAME 0x7e
|
||||||
|
@ -64,7 +64,7 @@ typedef enum PacketControlE {
|
||||||
typedef struct PacketDecodeDataS {
|
typedef struct PacketDecodeDataS {
|
||||||
// Output
|
// Output
|
||||||
PacketTypeT packetType; // One of PACKET_TYPE_*
|
PacketTypeT packetType; // One of PACKET_TYPE_*
|
||||||
char *data; // Buffer received. MUST FREE.
|
uint8_t *data; // Buffer received. MUST FREE.
|
||||||
uint16_t length; // Length of buffer.
|
uint16_t length; // Length of buffer.
|
||||||
uint8_t channel; // Which data channel it arrived on.
|
uint8_t channel; // Which data channel it arrived on.
|
||||||
} PacketDecodeDataT;
|
} PacketDecodeDataT;
|
||||||
|
@ -78,12 +78,12 @@ typedef struct PacketEncodeDataS {
|
||||||
// Input & Output
|
// Input & Output
|
||||||
uint8_t sequence; // For NAK packets, input the sequence number we missed. Other packets returns the sequence of this packet.
|
uint8_t sequence; // For NAK packets, input the sequence number we missed. Other packets returns the sequence of this packet.
|
||||||
// Output
|
// Output
|
||||||
char *dataPointer; // Buffer ready to send. DO NOT FREE.
|
uint8_t *dataPointer; // Buffer ready to send. DO NOT FREE.
|
||||||
uint16_t length; // Length of buffer.
|
uint16_t length; // Length of buffer.
|
||||||
} PacketEncodeDataT;
|
} PacketEncodeDataT;
|
||||||
|
|
||||||
typedef struct PacketHistoryDataS {
|
typedef struct PacketHistoryDataS {
|
||||||
char data[PACKET_BUFFER_SIZE];
|
uint8_t data[PACKET_BUFFER_SIZE];
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
uint8_t sequence;
|
uint8_t sequence;
|
||||||
} PacketHistoryDataT;
|
} PacketHistoryDataT;
|
||||||
|
@ -96,9 +96,9 @@ typedef struct PacketThreadDataS {
|
||||||
PacketHistoryDataT history[PACKET_SEQUENCE_MAX];
|
PacketHistoryDataT history[PACKET_SEQUENCE_MAX];
|
||||||
uint8_t historyPosition;
|
uint8_t historyPosition;
|
||||||
*/
|
*/
|
||||||
char decodeBuffer[PACKET_MAX];
|
uint8_t decodeBuffer[PACKET_MAX];
|
||||||
char encodeBuffer[PACKET_BUFFER_SIZE];
|
uint8_t encodeBuffer[PACKET_BUFFER_SIZE];
|
||||||
char decodeQueue[PACKET_INPUT_QUEUE_SIZE];
|
uint8_t decodeQueue[PACKET_INPUT_QUEUE_SIZE];
|
||||||
uint16_t decodeQueueHead;
|
uint16_t decodeQueueHead;
|
||||||
uint16_t decodeQueueTail;
|
uint16_t decodeQueueTail;
|
||||||
uint8_t inEscape;
|
uint8_t inEscape;
|
||||||
|
@ -116,16 +116,16 @@ typedef struct PacketThreadDataS {
|
||||||
} PacketThreadDataT;
|
} PacketThreadDataT;
|
||||||
|
|
||||||
|
|
||||||
typedef void (*packetSender)(char *data, uint32_t length, void *userData);
|
typedef void (*packetSender)(uint8_t *data, uint32_t length, void *userData);
|
||||||
|
|
||||||
|
|
||||||
char *packetContentPack(uint16_t *length, char *format, ...);
|
uint8_t *packetContentPack(uint16_t *length, char *format, ...);
|
||||||
void packetContentUnpack(char *buffer, char *format, ...);
|
void packetContentUnpack(uint8_t *buffer, char *format, ...);
|
||||||
void packetDebugPrint(uint8_t *data, uint16_t length);
|
void packetDebugPrint(uint8_t *data, uint16_t length);
|
||||||
uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeData, char *input, uint16_t inputLength);
|
uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeData, uint8_t *input, uint16_t inputLength);
|
||||||
void packetDecodeDataDestroy(PacketDecodeDataT **packet);
|
void packetDecodeDataDestroy(PacketDecodeDataT **packet);
|
||||||
void packetDecodeDataStaticDestroy(PacketDecodeDataT *packet);
|
void packetDecodeDataStaticDestroy(PacketDecodeDataT *packet);
|
||||||
uint8_t packetEncode(PacketThreadDataT *threadData, PacketEncodeDataT *data, char *input, uint16_t length);
|
uint8_t packetEncode(PacketThreadDataT *threadData, PacketEncodeDataT *data, uint8_t *input, uint16_t length);
|
||||||
uint8_t packetEncryptionReady(void);
|
uint8_t packetEncryptionReady(void);
|
||||||
void packetEncryptionSetup(PacketThreadDataT *threadData);
|
void packetEncryptionSetup(PacketThreadDataT *threadData);
|
||||||
void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data);
|
void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data);
|
||||||
|
|
Loading…
Add table
Reference in a new issue