All packet buffers are now uint8_t instead of char. Few memory leaks and NULL issues fixed.

This commit is contained in:
Scott Duensing 2022-02-19 18:59:00 -06:00
parent 7149a0d33c
commit 1427b28d00
57 changed files with 1506 additions and 325 deletions

358
client/assets/chat.svg Normal file
View 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 &lt;a href="http://tango.freedesktop.org/Tango_Desktop_Project"&gt; Tango Project &lt;/a&gt; &#13;\n&lt;br&gt;&lt;br&gt;&#13;\nSince version 0.8.90 Tango Project icons are Public Domain: &lt;a href="http://tango.freedesktop.org/Frequently_Asked_Questions#Terms_of_Use.3F"&gt; Tango Project FAQ &lt;/a&gt;</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)

Binary file not shown.

BIN
client/assets/dos.png (Stored with Git LFS)

Binary file not shown.

140
client/assets/email.svg Normal file
View 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
View 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
View 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)

Binary file not shown.

BIN
client/assets/logo.xcf (Stored with Git LFS)

Binary file not shown.

494
client/assets/logoff.svg Normal file
View 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 &lt;a href="http://tango.freedesktop.org/Tango_Desktop_Project"&gt; Tango Project &lt;/a&gt; &#13;\n&lt;br&gt;&lt;br&gt;&#13;\nSince version 0.8.90 Tango Project icons are Public Domain: &lt;a href="http://tango.freedesktop.org/Frequently_Asked_Questions#Terms_of_Use.3F"&gt; Tango Project FAQ &lt;/a&gt;</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)

Binary file not shown.

25
client/assets/profile.svg Normal file
View 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)

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

BIN
client/in/welcome/logo.png (Stored with Git LFS) Normal file

Binary file not shown.

View file

@ -72,8 +72,8 @@ void configStartup(char *file) {
_configName = utilAppNameWithNewExtensionGet(file, "ini");
// Numeric Defaults.
__configData.videoWidth = 800;
__configData.videoHeight = 600;
__configData.videoWidth = 640;
__configData.videoHeight = 480;
__configData.videoDepth = 16;
__configData.serialCom = 0;
__configData.serverPort = 16550;

View file

@ -359,7 +359,7 @@ static uint8_t vbeIsDesiredMode(void) {
// Packed or Direct Color mode.
if (_vbeModeInfo.memoryModel == VBE_MM_PACKED || _vbeModeInfo.memoryModel == VBE_MM_DCOLOR) {
// Resolution minimum of 640x480.
if (_vbeModeInfo.xResolution >= 800 && _vbeModeInfo.yResolution >= 600) {
if (_vbeModeInfo.xResolution >= 640 && _vbeModeInfo.yResolution >= 480) {
// Multiple of 8
if (DIVISIBLE_BY_EIGHT(_vbeModeInfo.xResolution) && DIVISIBLE_BY_EIGHT(_vbeModeInfo.yResolution)) {
// Valid mode!

View file

@ -94,7 +94,7 @@ void fileCacheCheck(fileCallback callback, char *vpaths[]) {
static void fileCheckNext(void) {
PacketEncodeDataT encoded = { 0 };
char *packetData = NULL;
uint8_t *packetData = NULL;
uint16_t length = 0;
uint32_t temp = 0;
uint8_t doRecheck = 0;
@ -169,7 +169,7 @@ static void fileShowDialog(void) {
T_TITLE, P("Downloading..."),
T_LABEL, T_DONE,
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_ENABLED, 1,
T_TIMER, T_DONE,
@ -195,7 +195,7 @@ static void fileShowError(char *message) {
static void packetHandler(PacketDecodeDataT *packet) {
FileResponseT response = 0;
PacketEncodeDataT encoded = { 0 };
char *packetData = NULL;
uint8_t *packetData = NULL;
uint16_t length = 0;
uint32_t temp = 0;

View file

@ -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);
for (yl=0; yl<font->height; yl++) {
// We do 4 pixels unrolled hoping it's fast.
data = font->bits[offset];
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 + 3, yp, data & 0x10 ? foreground : background);
}
yp++;
}
} else {
// 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.
data = font->bits[offset];
offset += font->span;
#ifndef FONT_DEBUGGING
surfacePutPixel(x, yp, data & 0x80 ? foreground : background);
surfacePutPixel(x + 1, yp, data & 0x40 ? 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 + 6, yp, data & 0x02 ? foreground : background);
surfacePutPixel(x + 7, yp, data & 0x01 ? foreground : background);
#endif
yp++;
}
}

View file

@ -472,11 +472,14 @@ void guiMouseProcess(MouseT *mouse) {
void guiPaint(WidgetT *widget) {
PendingEventsT *event = NULL;
// Process any pending events.
while (arrlen(_guiPendingEvents)) {
_guiPendingEvents[0]->callback(_guiPendingEvents[0]->widget);
DEL(_guiPendingEvents[0]);
event = _guiPendingEvents[0];
arrdel(_guiPendingEvents, 0);
_guiPendingEvents[0]->callback(event->widget);
DEL(event);
}
arrfree(_guiPendingEvents);
@ -662,7 +665,7 @@ DesktopT *guiStartup(void) {
_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.
_guiFont = fontLoad(cacheFilenameGet("system:vga8x14"));
_guiFont = fontLoad(cacheFilenameGet("gui:vga8x14.dat"));
// Create desktop and return it. Remember it for later.
_guiDesktop = desktopNew();

View file

@ -57,11 +57,11 @@ static ButtonT *_btnThree = NULL;
//***TODO*** This depends on the cache system which isn't really part of the GUI.
static char *_iconFiles[MSGBOX_ICON_COUNT] = {
"system:exclamation",
"system:warning",
"system:information",
"system:message",
"system:question"
"gui:exclamation.png",
"gui:warning.png",
"gui:information.png",
"gui:message.png",
"gui:question.png"
};

View file

@ -206,7 +206,7 @@ static void setButtons(uint8_t enabled) {
static void timLoginProgress(WidgetT *widget) {
char *packetData;
uint8_t *packetData;
uint16_t length;
PacketEncodeDataT encoded;
TimerT *t = (TimerT *)widget;

View file

@ -193,7 +193,7 @@ static uint8_t startup(int argc, char *argv[]) {
guiStartup();
netStartup();
_pointer = imageLoad(cacheFilenameGet("system:mouse"));
_pointer = imageLoad(cacheFilenameGet("gui:mouse.png"));
_alpha = imagePixelGet(_pointer, 5, 0);
tableLoad();
@ -300,12 +300,33 @@ int main(int argc, char *argv[]) {
if (hasValidSettings()) {
// We have what we need, start the client.
welcomeShow();
eventLoop();
} else {
// Run the setup.
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;
}

View file

@ -33,119 +33,124 @@
#include "file.h"
static void btnLogoffClick(WidgetT *widget);
static void btnOptionsClick(WidgetT *widget);
static void btnMsgBoxLogoff(MsgBoxButtonT button);
static void menuFilesReady(void);
static void picDoorClick(WidgetT *widget);
static void setButtons(uint8_t enabled);
static void picChatClick(WidgetT *widget);
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 *_picDoor = NULL;
static PictureT *_picDOS = NULL;
static PictureT *_picIF = NULL;
static ButtonT *_btnOptions = NULL;
static ButtonT *_btnLogoff = 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 PictureT *_picChat = NULL;
static PictureT *_picEmail = NULL;
static PictureT *_picForums = NULL;
static PictureT *_picGames = NULL;
static PictureT *_picLogoff = NULL;
static PictureT *_picProfile = NULL;
static void btnMsgBoxLogoff(MsgBoxButtonT button) {
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.
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) {
char *dos = strdup(cacheFilenameGet("menu:dosgames.png"));
char *door = strdup(cacheFilenameGet("menu:doorgames.png"));
char *fiction = strdup(cacheFilenameGet("menu:interactivefiction.png"));
uint16_t x = vbeDisplayWidthGet() - 49;
uint16_t y = vbeDisplayHeightGet() - 49;
TagItemT uiMenu[] = {
T_START,
T_WINDOW, O(_winMenu),
T_TITLE, P("KangaWorld Main Menu"),
T_X, vbeDisplayWidthGet() - 360, T_Y, vbeDisplayHeightGet() - 285,
T_WIDTH, 350, T_HEIGHT, 275,
_picLogoff = pictureNew(x, y, cacheFilenameGet("menu:48logoff.png"));
pictureClickHandlerSet(_picLogoff, picLogoffClick);
guiAttach(guiRootGet(), W(_picLogoff));
x -= 49;
T_PICTURE, O(_picDOS),
T_FILENAME, P(dos),
T_X, 18, T_Y, 18,
T_PICTURE, T_DONE,
_picForums = pictureNew(x, y, cacheFilenameGet("menu:48forums.png"));
pictureClickHandlerSet(_picForums, picForumsClick);
guiAttach(guiRootGet(), W(_picForums));
x -= 49;
T_PICTURE, O(_picDoor),
T_FILENAME, P(door),
T_X, 18, T_Y, 77,
T_CLICK, P(picDoorClick),
T_PICTURE, T_DONE,
_picEmail = pictureNew(x, y, cacheFilenameGet("menu:48email.png"));
pictureClickHandlerSet(_picEmail, picEmailClick);
guiAttach(guiRootGet(), W(_picEmail));
x -= 49;
T_PICTURE, O(_picIF),
T_FILENAME, P(fiction),
T_X, 18, T_Y, 136,
T_PICTURE, T_DONE,
_picGames = pictureNew(x, y, cacheFilenameGet("menu:48games.png"));
pictureClickHandlerSet(_picGames, picGamesClick);
guiAttach(guiRootGet(), W(_picGames));
x -= 49;
T_BUTTON, O(_btnOptions),
T_TITLE, P("Options"),
T_X, 23, T_Y, 202,
T_CLICK, P(btnOptionsClick),
T_BUTTON, T_DONE,
_picChat = pictureNew(x, y, cacheFilenameGet("menu:48chat.png"));
pictureClickHandlerSet(_picChat, picChatClick);
guiAttach(guiRootGet(), W(_picChat));
x -= 49;
T_BUTTON, O(_btnLogoff),
T_TITLE, P("Logoff"),
T_X, 245, T_Y, 202,
T_CLICK, P(btnLogoffClick),
T_BUTTON, T_DONE,
T_WINDOW, T_DONE,
T_END
};
tagListRun(uiMenu);
DEL(fiction);
DEL(door);
DEL(dos);
_picProfile = pictureNew(x, y, cacheFilenameGet("menu:48profile.png"));
pictureClickHandlerSet(_picProfile, picProfileClick);
guiAttach(guiRootGet(), W(_picProfile));
}
void menuShow(void) {
char *fileList[] = {
"menu:dosgames.png",
"menu:doorgames.png",
"menu:interactivefiction.png",
"menu:48chat.png",
"menu:48email.png",
"menu:48forums.png",
"menu:48games.png",
"menu:48logoff.png",
"menu:48profile.png",
NULL
};
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) {
// ***TODO*** This should disable the entire dialog instead of just the buttons. Need to finish the Enable GUI code first.
widgetEnableSet(W(_btnOptions), enabled);
widgetEnableSet(W(_btnLogoff), enabled);
static void picEmailClick(WidgetT *widget) {
(void)widget;
// ***TODO***
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);
}

View file

@ -262,7 +262,7 @@ void signupShow(void) {
static void timSignUpProgress(WidgetT *widget) {
PacketEncodeDataT encoded;
uint16_t length;
char *packetData;
uint8_t *packetData;
TimerT *t = (TimerT *)widget;
switch (_state) {

View file

@ -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 "cache.h"

View file

@ -22,10 +22,10 @@
#include "config.h"
void comPacketSender(char *data, uint32_t length, void *userData) {
void comPacketSender(uint8_t *data, uint32_t length, 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;
}
/*
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
*/

View file

@ -26,16 +26,6 @@
#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__
#define SER_SUCCESS 0
@ -62,7 +52,7 @@ int comWrite(int com, const char *data, int len);
#endif
void comPacketSender(char *data, uint32_t length, void *userData);
void comPacketSender(uint8_t *data, uint32_t length, void *userData);
int comReceiveBufferFlush(int com);

View file

@ -104,19 +104,21 @@ void netPacketHandlerStop(void) {
void netProcess(void) {
int32_t r;
char buffer[1024];
uint8_t buffer[1024];
PacketDecodeDataT *packet;
PacketDecodeDataT decoded;
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) {
// 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.
if (packetDecode(__packetThreadData, &decoded, buffer, r)) {
//logWrite("Packet In: %d\n", decoded.packetType);
//packetDebugPrint((uint8_t *)decoded.data, decoded.length);
switch (decoded.packetType) {
case PACKET_TYPE_PING:
// Reply with PONG
@ -139,7 +141,7 @@ void netProcess(void) {
packet->channel = decoded.channel;
packet->length = decoded.length;
packet->packetType = decoded.packetType;
packet->data = (char *)malloc(decoded.length);
packet->data = (uint8_t *)malloc(decoded.length);
memcpy(packet->data, decoded.data, decoded.length);
// Send it to the subscriber.
_systemHandlers[r](packet);
@ -153,7 +155,7 @@ void netProcess(void) {
packet->channel = decoded.channel;
packet->length = decoded.length;
packet->packetType = decoded.packetType;
packet->data = (char *)malloc(decoded.length);
packet->data = (uint8_t *)malloc(decoded.length);
memcpy(packet->data, decoded.data, decoded.length);
// Send it to the subscriber.
_channels[r].value(packet);

View file

@ -149,7 +149,7 @@ static void packetHandler(PacketDecodeDataT *packet) {
shdel(__runtimeData.strings, packet->data);
}
// 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;
case PACKET_TYPE_VERSION:
@ -195,10 +195,10 @@ static void settingsFinished(WidgetT *widget) {
void welcomeShow(void) {
char *logo = strdup(cacheFilenameGet("system:logo"));
char *init = strdup(cacheFilenameGet("system:init"));
char *dial = strdup(cacheFilenameGet("system:dialing"));
char *conn = strdup(cacheFilenameGet("system:connect"));
char *logo = strdup(cacheFilenameGet("welcome:logo.png"));
char *init = strdup(cacheFilenameGet("welcome:init.png"));
char *dial = strdup(cacheFilenameGet("welcome:dialing.png"));
char *conn = strdup(cacheFilenameGet("welcome:connect.png"));
// 450x128 logo
@ -300,7 +300,7 @@ static void timWelcomeProgress(WidgetT *widget) {
case S_INIT_MODEM:
// Just read anything to clear the buffer.
len = comRead(__configData.serialCom - 1, buffer, 1023);
comRead(__configData.serialCom - 1, buffer, 1023);
// Send actual init
snprintf(buffer, 1023, "%s%c", "AT+SOCK1", 13);
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));

View file

@ -38,10 +38,8 @@ INCLUDEPATH += \
HEADERS = \
$$SHARED/stddclmr.h \
$$SHARED/thirdparty/memwatch/memwatch.h \
$$SHARED/thirdparty/stb_image.h \
$$GUI/font.h
$$SHARED/thirdparty/stb_image.h
SOURCES = \
$$SHARED/thirdparty/memwatch/memwatch.c \
$$GUI/font.c \
src/main.c

View file

@ -27,54 +27,10 @@
#define STBI_ONLY_PNG
#include "stb_image.h"
#include "font.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 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) {
@ -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[]) {
(void)argc;
(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/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;
}

View file

@ -20,11 +20,11 @@
TEMPLATE = subdirs
CONFIG *= ORDERED
SUBDIRS = \
#SUBDIRS = \
# client \
# server
# precache
font
# font
# primes
OTHER_FILES = \

View file

@ -27,6 +27,7 @@ SYSTEM = $$CLIENT/system
THIRDP = $$CLIENT/thirdparty
INCLUDEPATH += \
$$CLIENT \
$$SHARED \
$$SHARED/thirdparty \
$$SYSTEM \

View file

@ -28,20 +28,24 @@
#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[]) {
CachePreMakeListT list[] = {
{ "dconnect.png", "system:connect" },
{ "ddialing.png", "system:dialing" },
{ "dinit.png", "system:init" },
{ "logo.png", "system:logo" },
{ "mbie32.png", "system:exclamation" },
{ "mbii32.png", "system:information" },
{ "mbim32.png", "system:message" },
{ "mbiq32.png", "system:question" },
{ "mbiw32.png", "system:warning" },
{ "mouse.png", "system:mouse" },
{ "vga8x14.dat", "system:vga8x14" },
{ CLIENT"welcome/dconnect.png", "welcome:connect.png" },
{ CLIENT"welcome/ddialing.png", "welcome:dialing.png" },
{ CLIENT"welcome/dinit.png", "welcome:init.png" },
{ CLIENT"welcome/logo.png", "welcome:logo.png" },
{ CLIENT"gui/mbie32.png", "gui:exclamation.png" },
{ CLIENT"gui/mbii32.png", "gui:information.png" },
{ CLIENT"gui/mbim32.png", "gui:message.png" },
{ CLIENT"gui/mbiq32.png", "gui:question.png" },
{ CLIENT"gui/mbiw32.png", "gui:warning.png" },
{ CLIENT"gui/mouse.png", "gui:mouse.png" },
{ FONT"vga8x14.dat", "gui:vga8x14.dat" },
{ NULL, NULL }
};
@ -50,8 +54,8 @@ int main(int argc, char *argv[]) {
// Also run optipng -o7 on images.
cachePrePack("client.pre", list);
cachePreUnpack("client.pre");
cachePrePack(OUT"client.pre", list);
cachePreUnpack(OUT"client.pre");
return 0;
}

View file

@ -45,7 +45,7 @@ static uint8_t clientDequeuePacket(ClientThreadT *client);
static uint8_t clientDequeuePacket(ClientThreadT *client) {
uint16_t length = 0;
char *data = NULL;
uint8_t *data = NULL;
PacketDecodeDataT decode = { 0 };
ClientRawPacketT *packet = NULL;
@ -84,7 +84,7 @@ void clientQueuePacket(ClientThreadT *client, uint8_t *data, uint32_t length) {
packet = (ClientRawPacketT *)malloc(sizeof(ClientRawPacketT));
if (packet) {
packet->data = (char *)malloc(length);
packet->data = (uint8_t *)malloc(length);
if (packet->data) {
memcpy(packet->data, data, length);
packet->length = length;
@ -125,7 +125,7 @@ void *clientThread(void *data) {
time_t ticks = { 0 };
time_t lastTicks = { 0 };
int8_t pingTimeout = 0;
char *packetData = NULL;
uint8_t *packetData = NULL;
uint16_t length = 0;
// Process packets until we're done.
@ -174,6 +174,7 @@ void *clientThread(void *data) {
// ***TODO*** Write ping stats to database.
// Clean up client data on the way out.
// ***TODO*** valgrind says this isn't working.
while (arrlen(client->packetQueue) > 0) {
if (client->packetQueue[0]->data) DEL(client->packetQueue[0]->data);
arrdel(client->packetQueue, 0);
@ -185,6 +186,9 @@ void *clientThread(void *data) {
if (client->handle) fclose(client->handle);
peer = client->peer;
peer->data = NULL;
DEL(client);
pthread_exit(NULL);

View file

@ -30,7 +30,7 @@
typedef struct ClientRawPacketS {
char *data;
uint8_t *data;
uint32_t length;
} ClientRawPacketT;

View file

@ -31,7 +31,7 @@ static void clientApiFileRequestNext(ClientThreadT *client, PacketDecodeDataT *d
void clientApiFileRequest(ClientThreadT *client, PacketDecodeDataT *data) {
FileRequestsT request = 0;
PacketEncodeDataT encoded = { 0 };
char *packetData = NULL;
uint8_t *packetData = NULL;
uint16_t length = 0;
// Must be logged in to do file operations.
@ -73,7 +73,7 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
char *path = NULL;
char *sha256 = NULL;
PacketEncodeDataT encoded = { 0 };
char *packetData = NULL;
uint8_t *packetData = NULL;
uint16_t length = 0;
char shaInDB[128] = { 0 };
char buffer[1024] = { 0 };
@ -115,6 +115,8 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
client->handle = fopen(buffer2, "rb");
if (!client->handle) {
logWrite("Unable to open [%s]\n", buffer2);
DEL(sha256);
DEL(path);
// ***TODO*** Handle error
return;
}
@ -133,8 +135,12 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
encoded.encrypt = 0;
packetEncode(client->packetThreadData, &encoded, packetData, length);
packetSend(client->packetThreadData, &encoded);
//packetDebugPrint((uint8_t *)encoded.dataPointer, encoded.length);
DEL(packetData);
DEL(sha256);
DEL(path);
// Start sending actual file data.
clientApiFileRequestNext(client, data);
}
@ -145,7 +151,7 @@ static void clientApiFileRequestNext(ClientThreadT *client, PacketDecodeDataT *d
uint32_t temp = 0;
PacketEncodeDataT encoded = { 0 };
uint16_t length = 0;
char packetData[PACKET_MAX];
uint8_t packetData[PACKET_MAX];
// Do we have an open file?
if (client->handle) {

View file

@ -24,7 +24,7 @@
void clientApiLogin(ClientThreadT *client, PacketDecodeDataT *data) {
char *packetData = NULL;
uint8_t *packetData = NULL;
char *user = NULL;
char *pass = NULL;
PacketEncodeDataT encoded = { 0 };

View file

@ -34,7 +34,7 @@ void clientApiSignup(ClientThreadT *client, PacketDecodeDataT *data) {
uint8_t result = 0;
char *string = NULL;
char *buffer = NULL;
char *packetData = NULL;
uint8_t *packetData = NULL;
PacketEncodeDataT encoded = { 0 };
uint16_t length = 0;

View file

@ -34,7 +34,7 @@ void clientApiVersionOkay(ClientThreadT *client, PacketDecodeDataT *data) {
uint64_t x = 0;
uint32_t y = 0;
uint16_t length = 0;
char *buffer = NULL;
uint8_t *buffer = NULL;
PacketEncodeDataT encoded = { 0 };
DBTableT *record = NULL;
DBTableT **table = NULL;
@ -50,7 +50,7 @@ void clientApiVersionOkay(ClientThreadT *client, PacketDecodeDataT *data) {
x = strlen(record->name);
y = strlen(record->data);
length = x + y + 2;
buffer = (char *)malloc(length);
buffer = (uint8_t *)malloc(length);
if (!buffer) {
consoleMessageQueue("%ld: Unable to allocate buffer for string packet!\n", client->threadIndex);
break;
@ -87,7 +87,7 @@ void clientApiVersionOkay(ClientThreadT *client, PacketDecodeDataT *data) {
x = strlen(record->name);
y = atol(record->data);
length = x + 5;
buffer = (char *)malloc(length);
buffer = (uint8_t *)malloc(length);
if (!buffer) {
consoleMessageQueue("%ld: Unable to allocate buffer for number packet!\n", client->threadIndex);
break;

View file

@ -36,7 +36,7 @@ static uint32_t _serverClients = 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) {
@ -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;
ENetPacket *packet = NULL;

View file

@ -56,7 +56,7 @@ static uint8_t _encryptionReady = 0;
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);
@ -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 };
static char work[PACKET_MAX] = { 0 };
char *result = NULL;
uint8_t *result = NULL;
char *buffer = NULL;
int32_t value32 = 0;
@ -111,7 +111,7 @@ char *packetContentPack(uint16_t *length, char *format, ...) {
// Copy working buffer to result to return.
if (*length > 0) {
result = (char *)malloc(*length);
result = (uint8_t *)malloc(*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 };
char **string = NULL;
int32_t *value32 = NULL;
@ -140,7 +140,7 @@ void packetContentUnpack(char *buffer, char *format, ...) {
// Copy string including the terminating zero.
string = va_arg(args, char **);
if (&buffer[length] != NULL) {
*string = strdup(&buffer[length]);
*string = strdup((const char *)&buffer[length]);
length += strlen(*string) + 1;
}
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;
/*
@ -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;
uint16_t unpadded = 0;
int32_t x = 0;
@ -304,7 +304,7 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
// Copy packet data to new buffer, if any.
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;
memcpy(decodeData->data, &threadData->decodeBuffer[3], threadData->length - 4); // Skip header and CRC.
decodeData->length = threadData->length - 4;
@ -316,6 +316,9 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
// Fix length to remove header and checksum.
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?
if (decodeData->packetType == PACKET_TYPE_DH_REQUEST) {
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.channel = 0; // Doesn't matter 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);
_encryptionReady = 1; // Responding side.
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;
uint8_t crc = 0;
uint8_t control = 0;
uint16_t paddedSize = 0;
uint16_t inputLength = 0;
char *inputBuffer = NULL;
uint8_t *inputBuffer = NULL;
// 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);
// Calculate CRC over header bytes.
crc = packetCRC((char *)&control, 1, crc);
crc = packetCRC((char *)&data->packetType, 1, crc);
crc = packetCRC((char *)&data->channel, 1, crc);
crc = packetCRC(&control, 1, crc);
crc = packetCRC((uint8_t *)&data->packetType, 1, crc);
crc = packetCRC(&data->channel, 1, crc);
// Add header bytes.
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);
AES_CBC_encrypt_buffer(threadData->aesContext, threadData->encryptionBuffer, paddedSize);
// Encrypted, select proper buffer.
inputBuffer = (char *)threadData->encryptionBuffer;
inputBuffer = threadData->encryptionBuffer;
inputLength = paddedSize;
} else {
// Not encrypted, select proper buffer.
@ -521,7 +524,7 @@ void packetEncryptionSetup(PacketThreadDataT *threadData) {
encoded.packetType = PACKET_TYPE_DH_REQUEST;
encoded.channel = 0; // Doesn't matter 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);
}
@ -530,6 +533,8 @@ void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data) {
// Valid control type?
if (data->control != PACKET_CONTROL_BAD && data->control <= PACKET_CONTROL_COUNT) {
_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 {
logWrite("Invalid PACKET_CONTROL!\n\r");
}

View file

@ -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_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_FRAME 0x7e
@ -64,7 +64,7 @@ typedef enum PacketControlE {
typedef struct PacketDecodeDataS {
// Output
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.
uint8_t channel; // Which data channel it arrived on.
} PacketDecodeDataT;
@ -78,12 +78,12 @@ typedef struct PacketEncodeDataS {
// Input & Output
uint8_t sequence; // For NAK packets, input the sequence number we missed. Other packets returns the sequence of this packet.
// 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.
} PacketEncodeDataT;
typedef struct PacketHistoryDataS {
char data[PACKET_BUFFER_SIZE];
uint8_t data[PACKET_BUFFER_SIZE];
uint16_t length;
uint8_t sequence;
} PacketHistoryDataT;
@ -96,9 +96,9 @@ typedef struct PacketThreadDataS {
PacketHistoryDataT history[PACKET_SEQUENCE_MAX];
uint8_t historyPosition;
*/
char decodeBuffer[PACKET_MAX];
char encodeBuffer[PACKET_BUFFER_SIZE];
char decodeQueue[PACKET_INPUT_QUEUE_SIZE];
uint8_t decodeBuffer[PACKET_MAX];
uint8_t encodeBuffer[PACKET_BUFFER_SIZE];
uint8_t decodeQueue[PACKET_INPUT_QUEUE_SIZE];
uint16_t decodeQueueHead;
uint16_t decodeQueueTail;
uint8_t inEscape;
@ -116,16 +116,16 @@ typedef struct PacketThreadDataS {
} 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, ...);
void packetContentUnpack(char *buffer, char *format, ...);
uint8_t *packetContentPack(uint16_t *length, char *format, ...);
void packetContentUnpack(uint8_t *buffer, char *format, ...);
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 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);
void packetEncryptionSetup(PacketThreadDataT *threadData);
void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data);