diff --git a/sflphone-gtk/configure.ac b/sflphone-gtk/configure.ac index e58ac42b265cd5f23634b3189f0490ad16da6fc4..2864ef4cf513198a24413a24614d56ede7110563 100644 --- a/sflphone-gtk/configure.ac +++ b/sflphone-gtk/configure.ac @@ -33,6 +33,7 @@ PKG_CHECK_MODULES(DEPS, \ gtk+-2.0 >= 2.2 \ glib-2.0 >= 2.2 \ libsexy >= 0.1 \ + libebook-1.2 >= 2.22 ) @@ -42,6 +43,7 @@ AC_SUBST(DEPS_LIBS) AC_OUTPUT([ Makefile src/Makefile +src/contactlist/Makefile pixmaps/Makefile sflphone.desktop ]) diff --git a/sflphone-gtk/pixmaps/Makefile.am b/sflphone-gtk/pixmaps/Makefile.am index af3933982c18d853b1f4023f63e0fd0cbdff6e5b..9a2a423f663b9d0f42807b366af692eceb72089b 100644 --- a/sflphone-gtk/pixmaps/Makefile.am +++ b/sflphone-gtk/pixmaps/Makefile.am @@ -2,6 +2,6 @@ icondir = $(datadir)/pixmaps icon_DATA = sflphone.png -buttons_DATA = accept.svg current.svg transfert.svg hang_up.svg hold.svg unhold.svg refuse.svg call.svg ring.svg dial.svg mic.svg mic_25.svg mic_50.svg mic_75.svg speaker.svg speaker_25.svg speaker_50.svg speaker_75.svg fail.svg incoming.svg outgoing.svg missed.svg mailbox.svg busy.svg icon_accept.svg icon_hold.svg icon_unhold.svg icon_hangup.svg icon_call.svg icon_dialpad.svg icon_volume.svg icon_dialpad_off.svg icon_volume_off.svg history.svg history2.svg sflphone.png stock_person.svg icon_rec.svg rec_call.svg +buttons_DATA = accept.svg current.svg transfert.svg hang_up.svg hold.svg unhold.svg refuse.svg call.svg ring.svg dial.svg mic.svg mic_25.svg mic_50.svg mic_75.svg speaker.svg speaker_25.svg speaker_50.svg speaker_75.svg fail.svg incoming.svg outgoing.svg missed.svg mailbox.svg busy.svg icon_accept.svg icon_hold.svg icon_unhold.svg icon_hangup.svg icon_call.svg icon_dialpad.svg icon_volume.svg icon_dialpad_off.svg icon_volume_off.svg history.svg history2.svg sflphone.png stock_person.svg icon_rec.svg rec_call.svg addressbook.svg contact_default.svg face-monkey.svg users.svg home.svg buttonsdir = $(datadir)/sflphone EXTRA_DIST = $(buttons_DATA) $(icon_DATA) diff --git a/sflphone-gtk/pixmaps/addressbook.svg b/sflphone-gtk/pixmaps/addressbook.svg new file mode 100644 index 0000000000000000000000000000000000000000..8b5931f97efd230af56de0b4e5c71950a4f879e8 --- /dev/null +++ b/sflphone-gtk/pixmaps/addressbook.svg @@ -0,0 +1,1032 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home/plbeaudoin/SFLPhone/sflphone/sflphone-gtk/pixmaps" + sodipodi:docname="addressbook.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6254" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.5261839,0,0,1.400538,-2.7953523,-3.4069917)" + cx="5.312501" + cy="8.1713457" + fx="5.312501" + fy="8.1713457" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6252" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.5261839,0,0,1.400538,-2.7953523,-3.4069917)" + cx="5.312501" + cy="8.1713457" + fx="5.312501" + fy="8.1713457" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6250" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.5261839,0,0,1.400538,-2.7953523,-3.4069917)" + cx="5.312501" + cy="8.1713457" + fx="5.312501" + fy="8.1713457" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6248" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.5261839,0,0,1.400538,-2.7953523,-3.4069917)" + cx="5.312501" + cy="8.1713457" + fx="5.312501" + fy="8.1713457" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6246" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.5261839,0,0,1.400538,-2.7953523,-3.4069917)" + cx="5.312501" + cy="8.1713457" + fx="5.312501" + fy="8.1713457" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6244" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.5261839,0,0,1.400538,-2.7953523,-3.4069917)" + cx="5.312501" + cy="8.1713457" + fx="5.312501" + fy="8.1713457" + r="6" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6881"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop6883" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6885" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6881" + id="linearGradient6242" + gradientUnits="userSpaceOnUse" + x1="17.353554" + y1="7.9356604" + x2="28.035534" + y2="81.759773" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6820"> + <stop + style="stop-color:#729fcf;stop-opacity:1;" + offset="0" + id="stop6822" /> + <stop + style="stop-color:#729fcf;stop-opacity:0;" + offset="1" + id="stop6824" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6820" + id="linearGradient6240" + gradientUnits="userSpaceOnUse" + x1="24.75" + y1="43.927441" + x2="24.75" + y2="35.790096" /> + <linearGradient + id="linearGradient6499" + inkscape:collect="always"> + <stop + id="stop6501" + offset="0" + style="stop-color:#729fcf;stop-opacity:1" /> + <stop + id="stop6503" + offset="1" + style="stop-color:#3465a4;stop-opacity:1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6499" + id="linearGradient6238" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.8885602,0,0,1,-55.486688,0)" + x1="17.077137" + y1="14.375" + x2="41.06271" + y2="56.9375" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6794" + id="linearGradient6236" + gradientUnits="userSpaceOnUse" + x1="42.875" + y1="30.9375" + x2="39.919209" + y2="51.062393" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6794" + id="linearGradient6234" + gradientUnits="userSpaceOnUse" + x1="42.875" + y1="30.9375" + x2="39.919209" + y2="51.062393" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6843"> + <stop + style="stop-color:#fec065;stop-opacity:1" + offset="0" + id="stop6845" /> + <stop + style="stop-color:#fcaf3e;stop-opacity:1" + offset="1" + id="stop6847" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6843" + id="radialGradient6232" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7452385,0,0,0.9108471,-49.172637,3.6387251)" + cx="42.5" + cy="36.307945" + fx="42.5" + fy="36.307945" + r="4.5" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6851"> + <stop + style="stop-color:#fdee77;stop-opacity:1" + offset="0" + id="stop6853" /> + <stop + style="stop-color:#fce94f;stop-opacity:1" + offset="1" + id="stop6855" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6851" + id="radialGradient6230" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.8213255,0,0,1.0038423,-52.350499,0.173875)" + cx="42.8125" + cy="25.727272" + fx="42.8125" + fy="25.727272" + r="4.5" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6794"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop6796" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6798" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6794" + id="linearGradient6228" + gradientUnits="userSpaceOnUse" + x1="42.875" + y1="30.9375" + x2="39.919209" + y2="51.062393" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6859"> + <stop + style="stop-color:#9ee757;stop-opacity:1" + offset="0" + id="stop6861" /> + <stop + style="stop-color:#8ae234;stop-opacity:1" + offset="1" + id="stop6863" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6859" + id="radialGradient6226" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.7867179,0,0,1.4423161,-51.042152,-5.8996785)" + cx="42" + cy="15.814279" + fx="42" + fy="15.814279" + r="3" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6224" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3279654,0,-0.4677714,1.6070078,3.489273,-5.7538092)" + cx="4.4339509" + cy="8.3226004" + fx="4.4339509" + fy="8.3226004" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6222" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3279654,0,-0.4677714,1.6070078,3.489273,-5.7538092)" + cx="4.4339509" + cy="8.3226004" + fx="4.4339509" + fy="8.3226004" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6220" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3279654,0,-0.4677714,1.6070078,3.489273,-5.7538092)" + cx="4.4339509" + cy="8.3226004" + fx="4.4339509" + fy="8.3226004" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6218" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3279654,0,-0.4677714,1.6070078,3.489273,-5.7538092)" + cx="4.4339509" + cy="8.3226004" + fx="4.4339509" + fy="8.3226004" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6216" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3279654,0,-0.4677714,1.6070078,3.489273,-5.7538092)" + cx="4.4339509" + cy="8.3226004" + fx="4.4339509" + fy="8.3226004" + r="6" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6642"> + <stop + style="stop-color:#d3d7cf;stop-opacity:1" + offset="0" + id="stop6644" /> + <stop + style="stop-color:#888a85;stop-opacity:1" + offset="1" + id="stop6646" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6642" + id="radialGradient6214" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.3279654,0,-0.4677714,1.6070078,3.489273,-5.7538092)" + cx="4.4339509" + cy="8.3226004" + fx="4.4339509" + fy="8.3226004" + r="6" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient6212" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /> + <linearGradient + inkscape:collect="always" + id="linearGradient5060"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop5062" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5064" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient6210" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /> + <linearGradient + id="linearGradient5048"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop5050" /> + <stop + id="stop5056" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5052" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient6208" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /> + <linearGradient + inkscape:collect="always" + id="linearGradient2433"> + <stop + style="stop-color:#008000;stop-opacity:1;" + offset="0" + id="stop2435" /> + <stop + style="stop-color:#008000;stop-opacity:0;" + offset="1" + id="stop2437" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 12 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="24 : 12 : 1" + inkscape:persp3d-origin="12 : 8 : 1" + id="perspective32" /> + <linearGradient + id="linearGradient4269"> + <stop + style="stop-color:#26b000;stop-opacity:1;" + offset="0" + id="stop4271" /> + <stop + style="stop-color:#26b000;stop-opacity:0;" + offset="1" + id="stop4273" /> + </linearGradient> + <linearGradient + id="linearGradient4183"> + <stop + id="stop4185" + offset="0" + style="stop-color:#26b000;stop-opacity:1;" /> + <stop + id="stop4187" + offset="1" + style="stop-color:#145f00;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4167"> + <stop + style="stop-color:#80000e;stop-opacity:1;" + offset="0" + id="stop4169" /> + <stop + style="stop-color:#b00014;stop-opacity:0;" + offset="1" + id="stop4171" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4269" + id="linearGradient4275" + x1="15.630395" + y1="22.874208" + x2="15.630395" + y2="8.5305319" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.256521,0,0,-1.256521,-7.854319,28.773309)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2433" + id="linearGradient2439" + x1="2.965755" + y1="-0.80084854" + x2="32.578228" + y2="16.739393" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="16" + inkscape:cx="6.09271" + inkscape:cy="2.756874" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="32px" + height="32px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1680" + inkscape:window-height="975" + inkscape:window-x="0" + inkscape:window-y="25" + showgrid="false"> + <sodipodi:guide + orientation="vertical" + position="15.982143" + id="guide3146" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g6053" + transform="matrix(0.5524765,0,0,0.5292103,31.058815,-0.3395984)"> + <g + transform="matrix(2.0192728e-2,0,0,1.7083182e-2,-17.539869,42.402519)" + id="g6055" + style="display:inline"> + <rect + style="opacity:0.39195981;fill:url(#linearGradient6208);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="rect6057" + width="1339.6335" + height="478.35718" + x="-1559.2523" + y="-150.69685" /> + <path + style="opacity:0.40206185;fill:url(#radialGradient6210);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z" + id="path6059" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + id="path6061" + d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z" + style="opacity:0.40206185;fill:url(#radialGradient6212);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + </g> + <g + transform="translate(-60,30)" + id="g6063"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6214);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 14.345337,8.5060394 C 13.701657,10.717373 11.23254,12.512078 8.8339139,12.512078 C 6.4352883,12.512078 5.0109846,10.717373 5.6546645,8.5060394 C 6.2983445,6.2947058 8.7674619,4.5000001 11.166088,4.5000001 C 13.564713,4.5000001 14.989017,6.2947058 14.345337,8.5060394 z" + id="path6065" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1.00080287;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6067" + sodipodi:cx="9.4575529" + sodipodi:cy="9.0207386" + sodipodi:rx="4.9939418" + sodipodi:ry="3.4913397" + d="M 14.451495,9.0207386 A 4.9939418,3.4913397 0 1 1 4.4636111,9.0207386 A 4.9939418,3.4913397 0 1 1 14.451495,9.0207386 z" + transform="matrix(0.8701215,0,-0.3339941,1.1474218,4.7836537,-1.8445527)" /> + </g> + <g + transform="translate(-60,24)" + id="g6070"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6216);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 14.345337,8.5060394 C 13.701657,10.717373 11.23254,12.512078 8.8339139,12.512078 C 6.4352883,12.512078 5.0109846,10.717373 5.6546645,8.5060394 C 6.2983445,6.2947058 8.7674619,4.5000001 11.166088,4.5000001 C 13.564713,4.5000001 14.989017,6.2947058 14.345337,8.5060394 z" + id="path6072" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1.00080287;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6074" + sodipodi:cx="9.4575529" + sodipodi:cy="9.0207386" + sodipodi:rx="4.9939418" + sodipodi:ry="3.4913397" + d="M 14.451495,9.0207386 A 4.9939418,3.4913397 0 1 1 4.4636111,9.0207386 A 4.9939418,3.4913397 0 1 1 14.451495,9.0207386 z" + transform="matrix(0.8701215,0,-0.3339941,1.1474218,4.7836537,-1.8445527)" /> + </g> + <g + transform="translate(-60,18)" + id="g6076"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6218);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 14.345337,8.5060394 C 13.701657,10.717373 11.23254,12.512078 8.8339139,12.512078 C 6.4352883,12.512078 5.0109846,10.717373 5.6546645,8.5060394 C 6.2983445,6.2947058 8.7674619,4.5000001 11.166088,4.5000001 C 13.564713,4.5000001 14.989017,6.2947058 14.345337,8.5060394 z" + id="path6078" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1.00080287;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6080" + sodipodi:cx="9.4575529" + sodipodi:cy="9.0207386" + sodipodi:rx="4.9939418" + sodipodi:ry="3.4913397" + d="M 14.451495,9.0207386 A 4.9939418,3.4913397 0 1 1 4.4636111,9.0207386 A 4.9939418,3.4913397 0 1 1 14.451495,9.0207386 z" + transform="matrix(0.8701215,0,-0.3339941,1.1474218,4.7836537,-1.8445527)" /> + </g> + <g + transform="translate(-60,12)" + id="g6082"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6220);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 14.345337,8.5060394 C 13.701657,10.717373 11.23254,12.512078 8.8339139,12.512078 C 6.4352883,12.512078 5.0109846,10.717373 5.6546645,8.5060394 C 6.2983445,6.2947058 8.7674619,4.5000001 11.166088,4.5000001 C 13.564713,4.5000001 14.989017,6.2947058 14.345337,8.5060394 z" + id="path6084" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1.00080287;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6086" + sodipodi:cx="9.4575529" + sodipodi:cy="9.0207386" + sodipodi:rx="4.9939418" + sodipodi:ry="3.4913397" + d="M 14.451495,9.0207386 A 4.9939418,3.4913397 0 1 1 4.4636111,9.0207386 A 4.9939418,3.4913397 0 1 1 14.451495,9.0207386 z" + transform="matrix(0.8701215,0,-0.3339941,1.1474218,4.7836537,-1.8445527)" /> + </g> + <g + transform="translate(-60,6)" + id="g6088"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6222);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 14.345337,8.5060394 C 13.701657,10.717373 11.23254,12.512078 8.8339139,12.512078 C 6.4352883,12.512078 5.0109846,10.717373 5.6546645,8.5060394 C 6.2983445,6.2947058 8.7674619,4.5000001 11.166088,4.5000001 C 13.564713,4.5000001 14.989017,6.2947058 14.345337,8.5060394 z" + id="path6090" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1.00080287;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6092" + sodipodi:cx="9.4575529" + sodipodi:cy="9.0207386" + sodipodi:rx="4.9939418" + sodipodi:ry="3.4913397" + d="M 14.451495,9.0207386 A 4.9939418,3.4913397 0 1 1 4.4636111,9.0207386 A 4.9939418,3.4913397 0 1 1 14.451495,9.0207386 z" + transform="matrix(0.8701215,0,-0.3339941,1.1474218,4.7836537,-1.8445527)" /> + </g> + <g + transform="translate(-60,0)" + id="g6094"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6224);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 14.345337,8.5060394 C 13.701657,10.717373 11.23254,12.512078 8.8339139,12.512078 C 6.4352883,12.512078 5.0109846,10.717373 5.6546645,8.5060394 C 6.2983445,6.2947058 8.7674619,4.5000001 11.166088,4.5000001 C 13.564713,4.5000001 14.989017,6.2947058 14.345337,8.5060394 z" + id="path6096" /> + <path + sodipodi:type="arc" + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1.00080287;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6098" + sodipodi:cx="9.4575529" + sodipodi:cy="9.0207386" + sodipodi:rx="4.9939418" + sodipodi:ry="3.4913397" + d="M 14.451495,9.0207386 A 4.9939418,3.4913397 0 1 1 4.4636111,9.0207386 A 4.9939418,3.4913397 0 1 1 14.451495,9.0207386 z" + transform="matrix(0.8701215,0,-0.3339941,1.1474218,4.7836537,-1.8445527)" /> + </g> + <rect + ry="2.4748738" + rx="2.3950391" + y="1.5" + x="-50.5" + height="39.999996" + width="29.999998" + id="rect6100" + style="fill:#3465a4;fill-opacity:1;stroke:#204a87;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <g + transform="translate(-62,1)" + id="g6102"> + <path + style="fill:#d3d7cf;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 14,3 L 39.182408,3 L 40,3.6961651 L 40,25 L 14,25 L 14,3 z" + id="path6104" + sodipodi:nodetypes="cccccc" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" + d="M 14,3 L 39.65625,3 C 40.711932,4.0277742 39.16614,5.0151389 37.65625,5 L 12.625,5 C 14.126385,5 15.015732,3.4971845 14,3 z" + id="path6106" + sodipodi:nodetypes="ccccc" /> + </g> + <rect + ry="1.1136932" + rx="1.2374369" + y="9.5" + x="-20.5" + height="10" + width="5" + id="rect6108" + style="fill:url(#radialGradient6226);fill-opacity:1;stroke:#4e9a06;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccccccc" + id="path6110" + d="M -48.079373,2.53125 C -48.880201,2.53125 -49.46875,3.1401838 -49.46875,3.96875 L -49.46875,39.03125 C -49.46875,39.859816 -48.880201,40.46875 -48.079373,40.46875 L -22.889376,40.46875 C -22.088548,40.46875 -21.499999,39.859815 -21.499999,39.03125 L -21.499999,3.96875 C -21.499999,3.1401839 -22.088549,2.53125 -22.889376,2.53125 L -48.079373,2.53125 z" + style="opacity:0.2;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" /> + <path + transform="translate(-62,-20)" + d="M 39.75,30.5 C 39.609554,30.5 39.5,30.609555 39.5,30.75 L 39.5,38.25 C 39.5,38.390448 39.609551,38.5 39.75,38.5 L 45.25,38.5 C 45.390448,38.5 45.5,38.390449 45.5,38.25 L 45.5,30.75 C 45.5,30.609552 45.390449,30.5 45.25,30.5 L 39.75,30.5 z" + id="path6112" + style="opacity:0.5;fill:none;fill-opacity:1;stroke:url(#linearGradient6228);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + inkscape:original="M 39.75 29.5 C 39.06446 29.5 38.5 30.064461 38.5 30.75 L 38.5 38.25 C 38.5 38.93554 39.064459 39.5 39.75 39.5 L 45.25 39.5 C 45.93554 39.5 46.5 38.935541 46.5 38.25 L 46.5 30.75 C 46.5 30.06446 45.935541 29.5 45.25 29.5 L 39.75 29.5 z " + inkscape:radius="-0.99302852" + sodipodi:type="inkscape:offset" /> + <rect + ry="1.2374369" + rx="1.2374369" + y="19.5" + x="-22.5" + height="10" + width="8" + id="rect6114" + style="fill:url(#radialGradient6230);fill-opacity:1;stroke:#c4a000;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + ry="1.2374369" + rx="1.2374369" + y="29.5" + x="-21.5" + height="10" + width="8" + id="rect6116" + style="fill:url(#radialGradient6232);fill-opacity:1;stroke:#ce5c00;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + transform="translate(-61,-10)" + d="M 39.75,30.5 C 39.609554,30.5 39.5,30.609555 39.5,30.75 L 39.5,38.25 C 39.5,38.390448 39.609551,38.5 39.75,38.5 L 45.25,38.5 C 45.390448,38.5 45.5,38.390449 45.5,38.25 L 45.5,30.75 C 45.5,30.609552 45.390449,30.5 45.25,30.5 L 39.75,30.5 z" + id="path6118" + style="opacity:0.5;fill:none;fill-opacity:1;stroke:url(#linearGradient6234);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + inkscape:original="M 39.75 29.5 C 39.06446 29.5 38.5 30.064461 38.5 30.75 L 38.5 38.25 C 38.5 38.93554 39.064459 39.5 39.75 39.5 L 45.25 39.5 C 45.93554 39.5 46.5 38.935541 46.5 38.25 L 46.5 30.75 C 46.5 30.06446 45.935541 29.5 45.25 29.5 L 39.75 29.5 z " + inkscape:radius="-0.99302852" + sodipodi:type="inkscape:offset" /> + <rect + y="19" + x="-24.8125" + height="10" + width="6.8125" + id="rect6120" + style="opacity:0.25;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + transform="translate(-60,0)" + d="M 39.75,30.5 C 39.609554,30.5 39.5,30.609555 39.5,30.75 L 39.5,38.25 C 39.5,38.390448 39.609551,38.5 39.75,38.5 L 45.25,38.5 C 45.390448,38.5 45.5,38.390449 45.5,38.25 L 45.5,30.75 C 45.5,30.609552 45.390449,30.5 45.25,30.5 L 39.75,30.5 z" + id="path6122" + style="opacity:0.5;fill:none;fill-opacity:1;stroke:url(#linearGradient6236);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + inkscape:original="M 39.75 29.5 C 39.06446 29.5 38.5 30.064461 38.5 30.75 L 38.5 38.25 C 38.5 38.93554 39.064459 39.5 39.75 39.5 L 45.25 39.5 C 45.93554 39.5 46.5 38.935541 46.5 38.25 L 46.5 30.75 C 46.5 30.06446 45.935541 29.5 45.25 29.5 L 39.75 29.5 z " + inkscape:radius="-0.99302852" + sodipodi:type="inkscape:offset" /> + <rect + y="29" + x="-24.8125" + height="11" + width="6.8125" + id="rect6124" + style="opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + y="9" + x="-25" + height="10" + width="7" + id="rect6126" + style="opacity:0.15517243;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <path + style="fill:url(#linearGradient6238);fill-opacity:1;stroke:#204a87;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" + d="M -49.025126,6.5 L -21.974874,6.5 C -20.603794,6.5 -19.5,7.6037937 -19.5,8.9748738 L -19.5,43.025122 C -19.5,44.396202 -20.603794,45.499996 -21.974874,45.499996 L -49.025126,45.499996 C -50.396206,45.499996 -51.5,44.396202 -51.5,43.025122 L -51.5,8.9748738 C -51.5,7.6037937 -50.396206,6.5 -49.025126,6.5 z" + id="rect6128" + sodipodi:nodetypes="ccccccccc" /> + <path + transform="translate(-60,0)" + style="fill:url(#linearGradient6240);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" + d="M 10.96875,7 C 9.866556,7 9,7.8665563 9,8.96875 L 9,43.03125 C 9,44.133444 9.8665564,45 10.96875,45 L 38.03125,45 C 39.133444,45 40,44.133443 40,43.03125 L 40,8.96875 C 40,7.8665562 39.133443,7 38.03125,7 L 10.96875,7 z" + id="path6130" + sodipodi:nodetypes="ccccccccc" /> + <path + transform="translate(-60,0)" + style="opacity:0.46120689;fill:none;fill-opacity:1;stroke:url(#linearGradient6242);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1" + d="M 10.96875,7.53125 C 10.140184,7.53125 9.53125,8.1401838 9.53125,8.96875 L 9.53125,43.03125 C 9.53125,43.859816 10.140184,44.46875 10.96875,44.46875 L 38.03125,44.46875 C 38.859816,44.46875 39.46875,43.859815 39.46875,43.03125 L 39.46875,8.96875 C 39.46875,8.1401839 38.859815,7.53125 38.03125,7.53125 L 10.96875,7.53125 z" + id="path6132" + sodipodi:nodetypes="ccccccccc" /> + <path + transform="matrix(0.9838006,0,0,0.9524402,-59.717389,30.145517)" + d="M 13.435029,11.959651 A 1.524699,1.6130873 0 1 1 10.385631,11.959651 A 1.524699,1.6130873 0 1 1 13.435029,11.959651 z" + sodipodi:ry="1.6130873" + sodipodi:rx="1.524699" + sodipodi:cy="11.959651" + sodipodi:cx="11.91033" + id="path6134" + style="opacity:1;fill:none;fill-opacity:1;stroke:#204a87;stroke-width:1.03306484;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + transform="matrix(0.9838006,0,0,0.9524402,-59.717389,24.145517)" + d="M 13.435029,11.959651 A 1.524699,1.6130873 0 1 1 10.385631,11.959651 A 1.524699,1.6130873 0 1 1 13.435029,11.959651 z" + sodipodi:ry="1.6130873" + sodipodi:rx="1.524699" + sodipodi:cy="11.959651" + sodipodi:cx="11.91033" + id="path6136" + style="opacity:1;fill:none;fill-opacity:1;stroke:#204a87;stroke-width:1.03306484;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + transform="matrix(0.9838006,0,0,0.9524402,-59.717389,18.145517)" + d="M 13.435029,11.959651 A 1.524699,1.6130873 0 1 1 10.385631,11.959651 A 1.524699,1.6130873 0 1 1 13.435029,11.959651 z" + sodipodi:ry="1.6130873" + sodipodi:rx="1.524699" + sodipodi:cy="11.959651" + sodipodi:cx="11.91033" + id="path6138" + style="opacity:1;fill:none;fill-opacity:1;stroke:#204a87;stroke-width:1.03306484;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + transform="matrix(0.9838006,0,0,0.9524402,-59.717389,6.1455167)" + d="M 13.435029,11.959651 A 1.524699,1.6130873 0 1 1 10.385631,11.959651 A 1.524699,1.6130873 0 1 1 13.435029,11.959651 z" + sodipodi:ry="1.6130873" + sodipodi:rx="1.524699" + sodipodi:cy="11.959651" + sodipodi:cx="11.91033" + id="path6140" + style="opacity:1;fill:none;fill-opacity:1;stroke:#204a87;stroke-width:1.03306484;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + transform="matrix(0.9838006,0,0,0.9524402,-59.717389,12.145517)" + d="M 13.435029,11.959651 A 1.524699,1.6130873 0 1 1 10.385631,11.959651 A 1.524699,1.6130873 0 1 1 13.435029,11.959651 z" + sodipodi:ry="1.6130873" + sodipodi:rx="1.524699" + sodipodi:cy="11.959651" + sodipodi:cx="11.91033" + id="path6142" + style="opacity:1;fill:none;fill-opacity:1;stroke:#204a87;stroke-width:1.03306484;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <path + transform="matrix(0.9838006,0,0,0.9524402,-59.717389,0.1455168)" + d="M 13.435029,11.959651 A 1.524699,1.6130873 0 1 1 10.385631,11.959651 A 1.524699,1.6130873 0 1 1 13.435029,11.959651 z" + sodipodi:ry="1.6130873" + sodipodi:rx="1.524699" + sodipodi:cy="11.959651" + sodipodi:cx="11.91033" + id="path6144" + style="opacity:1;fill:none;fill-opacity:1;stroke:#204a87;stroke-width:1.03306484;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + <g + transform="translate(-60,30)" + id="g6146"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6244);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6148" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.84375,6.5 C 6.2961784,7.0922996 5.8701722,7.7650799 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6150" + sodipodi:nodetypes="cssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6152" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,-1.7365942,0.3133592)" /> + <path + sodipodi:type="arc" + style="opacity:0.7;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6154" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,4.0970367,3.7163106)" /> + </g> + <g + transform="translate(-60,24)" + id="g6156"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6246);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6158" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.84375,6.5 C 6.2961784,7.0922996 5.8701722,7.7650799 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6160" + sodipodi:nodetypes="cssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6162" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,-1.7365942,0.3133592)" /> + <path + sodipodi:type="arc" + style="opacity:0.7;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6164" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,4.0970367,3.7163106)" /> + </g> + <g + transform="translate(-60,18)" + id="g6166"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6248);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6168" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.84375,6.5 C 6.2961784,7.0922996 5.8701722,7.7650799 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6170" + sodipodi:nodetypes="cssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6172" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,-1.7365942,0.3133592)" /> + <path + sodipodi:type="arc" + style="opacity:0.7;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6174" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,4.0970367,3.7163106)" /> + </g> + <g + transform="translate(-60,12)" + id="g6176"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6250);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6178" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.84375,6.5 C 6.2961784,7.0922996 5.8701722,7.7650799 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6180" + sodipodi:nodetypes="cssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6182" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,-1.7365942,0.3133592)" /> + <path + sodipodi:type="arc" + style="opacity:0.7;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6184" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,4.0970367,3.7163106)" /> + </g> + <g + transform="translate(-60,6)" + id="g6186"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6252);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6188" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.84375,6.5 C 6.2961784,7.0922996 5.8701722,7.7650799 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6190" + sodipodi:nodetypes="cssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6192" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,-1.7365942,0.3133592)" /> + <path + sodipodi:type="arc" + style="opacity:0.7;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6194" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,4.0970367,3.7163106)" /> + </g> + <path + id="path6196" + d="M -36.126698,24.53508 C -36.126707,25.493883 -35.930629,26.250007 -35.538462,26.803454 C -35.138775,27.35691 -34.599559,27.633635 -33.920815,27.633632 C -33.249636,27.633635 -32.714192,27.35691 -32.314481,26.803454 C -31.914796,26.242212 -31.714946,25.486088 -31.714933,24.53508 C -31.714946,23.591881 -31.918567,22.84745 -32.325793,22.301784 C -32.725504,21.748342 -33.264719,21.471616 -33.94344,21.471606 C -34.607101,21.471616 -35.138775,21.748342 -35.538462,22.301784 C -35.930629,22.84745 -36.126707,23.591881 -36.126698,24.53508 M -31.488688,28.054567 C -31.714946,28.608021 -32.080708,29.040649 -32.585974,29.352452 C -33.083724,29.656461 -33.668188,29.808466 -34.339367,29.808465 C -35.636511,29.808466 -36.692318,29.32517 -37.506788,28.358577 C -38.313733,27.384192 -38.717202,26.11749 -38.717195,24.558466 C -38.717202,22.999454 -38.309963,21.732752 -37.495476,20.758355 C -36.681005,19.783979 -35.62897,19.296786 -34.339367,19.296774 C -33.668188,19.296786 -33.083724,19.452687 -32.585974,19.76448 C -32.080708,20.076295 -31.714946,20.508922 -31.488688,21.062364 L -31.488688,19.530628 L -29.124436,19.530628 L -29.124436,27.633632 C -28.189309,27.485529 -27.454016,27.021721 -26.918553,26.242207 C -26.383127,25.454907 -26.115405,24.449341 -26.115386,23.225504 C -26.115405,22.446002 -26.224756,21.717161 -26.44344,21.038978 C -26.662162,20.353021 -26.993986,19.725515 -27.438915,19.156462 C -28.155373,18.205473 -29.052807,17.472734 -30.131223,16.958244 C -31.202127,16.443783 -32.363513,16.186544 -33.615386,16.18653 C -34.490208,16.186544 -35.327311,16.307368 -36.126698,16.549002 C -36.926103,16.782869 -37.665167,17.12975 -38.343892,17.589648 C -39.460037,18.35358 -40.331077,19.343556 -40.957014,20.55958 C -41.575419,21.767829 -41.88462,23.077404 -41.884616,24.48831 C -41.88462,25.649785 -41.68477,26.741097 -41.285069,27.762252 C -40.877833,28.775616 -40.293369,29.672052 -39.531674,30.45156 C -38.777533,31.21548 -37.914035,31.796214 -36.941178,32.193765 C -35.960794,32.599108 -34.9163,32.80178 -33.807693,32.801782 C -32.857479,32.80178 -31.907254,32.618596 -30.957015,32.252228 C -30.006803,31.885858 -29.196096,31.390869 -28.524888,30.767262 L -27.314481,32.661471 C -28.257182,33.417593 -29.286594,33.99443 -30.402716,34.391983 C -31.511327,34.797324 -32.638777,34.999996 -33.785069,35.000001 C -35.180253,34.999996 -36.496239,34.742758 -37.733033,34.228286 C -38.969842,33.721602 -40.070896,32.981068 -41.0362,32.006683 C -42.001512,31.032295 -42.736806,29.905905 -43.242082,28.627507 C -43.747362,27.341319 -44.000001,25.961588 -44,24.48831 C -44.000001,23.06961 -43.743592,21.717161 -43.230769,20.430961 C -42.717952,19.144782 -41.98643,18.014493 -41.0362,17.040093 C -40.085979,16.073515 -38.981154,15.325187 -37.72172,14.795104 C -36.454761,14.265054 -35.142545,14.000022 -33.785069,14.000005 C -32.095791,14.000022 -30.561102,14.33521 -29.180997,15.005572 C -27.800924,15.668171 -26.647078,16.626967 -25.719458,17.881963 C -25.153867,18.645896 -24.727775,19.476073 -24.441178,20.372497 C -24.147081,21.261148 -24.000023,22.196559 -24.000001,23.178734 C -24.000023,25.29121 -24.614652,26.932078 -25.843892,28.101338 C -27.073172,29.270604 -28.80771,29.855237 -31.047513,29.855236 L -31.488688,29.855236 L -31.488688,28.054567" + style="font-size:23.55376053px;font-style:normal;font-weight:normal;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" /> + <g + transform="translate(-60,0)" + id="g6198"> + <path + style="fill:none;fill-opacity:1;stroke:url(#radialGradient6254);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6200" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 6.84375,6.5 C 6.2961784,7.0922996 5.8701722,7.7650799 5.65625,8.5 C 5.0125701,10.711334 6.4451242,12.5 8.84375,12.5 C 9.757344,12.5 10.672765,12.22474 11.5,11.78125" + id="path6202" + sodipodi:nodetypes="cssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6204" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,-1.7365942,0.3133592)" /> + <path + sodipodi:type="arc" + style="opacity:0.7;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path6206" + sodipodi:cx="5.265625" + sodipodi:cy="8.2578125" + sodipodi:rx="0.546875" + sodipodi:ry="0.8046875" + d="M 5.8125,8.2578125 A 0.546875,0.8046875 0 1 1 4.71875,8.2578125 A 0.546875,0.8046875 0 1 1 5.8125,8.2578125 z" + transform="matrix(1.3714287,0,0,0.9320388,4.0970367,3.7163106)" /> + </g> + </g> + </g> +</svg> diff --git a/sflphone-gtk/pixmaps/contact_default.svg b/sflphone-gtk/pixmaps/contact_default.svg new file mode 100644 index 0000000000000000000000000000000000000000..5e4938e22ee323ae1ad150d62375525b1f8094f6 --- /dev/null +++ b/sflphone-gtk/pixmaps/contact_default.svg @@ -0,0 +1,312 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + id="svg2108" + sodipodi:version="0.32" + inkscape:version="0.46" + sodipodi:docbase="/home/dobey/Projects/gnome-icon-theme/scalable/stock/generic" + sodipodi:docname="stock_person.svg" + inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-icon-theme/48x48/stock/generic/stock_person.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + version="1.0"> + <defs + id="defs3"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 24 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="48 : 24 : 1" + inkscape:persp3d-origin="24 : 16 : 1" + id="perspective39" /> + <linearGradient + id="linearGradient4562"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4564" /> + <stop + style="stop-color:#d6d6d2;stop-opacity:1;" + offset="1" + id="stop4566" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4356"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4358" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4360" /> + </linearGradient> + <linearGradient + id="linearGradient3824"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3826" /> + <stop + style="stop-color:#c9c9c9;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop3828" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3816"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3818" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3820" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3816" + id="radialGradient3822" + cx="31.112698" + cy="19.008621" + fx="31.112698" + fy="19.008621" + r="8.6620579" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient4362" + x1="20.661695" + y1="35.817974" + x2="22.626925" + y2="36.217758" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4574725,8.6573699e-2,-8.4475822e-2,0.4688334,-3.7001476,-5.7438166)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient4366" + gradientUnits="userSpaceOnUse" + x1="22.686766" + y1="36.3904" + x2="21.408455" + y2="35.739632" + gradientTransform="matrix(-0.4548256,0.1001553,9.7728308e-2,0.4661207,19.475571,-6.1586599)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient1366" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.4548256,0.1001553,9.7728308e-2,0.4661207,13.107279,-9.3553728)" + x1="22.686766" + y1="36.3904" + x2="21.408455" + y2="35.739632" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3824" + id="linearGradient1372" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.4652065,0,0,0.4767595,-12.117924,-7.3917619)" + x1="30.935921" + y1="29.553486" + x2="30.935921" + y2="35.803486" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4562" + id="radialGradient4568" + cx="24.753788" + cy="26.814409" + fx="24.753788" + fy="26.814409" + r="17.986025" + gradientTransform="matrix(0.4708262,0,-1.1611519e-8,0.4867499,-3.5907712,-3.5342702)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4562" + id="radialGradient3816" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.558489,0,-1.377346e-8,0.563387,14.87134,4.364123)" + cx="29.922075" + cy="17.727694" + fx="29.922075" + fy="17.727694" + r="17.986025" /> + <filter + inkscape:collect="always" + x="-0.076111108" + width="1.1522222" + y="-0.28344828" + height="1.5668966" + id="filter5655"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.4531044" + id="feGaussianBlur5657" /> + </filter> + </defs> + <sodipodi:namedview + inkscape:showpageshadow="false" + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="0.16862745" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="4" + inkscape:cx="14.000535" + inkscape:cy="28.945566" + inkscape:current-layer="layer2" + showgrid="false" + inkscape:grid-bbox="true" + inkscape:document-units="px" + fill="#9db029" + stroke="#727e0a" + inkscape:window-width="872" + inkscape:window-height="815" + inkscape:window-x="207" + inkscape:window-y="92" + borderlayer="true" /> + <metadata + id="metadata4"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Person</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Jakub Steiner</dc:title> + </cc:Agent> + </dc:creator> + <dc:source>http://jimmac.musichall.cz</dc:source> + <dc:subject> + <rdf:Bag> + <rdf:li>user</rdf:li> + <rdf:li>person</rdf:li> + </rdf:Bag> + </dc:subject> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/SourceCode" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="cipek" + inkscape:groupmode="layer" + style="display:inline"> + <path + style="opacity:1;fill:url(#linearGradient1372);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 4.1651393,8.8345802 L 6.138843,8.8345802 L 4.9875164,7.7389402 L 4.7408031,8.0760604 L 4.4940899,7.8232205 L 4.1651393,8.8345802 z" + id="path4173" /> + <path + sodipodi:nodetypes="cccc" + id="path4370" + d="M 6.430587,11.556284 C 7.003373,11.279297 7.269997,10.601658 7.269997,10.601658 C 6.823808,8.674127 5.420266,7.3392773 5.420266,7.3392773 C 5.420266,7.3392773 6.566811,10.363174 6.430587,11.556284 z" + style="opacity:0.22784807;fill:url(#linearGradient1366);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + </g> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="dalsi cipek" + style="display:inline"> + <rect + style="opacity:0.34857142;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible;filter:url(#filter5655);enable-background:accumulate" + id="rect4608" + width="38.183765" + height="10.253048" + x="5.3033009" + y="35.448853" + rx="5.126524" + ry="5.126524" + transform="matrix(0.3250676,0,0,0.3331404,6.89512e-2,0.7930955)" /> + <path + style="opacity:1;fill:url(#radialGradient4568);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.35188666px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 5.747901,15.484233 L 10.682162,15.484233 C 12.080203,15.484233 13.464322,14.958876 13.971669,13.461513 C 14.453455,12.03959 14.053907,9.331795 10.928875,7.1405156 L 5.0899998,7.1405156 C 1.9649683,9.1632345 1.5744381,11.929484 2.2939191,13.545793 C 3.0268962,15.19242 4.2676231,15.484233 5.747901,15.484233 z" + id="path4308" + sodipodi:nodetypes="cczcczc" /> + <path + sodipodi:nodetypes="cccc" + id="path4364" + d="M 12.79888,14.752996 C 13.371666,14.476009 13.638289,13.79837 13.638289,13.79837 C 13.1921,11.870839 11.788558,10.53599 11.788558,10.53599 C 11.788558,10.53599 12.935103,13.559886 12.79888,14.752996 z" + style="opacity:0.29120878;fill:url(#linearGradient4366);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + <path + style="opacity:0.54945056;fill:url(#linearGradient4362);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 3.5664124,14.960262 C 2.9860173,14.700442 2.7262518,14.07431 2.7262518,14.07431 C 3.1176214,12.134311 4.4567857,10.714959 4.4567857,10.714959 C 4.4567857,10.714959 3.3964304,13.77171 3.5664124,14.960262 z" + id="path4354" + sodipodi:nodetypes="cccc" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + <path + sodipodi:nodetypes="cczcczc" + id="path4314" + d="M 5.634667,15.115814 L 10.684449,15.104916 C 11.954768,15.104916 13.212438,14.627555 13.673434,13.266988 C 14.111206,11.974967 13.627851,9.514549 10.788314,7.5234596 L 5.2422484,7.4035828 C 2.4027116,9.2415112 1.8531144,11.755044 2.5174989,13.343568 C 3.1818841,14.932092 4.1513831,15.104916 5.634667,15.115814 z" + style="opacity:0.64285715;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.35188669px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + d="M 39.774755,19.008621 A 8.6620579,8.6620579 0 1 1 22.45064,19.008621 A 8.6620579,8.6620579 0 1 1 39.774755,19.008621 z" + sodipodi:ry="8.6620579" + sodipodi:rx="8.6620579" + sodipodi:cy="19.008621" + sodipodi:cx="31.112698" + id="path4318" + style="opacity:1;fill:url(#radialGradient3822);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" + transform="matrix(0.4652065,0,0,0.4767595,-6.3991871,-2.6974863)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:url(#radialGradient3816);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.74718857px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4320" + sodipodi:cx="31.112698" + sodipodi:cy="19.008621" + sodipodi:rx="8.6620579" + sodipodi:ry="8.6620579" + d="M 39.774755,19.008621 A 8.6620579,8.6620579 0 1 1 22.45064,19.008621 A 8.6620579,8.6620579 0 1 1 39.774755,19.008621 z" + transform="matrix(0.4652065,0,0,0.4767595,-6.3410376,-4.366146)" /> + <path + d="M 39.774755,19.008621 A 8.6620579,8.6620579 0 1 1 22.45064,19.008621 A 8.6620579,8.6620579 0 1 1 39.774755,19.008621 z" + sodipodi:ry="8.6620579" + sodipodi:rx="8.6620579" + sodipodi:cy="19.008621" + sodipodi:cx="31.112698" + id="path4322" + style="opacity:0.19620254;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.82296228px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" + transform="matrix(0.4223732,0,0,0.4328624,-5.0083678,-3.5317177)" /> + </g> +</svg> diff --git a/sflphone-gtk/pixmaps/face-monkey.svg b/sflphone-gtk/pixmaps/face-monkey.svg new file mode 100644 index 0000000000000000000000000000000000000000..819282da548f151ebb1e36fd8839063eb9c2ddf7 --- /dev/null +++ b/sflphone-gtk/pixmaps/face-monkey.svg @@ -0,0 +1,583 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45.1" + version="1.0" + sodipodi:docbase="/home/lapo/Icone/gnome-icon-theme/scalable/emotes" + sodipodi:docname="face-monkey.svg" + inkscape:export-filename="/home/andreas/project/gnome-icon-theme/22x22/emotes/face-monkey.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs4"> + <linearGradient + inkscape:collect="always" + id="linearGradient7033"> + <stop + style="stop-color:#533401;stop-opacity:1;" + offset="0" + id="stop7035" /> + <stop + style="stop-color:#533401;stop-opacity:0;" + offset="1" + id="stop7037" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient7025"> + <stop + style="stop-color:#533401;stop-opacity:1;" + offset="0" + id="stop7027" /> + <stop + style="stop-color:#533401;stop-opacity:0;" + offset="1" + id="stop7029" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6971"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop6973" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop6975" /> + </linearGradient> + <linearGradient + id="linearGradient6107"> + <stop + style="stop-color:#e9b96e;stop-opacity:1;" + offset="0" + id="stop6109" /> + <stop + id="stop6115" + offset="0.78742659" + style="stop-color:#e9b96e;stop-opacity:1;" /> + <stop + style="stop-color:#8f5902;stop-opacity:1" + offset="1" + id="stop6111" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6067"> + <stop + style="stop-color:#2e3436;stop-opacity:1;" + offset="0" + id="stop6069" /> + <stop + style="stop-color:#000000;stop-opacity:1" + offset="1" + id="stop6071" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6044"> + <stop + style="stop-color:#a40000;stop-opacity:1;" + offset="0" + id="stop6046" /> + <stop + style="stop-color:#a40000;stop-opacity:0;" + offset="1" + id="stop6048" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6026"> + <stop + style="stop-color:#efca8e;stop-opacity:1" + offset="0" + id="stop6028" /> + <stop + style="stop-color:#e9b768;stop-opacity:1" + offset="1" + id="stop6030" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6016"> + <stop + style="stop-color:#c17d11;stop-opacity:1;" + offset="0" + id="stop6018" /> + <stop + style="stop-color:#9a640d;stop-opacity:1" + offset="1" + id="stop6020" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5992"> + <stop + style="stop-color:#8f5902;stop-opacity:1;" + offset="0" + id="stop5994" /> + <stop + style="stop-color:#744800;stop-opacity:1" + offset="1" + id="stop5996" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3398"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3400" /> + <stop + style="stop-color:#ffffff;stop-opacity:0.02568627" + offset="1" + id="stop3402" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3390"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3392" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3394" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3150"> + <stop + style="stop-color:#2e3436;stop-opacity:1;" + offset="0" + id="stop3152" /> + <stop + style="stop-color:#2e3436;stop-opacity:0;" + offset="1" + id="stop3154" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3150" + id="radialGradient3363" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.842757,0,0,-0.35721,19.80716,14.19321)" + cx="10.748654" + cy="10.457643" + fx="10.748654" + fy="10.457643" + r="6.6449099" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3390" + id="radialGradient3396" + cx="16.571363" + cy="4.5158162" + fx="16.571363" + fy="4.5158162" + r="6.96875" + gradientTransform="matrix(1.9142934,2.2544079e-3,-2.8759152e-3,2.4420352,-13.23958,-8.6794257)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3398" + id="linearGradient3404" + x1="8.3736019" + y1="2.9100885" + x2="25.498098" + y2="43.464977" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5992" + id="linearGradient5998" + x1="6.5056138" + y1="4.1361318" + x2="14.195889" + y2="20.028084" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0758542,0,0,2.0526248,1.1655453,1.4208674)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5992" + id="linearGradient6006" + x1="4.5483284" + y1="2.2576585" + x2="7.2317519" + y2="8.2374868" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5992" + id="linearGradient6014" + x1="3.1526313" + y1="2.9913363" + x2="5.5769644" + y2="7.6185937" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6016" + id="radialGradient6022" + cx="10.148121" + cy="9.4611959" + fx="10.148121" + fy="9.4611959" + r="8.0000286" + gradientTransform="matrix(2.0487225,-0.3333485,0.4394892,2.6401809,-2.7172146,-1.5449635)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6044" + id="radialGradient6050" + cx="11.228074" + cy="16.211924" + fx="11.228074" + fy="16.211924" + r="2.6223004" + gradientTransform="matrix(1,0,0,0.423375,0,9.3482007)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6026" + id="radialGradient6021" + cx="15.086278" + cy="12.519321" + fx="15.086278" + fy="12.519321" + r="9" + gradientTransform="matrix(-2.3334053,0.210666,-0.1418036,-1.6936244,60.083985,39.649881)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3398" + id="linearGradient6085" + gradientUnits="userSpaceOnUse" + x1="2.5554368" + y1="2.1035039" + x2="6.3627462" + y2="7.6472335" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3398" + id="linearGradient6089" + gradientUnits="userSpaceOnUse" + x1="7.5647373" + y1="2.6741056" + x2="5.5855722" + y2="4.8494081" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6107" + id="radialGradient6113" + cx="5.7251329" + cy="5.8061638" + fx="5.7251329" + fy="5.8061638" + r="3.8391297" + gradientTransform="matrix(1,0,0,0.9190153,0,0.4344651)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6107" + id="radialGradient6123" + cx="5.3649516" + cy="5.9023771" + fx="5.3649516" + fy="5.9023771" + r="3.8391297" + gradientTransform="matrix(1,0,0,0.9190153,0,0.4344651)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6067" + id="radialGradient5994" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.5438597,0,-5.3589507)" + cx="10.279492" + cy="9.8535538" + fx="10.279492" + fy="9.8535538" + r="1.1076201" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6067" + id="radialGradient5996" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,1.5438597,0,-5.3589507)" + cx="10.279492" + cy="9.8535538" + fx="10.279492" + fy="9.8535538" + r="1.1076201" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient6971" + id="radialGradient6977" + cx="24.466648" + cy="34.233986" + fx="24.466648" + fy="34.233986" + r="9.997899" + gradientTransform="matrix(1,0,0,0.1477394,0,25.308958)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient7025" + id="linearGradient7031" + x1="20.96875" + y1="23.8125" + x2="20.96875" + y2="26.067919" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient7033" + id="linearGradient7039" + x1="26.59375" + y1="23.8125" + x2="26.546921" + y2="25.90625" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2)" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#f28f8f" + borderopacity="1" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="16" + inkscape:cx="30.290912" + inkscape:cy="15.731532" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + fill="#eeeeec" + inkscape:window-width="1280" + inkscape:window-height="925" + inkscape:window-x="5" + inkscape:window-y="24" + width="48px" + height="48px" + inkscape:object-paths="true" + inkscape:object-nodes="true" + objecttolerance="12" + gridtolerance="8" + guidetolerance="6" + inkscape:showpageshadow="false" + showborder="true"> + <inkscape:grid + type="xygrid" + id="grid5394" + spacingx="0.5px" + spacingy="0.5px" + empspacing="2" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + <dc:title>face-monkey</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Ulisse Perusin</dc:title> + </cc:Agent> + </dc:creator> + <dc:contributor> + <cc:Agent> + <dc:title>based on the work of someone who didn't fill the metadata...</dc:title> + </cc:Agent> + </dc:contributor> + <dc:subject> + <rdf:Bag> + <rdf:li>emotes</rdf:li> + <rdf:li>monkey</rdf:li> + </rdf:Bag> + </dc:subject> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + sodipodi:type="arc" + style="opacity:1;fill:url(#radialGradient6113);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6014);stroke-width:0.56617205999999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3342" + sodipodi:cx="5.5769644" + sodipodi:cy="5.3647771" + sodipodi:rx="3.5560436" + sodipodi:ry="3.2451327" + d="M 9.133008,5.3647771 A 3.5560436,3.2451327 0 1 1 2.0209208,5.3647771 A 3.5560436,3.2451327 0 1 1 9.133008,5.3647771 z" + transform="matrix(1.6872684,0,0,1.8489229,-0.909836,10.580941)" /> + <path + transform="matrix(1.406057,0,0,1.5431057,0.5959699,12.229164)" + style="opacity:0.37647059;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6085);stroke-width:0.67889196;stroke-miterlimit:4;stroke-opacity:1" + d="M 9.133008,5.3647771 C 9.133008,7.1560903 7.5399005,8.6099098 5.5769644,8.6099098 C 3.6140283,8.6099098 2.0209208,7.1560903 2.0209208,5.3647771 C 2.0209208,3.5734638 3.6140283,2.1196444 5.5769644,2.1196444 C 7.5399005,2.1196444 9.133008,3.5734638 9.133008,5.3647771 z " + id="path6083" /> + <path + sodipodi:type="arc" + style="opacity:0.29999999999999999;fill:#5c3566;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3359" + sodipodi:cx="4.2750249" + sodipodi:cy="8.4155903" + sodipodi:rx="2.0597849" + sodipodi:ry="1.3602352" + d="M 6.3348098,8.4155903 A 2.0597849,1.3602352 0 1 1 2.21524,8.4155903 A 2.0597849,1.3602352 0 1 1 6.3348098,8.4155903 z" + transform="matrix(1.8498752,0,0,2.9620487,1.9020826,-3.8983056)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:url(#radialGradient6123);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6006);stroke-width:0.56617187999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3344" + sodipodi:cx="5.5769644" + sodipodi:cy="5.3647771" + sodipodi:rx="3.5560436" + sodipodi:ry="3.2451327" + d="M 9.133008,5.3647771 A 3.5560436,3.2451327 0 1 1 2.0209208,5.3647771 A 3.5560436,3.2451327 0 1 1 9.133008,5.3647771 z" + transform="matrix(1.6872685,0,0,1.848923,30.090164,10.58094)" /> + <path + style="opacity:0.25098039;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 37.357012,14.339669 C 38.272734,14.091905 39.199186,13.892425 40.197153,14.014764 C 40.072526,16.747787 39.494573,19.332396 39.024372,22.090832 C 40.71531,23.5377 41.427614,25.01852 42,26.5 C 41.323974,26.812313 40.227723,27.081771 39.069306,27 C 36.266476,23.990483 34.743011,20.018762 37.357012,14.339669 z" + id="path6042" + sodipodi:nodetypes="cccccc" /> + <path + transform="matrix(1.406057,0,0,1.5431057,31.59597,12.229164)" + style="opacity:0.37647059;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6089);stroke-width:0.67889196;stroke-miterlimit:4;stroke-opacity:1" + d="M 9.133008,5.3647771 C 9.133008,7.1560903 7.5399005,8.6099098 5.5769644,8.6099098 C 3.6140283,8.6099098 2.0209208,7.1560903 2.0209208,5.3647771 C 2.0209208,3.5734638 3.6140283,2.1196444 5.5769644,2.1196444 C 7.5399005,2.1196444 9.133008,3.5734638 9.133008,5.3647771 z " + id="path6087" /> + <path + sodipodi:type="arc" + style="opacity:0.3;fill:#5c3566;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3361" + sodipodi:cx="4.2750249" + sodipodi:cy="8.4155903" + sodipodi:rx="2.0597849" + sodipodi:ry="1.3602352" + d="M 6.3348098,8.4155903 A 2.0597849,1.3602352 0 1 1 2.21524,8.4155903 A 2.0597849,1.3602352 0 1 1 6.3348098,8.4155903 z" + transform="matrix(1.8869741,0,0,2.9576809,30.046378,-3.8505306)" /> + <path + sodipodi:type="arc" + style="opacity:0.6;fill:url(#radialGradient3363);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3140" + sodipodi:cx="10.748654" + sodipodi:cy="10.457643" + sodipodi:rx="6.6449099" + sodipodi:ry="2.3675451" + d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" + transform="matrix(3.0098139,0,0,2.9630238,-8.3758807,8.9986641)" /> + <path + style="fill:url(#radialGradient6022);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5998);stroke-width:1.00000011999999994;stroke-miterlimit:4;stroke-opacity:1" + d="M 24.007921,4.4999999 C 15.737268,4.4999999 10.522194,9.0672863 10.522193,16.535901 L 11.544815,23.99974 C 9.3634284,25.095588 8.4310344,28.104989 8.4310344,31.183926 C 8.4310344,37.162551 13.62067,43.433324 24.014827,43.499468 C 34.544937,43.567169 39.568848,37.162551 39.568845,31.183926 C 39.582185,28.101693 38.486594,25.240757 36.455064,23.99974 L 37.507459,16.535901 C 37.507459,8.7636853 32.278573,4.4999999 24.007921,4.4999999 z" + id="path3346" + sodipodi:nodetypes="ccccscccs" /> + <path + style="opacity:0.5;fill:url(#radialGradient3396);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3404);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 24,5.53125 C 20.051508,5.53125 16.952589,6.5940986 14.84375,8.46875 C 12.734911,10.343401 11.5625,13.032657 11.5625,16.53125 L 12.53125,23.875 C 12.587063,24.29599 12.375182,24.707288 12,24.90625 C 11.192274,25.312021 10.563506,26.102241 10.125,27.21875 C 9.6864936,28.335259 9.46875,29.748389 9.46875,31.1875 C 9.4687503,36.580578 14.01212,42.405191 24,42.46875 C 34.116273,42.533788 38.531253,36.59598 38.53125,31.1875 C 38.543556,28.344349 37.511683,25.836634 35.9375,24.875 C 35.597929,24.663086 35.414403,24.271563 35.46875,23.875 L 36.46875,16.53125 C 36.46875,12.873011 35.296173,10.209067 33.1875,8.375 C 31.078827,6.540933 27.960923,5.53125 24,5.53125 z " + id="path3380" /> + <path + style="opacity:1;fill:url(#radialGradient6021);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 18.944444,13.001625 C 15.356444,13.001625 13.888889,15.443388 13.888889,19.001301 C 13.888889,20.780259 14.378332,22.631569 14.989583,24.000895 C 12.010416,24.806582 9.9375,25.813313 9.9375,31.063029 C 9.9375,35.806909 16,41 24,41 C 32,41 38.03125,35.744409 38.03125,31.000529 C 38.03125,26.500773 35.989585,24.775332 33.010416,23.969645 C 33.732639,22.469725 34.111111,20.780259 34.111111,19.001301 C 34.111111,15.443388 32.642185,13.099954 29.055555,13.001625 C 26.872133,12.942584 24.722221,14.501545 24.059542,16.075628 C 23.277778,14.501545 21.301818,13.060668 18.944444,13.001625 z " + id="path3357" + sodipodi:nodetypes="cscssscsscc" /> + <path + sodipodi:type="arc" + style="opacity:0.22000002;fill:url(#radialGradient6050);fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5982" + sodipodi:cx="11.228074" + sodipodi:cy="16.211924" + sodipodi:rx="2.6223004" + sodipodi:ry="1.1102164" + d="M 13.850374 16.211924 A 2.6223004 1.1102164 0 1 1 8.6057737,16.211924 A 2.6223004 1.1102164 0 1 1 13.850374 16.211924 z" + transform="matrix(2.6729049,0,0,2.2640107,-6.0896987,-16.21751)" /> + <path + style="opacity:0.5;fill:url(#radialGradient6977);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 33.995257,28.078681 C 34.038381,31.739813 31.509745,30.918015 24.08169,30.92737 C 16.661276,30.936716 14,31.647754 14,28.045833 C 15.566613,29.578661 17.158297,29.505774 24.08169,29.486602 C 31.011105,29.467413 32.659269,29.624691 33.995257,28.078681 z " + id="path6969" + sodipodi:nodetypes="czczc" /> + <path + style="opacity:1;fill:#503201;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 33.995257,28.068134 C 34.038381,30.553717 31.509745,29.995789 24.08169,30.00214 C 16.661276,30.008485 14,30.491217 14,28.045833 C 15.566613,29.086487 17.158297,29.037003 24.08169,29.023987 C 31.011105,29.010959 32.659269,29.117737 33.995257,28.068134 z " + id="path2186" + sodipodi:nodetypes="czczc" /> + <g + id="g5986" + transform="translate(2,0)"> + <path + transform="matrix(1.8056732,0,0,1.1695839,-0.5614042,6.4754422)" + d="M 11.387112 9.8535538 A 1.1076201 1.7100101 0 1 1 9.1718723,9.8535538 A 1.1076201 1.7100101 0 1 1 11.387112 9.8535538 z" + sodipodi:ry="1.7100101" + sodipodi:rx="1.1076201" + sodipodi:cy="9.8535538" + sodipodi:cx="10.279492" + id="path6024" + style="opacity:1;fill:url(#radialGradient5996);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.79457355;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:type="arc" /> + <path + transform="matrix(2.3209022,0,0,2.4214654,3.3518098,-3.7210354)" + d="M 6.5000002 8.5870266 A 0.43086693 0.41297308 0 1 1 5.6382664,8.5870266 A 0.43086693 0.41297308 0 1 1 6.5000002 8.5870266 z" + sodipodi:ry="0.41297308" + sodipodi:rx="0.43086693" + sodipodi:cy="8.5870266" + sodipodi:cx="6.0691333" + id="path5974" + style="opacity:0.43921569;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:type="arc" /> + </g> + <g + id="g5990" + transform="translate(-2,0)"> + <path + transform="matrix(1.8056732,0,0,1.1695839,11.438596,6.4754422)" + d="M 11.387112 9.8535538 A 1.1076201 1.7100101 0 1 1 9.1718723,9.8535538 A 1.1076201 1.7100101 0 1 1 11.387112 9.8535538 z" + sodipodi:ry="1.7100101" + sodipodi:rx="1.1076201" + sodipodi:cy="9.8535538" + sodipodi:cx="10.279492" + id="path3340" + style="opacity:1;fill:url(#radialGradient5994);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:type="arc" /> + <path + transform="matrix(2.2384755,0,0,2.414016,15.878879,-3.732296)" + d="M 6.5000002 8.5870266 A 0.43086693 0.41297308 0 1 1 5.6382664,8.5870266 A 0.43086693 0.41297308 0 1 1 6.5000002 8.5870266 z" + sodipodi:ry="0.41297308" + sodipodi:rx="0.43086693" + sodipodi:cy="8.5870266" + sodipodi:cx="6.0691333" + id="path5976" + style="opacity:0.43921569;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:type="arc" /> + </g> + <path + style="opacity:1;fill:url(#linearGradient7031);fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 21.5,21.8125 C 20.672,21.8125 20,22.523051 20,23.40625 C 20,23.417181 19.999795,23.426621 20,23.4375 C 20.700987,23.138082 21.727934,22.928798 22.90625,22.84375 C 22.6946,22.233767 22.14515,21.812499 21.5,21.8125 z " + id="path6979" /> + <path + style="opacity:1;fill:url(#linearGradient7039);fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 26.5,21.8125 C 25.85485,21.812499 25.3054,22.233767 25.09375,22.84375 C 26.272066,22.928798 27.299013,23.138082 28,23.4375 C 28.000205,23.426621 28,23.417181 28,23.40625 C 28,22.523051 27.328,21.8125 26.5,21.8125 z " + id="path6997" /> + </g> +</svg> diff --git a/sflphone-gtk/pixmaps/home.svg b/sflphone-gtk/pixmaps/home.svg new file mode 100644 index 0000000000000000000000000000000000000000..3520b510cd2e9eb6a033b04cd739cf8db8c6dd36 --- /dev/null +++ b/sflphone-gtk/pixmaps/home.svg @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + overflow="visible" + enable-background="new 0 0 128 129.396" + xml:space="preserve" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.43+devel" + sodipodi:docname="go-home.svg" + sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions" + version="1.0" + inkscape:export-filename="/home/tigert/My Downloads/go-home.png" + inkscape:export-xdpi="90.000000" + inkscape:export-ydpi="90.000000"><metadata + id="metadata367"><rdf:RDF><cc:Work + rdf:about=""><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/by-sa/2.0/" /><dc:title>Go Home</dc:title><dc:creator><cc:Agent><dc:title>Jakub Steiner</dc:title></cc:Agent></dc:creator><dc:source>http://jimmac.musichall.cz</dc:source><dc:subject><rdf:Bag><rdf:li>home</rdf:li><rdf:li>return</rdf:li><rdf:li>go</rdf:li><rdf:li>default</rdf:li><rdf:li>user</rdf:li><rdf:li>directory</rdf:li></rdf:Bag></dc:subject><dc:contributor><cc:Agent><dc:title>Tuomas Kuosmanen</dc:title></cc:Agent></dc:contributor></cc:Work><cc:License + rdf:about="http://creativecommons.org/licenses/by-sa/2.0/"><cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /><cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /><cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /><cc:requires + rdf:resource="http://web.resource.org/cc/Attribution" /><cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /><cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /></cc:License></rdf:RDF></metadata><defs + id="defs365"><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5031" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + inkscape:collect="always" + id="linearGradient5060"><stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop5062" /><stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5064" /></linearGradient><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5029" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + id="linearGradient5048"><stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop5050" /><stop + id="stop5056" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /><stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5052" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient5027" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /><linearGradient + id="linearGradient2406"><stop + style="stop-color:#7c7e79;stop-opacity:1;" + offset="0" + id="stop2408" /><stop + id="stop2414" + offset="0.1724138" + style="stop-color:#848681;stop-opacity:1;" /><stop + style="stop-color:#898c86;stop-opacity:1;" + offset="1" + id="stop2410" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2390"><stop + style="stop-color:#919191;stop-opacity:1;" + offset="0" + id="stop2392" /><stop + style="stop-color:#919191;stop-opacity:0;" + offset="1" + id="stop2394" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2378"><stop + style="stop-color:#575757;stop-opacity:1;" + offset="0" + id="stop2380" /><stop + style="stop-color:#575757;stop-opacity:0;" + offset="1" + id="stop2382" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2368"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop2370" /><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop2372" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2349"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop2351" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop2353" /></linearGradient><linearGradient + id="linearGradient2341"><stop + id="stop2343" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /><stop + id="stop2345" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient2329"><stop + style="stop-color:#000000;stop-opacity:0.18556701;" + offset="0" + id="stop2331" /><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop2333" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2319"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop2321" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop2323" /></linearGradient><linearGradient + id="linearGradient2307"><stop + style="stop-color:#edd400;stop-opacity:1;" + offset="0" + id="stop2309" /><stop + style="stop-color:#998800;stop-opacity:1;" + offset="1" + id="stop2311" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2299"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop2301" /><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop2303" /></linearGradient><linearGradient + id="XMLID_2_" + gradientUnits="userSpaceOnUse" + x1="80.223602" + y1="117.5205" + x2="48.046001" + y2="59.7995" + gradientTransform="matrix(0.314683,0.000000,0.000000,0.314683,4.128264,3.742874)"> + <stop + offset="0" + style="stop-color:#CCCCCC" + id="stop17" /> + <stop + offset="0.9831" + style="stop-color:#FFFFFF" + id="stop19" /> + <midPointStop + offset="0" + style="stop-color:#CCCCCC" + id="midPointStop48" /> + <midPointStop + offset="0.5" + style="stop-color:#CCCCCC" + id="midPointStop50" /> + <midPointStop + offset="0.9831" + style="stop-color:#FFFFFF" + id="midPointStop52" /> + </linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient1514" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.336922,0.000000,0.000000,0.166888,17.98288,15.46151)" + x1="52.006104" + y1="166.1331" + x2="14.049017" + y2="-42.218513" /><linearGradient + id="XMLID_39_" + gradientUnits="userSpaceOnUse" + x1="64.387703" + y1="65.124001" + x2="64.387703" + y2="35.569" + gradientTransform="matrix(0.354101,0.000000,0.000000,0.354101,1.638679,-8.364921e-2)"> + <stop + offset="0" + style="stop-color:#FFFFFF" + id="stop336" /> + <stop + offset="0.8539" + style="stop-color:#FF6200" + id="stop338" /> + <stop + offset="1" + style="stop-color:#F25D00" + id="stop340" /> + <midPointStop + offset="0" + style="stop-color:#FFFFFF" + id="midPointStop335" /> + <midPointStop + offset="0.5" + style="stop-color:#FFFFFF" + id="midPointStop337" /> + <midPointStop + offset="0.8539" + style="stop-color:#FF6200" + id="midPointStop339" /> + <midPointStop + offset="0.5" + style="stop-color:#FF6200" + id="midPointStop341" /> + <midPointStop + offset="1" + style="stop-color:#F25D00" + id="midPointStop343" /> + </linearGradient><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2299" + id="radialGradient2305" + cx="7.5326638" + cy="24.202574" + fx="7.5326638" + fy="24.202574" + r="8.2452128" + gradientTransform="matrix(4.100086,-1.627292e-17,2.125447e-14,4.201322,-25.41506,-78.53967)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2307" + id="radialGradient2313" + cx="19.985598" + cy="36.77816" + fx="19.985598" + fy="36.77816" + r="1.0821035" + gradientTransform="matrix(1.125263,0.000000,0.000000,0.982744,-3.428678,0.565787)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2319" + id="radialGradient2325" + cx="20.443665" + cy="37.425829" + fx="20.443665" + fy="37.425829" + r="1.0821035" + gradientTransform="matrix(1.125263,0.000000,0.000000,0.982744,-3.428678,0.731106)" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2329" + id="linearGradient2335" + x1="17.602522" + y1="26.057423" + x2="17.682528" + y2="32.654099" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.898789,0,0,1.071914,0.478025,-2.080838)" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2341" + id="radialGradient2339" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(4.100086,1.627292e-17,2.125447e-14,-4.201322,-5.198109,105.3535)" + cx="11.68129" + cy="19.554111" + fx="11.68129" + fy="19.554111" + r="8.2452126" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2349" + id="radialGradient2355" + cx="24.023088" + cy="40.56913" + fx="24.023088" + fy="40.56913" + r="16.28684" + gradientTransform="matrix(1.000000,0.000000,0.000000,0.431250,1.157278e-15,23.07369)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2368" + id="radialGradient2374" + cx="29.913452" + cy="30.442923" + fx="29.913452" + fy="30.442923" + r="4.0018832" + gradientTransform="matrix(3.751495,-2.191984e-22,1.723265e-22,3.147818,-82.00907,-65.70704)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2378" + id="radialGradient2384" + cx="24.195112" + cy="10.577631" + fx="24.195112" + fy="10.577631" + r="15.242914" + gradientTransform="matrix(1.125263,-3.585417e-8,4.269819e-8,1.340059,-3.006704,1.355395)" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2390" + id="linearGradient2396" + x1="30.603519" + y1="37.337803" + x2="30.603519" + y2="36.112415" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.263867,0,0,0.859794,-6.499556,8.390924)" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2406" + id="linearGradient2412" + x1="17.850183" + y1="28.939463" + x2="19.040216" + y2="41.03223" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.888785,0,0,1.08932,2.41099,-1.524336)" /></defs><sodipodi:namedview + inkscape:cy="-2.3755359" + inkscape:cx="25.234802" + inkscape:zoom="1" + inkscape:window-height="691" + inkscape:window-width="872" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="0.21568627" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:showpageshadow="false" + inkscape:window-x="466" + inkscape:window-y="224" + inkscape:current-layer="svg2" + fill="#555753" + showgrid="false" + stroke="#a40000" + showguides="true" + inkscape:guide-bbox="true" /> + <g + style="display:inline" + id="g5022" + transform="matrix(2.158196e-2,0,0,1.859457e-2,43.12251,41.63767)"><rect + y="-150.69685" + x="-1559.2523" + height="478.35718" + width="1339.6335" + id="rect4173" + style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /><path + sodipodi:nodetypes="cccc" + id="path5058" + d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " + style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /><path + style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " + id="path5018" + sodipodi:nodetypes="cccc" /></g><path + style="color:#000000;fill:url(#linearGradient1514);fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.0000006;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 21.619576,8.1833733 L 27.577035,8.1833733 C 28.416767,8.1833733 41.46351,23.618701 41.46351,24.524032 L 41.019989,43.020777 C 41.019989,43.92611 40.343959,44.654954 39.504227,44.654954 L 8.0469496,44.654954 C 7.2072167,44.654954 6.5311871,43.92611 6.5311871,43.020777 L 6.5876651,24.524032 C 6.5876651,23.618701 20.779844,8.1833733 21.619576,8.1833733 z " + id="rect1512" + sodipodi:nodetypes="ccccccccc" /><path + style="fill:none" + id="path5" + d="M 46.963575,45.735573 L 1.6386762,45.735573 L 1.6386762,0.41067554 L 46.963575,0.41067554 L 46.963575,45.735573 z " /><path + style="fill:url(#linearGradient2335);fill-opacity:1;fill-rule:evenodd" + id="path2327" + d="M 23,29 L 22.954256,44.090942 L 11.111465,44.090942 L 11,29 L 23,29 z " + clip-rule="evenodd" + sodipodi:nodetypes="ccccc" /><path + sodipodi:nodetypes="ccccccccc" + id="path2357" + d="M 21.780459,9.405584 L 27.339556,9.405584 C 28.123138,9.405584 40.340425,23.805172 40.340425,24.649756 L 39.993267,42.862067 C 39.993267,43.321326 39.84953,43.515532 39.480892,43.515532 L 8.0936894,43.529812 C 7.7250517,43.529812 7.5097258,43.449894 7.5097258,43.076262 L 7.7250676,24.649756 C 7.7250676,23.805172 20.99688,9.405584 21.780459,9.405584 z " + style="opacity:0.3125;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /><path + clip-rule="evenodd" + d="M 7.2075295,27.943053 L 7.1532728,30.538247 L 25.521437,17.358993 L 40.807832,28.513421 L 40.879142,28.201707 L 24.508686,12.297576 L 7.2075295,27.943053 z " + id="path23" + style="opacity:0.2;fill:url(#radialGradient2384);fill-opacity:1;fill-rule:evenodd" + sodipodi:nodetypes="ccccccc" /><path + clip-rule="evenodd" + d="M 22,30 L 22,44.090942 L 12.188971,44.090942 L 12,30 L 22,30 z " + id="path188" + style="fill:url(#linearGradient2412);fill-opacity:1;fill-rule:evenodd" + sodipodi:nodetypes="ccccc" /><path + style="opacity:0.40909089;fill:url(#radialGradient2325);fill-opacity:1;fill-rule:evenodd" + id="path2315" + d="M 19.576856,36.44767 C 20.249646,36.44767 20.793472,36.922275 20.793472,37.506177 C 20.793472,38.095988 20.249646,38.574532 19.576856,38.574532 C 18.904584,38.574532 18.35817,38.095988 18.35817,37.506177 C 18.358685,36.922275 18.904584,36.44767 19.576856,36.44767 z " + clip-rule="evenodd" /><path + clip-rule="evenodd" + d="M 19.462314,35.932229 C 20.135103,35.932229 20.678929,36.406834 20.678929,36.990736 C 20.678929,37.580545 20.135103,38.059089 19.462314,38.059089 C 18.790041,38.059089 18.243627,37.580545 18.243627,36.990736 C 18.244142,36.406834 18.790041,35.932229 19.462314,35.932229 z " + id="path217" + style="fill:url(#radialGradient2313);fill-opacity:1;fill-rule:evenodd" /><path + d="M 24.447748,11.559337 L 43.374808,28.729205 L 43.869487,29.121196 L 44.273163,28.949811 L 43.900293,28.188138 L 43.622679,27.964702 L 24.447748,12.392396 L 5.0582327,28.135731 L 4.8206309,28.279851 L 4.603921,28.986637 L 5.0373408,29.115885 L 5.4218948,28.807462 L 24.447748,11.559337 z " + id="path342" + style="fill:url(#XMLID_39_)" + sodipodi:nodetypes="ccccccccccccc" /><path + style="fill:#ef2929;stroke:#a40000" + id="path362" + d="M 24.330168,2.2713382 L 2.4484294,20.372675 L 1.8237005,27.538603 L 3.8236367,29.602926 C 3.8236367,29.602926 24.231018,12.445641 24.44773,12.274963 L 44.08027,29.818223 L 45.978694,27.494226 L 44.362903,20.382852 L 24.44773,2.1668788 L 24.330168,2.2713382 z " + sodipodi:nodetypes="cccccccccc" /> +<path + style="opacity:0.40909089;color:#000000;fill:url(#radialGradient2305);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 2.8413446,20.613129 L 2.5497894,27.236494 L 24.369219,8.980075 L 24.298891,3.0867443 L 2.8413446,20.613129 z " + id="path1536" + sodipodi:nodetypes="ccccc" /><path + sodipodi:nodetypes="ccccc" + id="path2337" + d="M 24.483763,8.7509884 L 24.583223,2.9098867 L 43.912186,20.56184 L 45.403998,27.062652 L 24.483763,8.7509884 z " + style="opacity:0.13636367;color:#000000;fill:url(#radialGradient2339);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /><path + style="opacity:0.31818183;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999934;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 27.102228,27.719824 L 36.142223,27.719824 C 36.912818,27.719824 37.53319,28.340194 37.53319,29.110791 L 37.525229,38.190012 C 37.525229,38.960608 36.928907,39.455981 36.158311,39.455981 L 27.102228,39.455981 C 26.331631,39.455981 25.711261,38.835608 25.711261,38.065012 L 25.711261,29.110791 C 25.711261,28.340194 26.331631,27.719824 27.102228,27.719824 z " + id="rect2361" + sodipodi:nodetypes="ccccccccc" /><rect + style="opacity:1;color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="rect3263" + width="10.001333" + height="9.9624557" + x="26.507767" + y="28.514256" + rx="0.38128215" + ry="0.38128215" /><path + style="opacity:0.39772728;color:#000000;fill:url(#radialGradient2374);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 27.107118,34.408261 C 30.725101,34.739438 32.634842,32.962557 35.97527,32.855521 L 36,29.00603 L 27.088388,29 L 27.107118,34.408261 z " + id="rect2363" + sodipodi:nodetypes="ccccc" /></svg> \ No newline at end of file diff --git a/sflphone-gtk/pixmaps/users.svg b/sflphone-gtk/pixmaps/users.svg new file mode 100644 index 0000000000000000000000000000000000000000..5be1babf931e40c790e8636cd53403a6cf715063 --- /dev/null +++ b/sflphone-gtk/pixmaps/users.svg @@ -0,0 +1,559 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48px" + height="48px" + id="svg2108" + sodipodi:version="0.32" + inkscape:version="0.45" + sodipodi:docbase="/home/dobey/Projects/gnome-icon-theme/scalable/apps" + sodipodi:docname="system-users.svg" + inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-icon-theme/48x48/stock/generic/stock_person.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs3"> + <linearGradient + inkscape:collect="always" + id="linearGradient5060"> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop5062" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5064" /> + </linearGradient> + <linearGradient + id="linearGradient5048"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop5050" /> + <stop + id="stop5056" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5052" /> + </linearGradient> + <linearGradient + id="linearGradient4562"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4564" /> + <stop + style="stop-color:#d6d6d2;stop-opacity:1;" + offset="1" + id="stop4566" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient4356"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4358" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4360" /> + </linearGradient> + <linearGradient + id="linearGradient3824"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3826" /> + <stop + style="stop-color:#c9c9c9;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop3828" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3816"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3818" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3820" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3824" + id="linearGradient5462" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.33835,0,0,1.33835,-36.66116,-20.70004)" + x1="30.935921" + y1="29.553486" + x2="30.935921" + y2="35.803486" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient5464" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.308485,0.281154,0.281154,1.308485,35.90908,-26.21225)" + x1="22.686766" + y1="36.390400" + x2="21.408455" + y2="35.739632" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient5466" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5468" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5470" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4562" + id="radialGradient5472" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.046177,0,-2.580083e-8,1.017815,-9.084376,-6.268494)" + cx="24.753788" + cy="26.814409" + fx="24.753788" + fy="26.814409" + r="17.986024" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient5474" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.999008,0.214863,0.214657,0.999968,41.63405,-13.05229)" + x1="22.686766" + y1="36.390400" + x2="21.408455" + y2="35.739632" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient5476" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.004822,0.185726,-0.185548,1.005788,-9.182192,-11.89716)" + x1="20.661695" + y1="35.817974" + x2="22.626925" + y2="36.217758" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3816" + id="radialGradient5478" + gradientUnits="userSpaceOnUse" + cx="31.112698" + cy="19.008621" + fx="31.112698" + fy="19.008621" + r="8.6620579" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4562" + id="radialGradient5480" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.558489,0,-1.377346e-8,0.563387,14.87134,4.364123)" + cx="29.922075" + cy="17.727694" + fx="29.922075" + fy="17.727694" + r="17.986024" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3824" + id="linearGradient5482" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.33835,0,0,1.33835,-36.66116,-20.70004)" + x1="30.935921" + y1="29.553486" + x2="30.935921" + y2="35.803486" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient5484" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1.308485,0.281154,0.281154,1.308485,35.90908,-26.21225)" + x1="22.686766" + y1="36.390400" + x2="21.408455" + y2="35.739632" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient5486" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5488" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5490" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4562" + id="radialGradient5492" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.046177,0,-2.580083e-8,1.017815,-9.084376,-6.268494)" + cx="24.753788" + cy="26.814409" + fx="24.753788" + fy="26.814409" + r="17.986024" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient5494" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.999008,0.214863,0.214657,0.999968,41.63405,-13.05229)" + x1="22.686766" + y1="36.390400" + x2="21.408455" + y2="35.739632" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4356" + id="linearGradient5496" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.004822,0.185726,-0.185548,1.005788,-9.182192,-11.89716)" + x1="20.661695" + y1="35.817974" + x2="22.626925" + y2="36.217758" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3816" + id="radialGradient5498" + gradientUnits="userSpaceOnUse" + cx="31.112698" + cy="19.008621" + fx="31.112698" + fy="19.008621" + r="8.6620579" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4562" + id="radialGradient5500" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.558489,0,-1.377346e-8,0.563387,14.87134,4.364123)" + cx="29.922075" + cy="17.727694" + fx="29.922075" + fy="17.727694" + r="17.986024" /> + </defs> + <sodipodi:namedview + inkscape:showpageshadow="false" + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="0.16862745" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="52.946513" + inkscape:cy="-8.8981619" + inkscape:current-layer="layer2" + showgrid="true" + inkscape:grid-bbox="true" + inkscape:document-units="px" + fill="#9db029" + stroke="#727e0a" + inkscape:window-width="866" + inkscape:window-height="957" + inkscape:window-x="2420" + inkscape:window-y="156" /> + <metadata + id="metadata4"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>Person</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Jakub Steiner</dc:title> + </cc:Agent> + </dc:creator> + <dc:source>http://jimmac.musichall.cz</dc:source> + <dc:subject> + <rdf:Bag> + <rdf:li>user</rdf:li> + <rdf:li>person</rdf:li> + </rdf:Bag> + </dc:subject> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/SourceCode" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="cipek" + inkscape:groupmode="layer" + style="display:inline" /> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="dalsi cipek" + style="display:inline"> + <g + id="g5419" + style="opacity:0.78857141" + transform="translate(1,3)"> + <path + id="path4173" + d="M 10.183488,24.850231 L 15.861626,24.850231 L 12.54938,21.774572 L 11.839612,22.720929 L 11.129844,22.011162 L 10.183488,24.850231 z " + style="opacity:1;color:black;fill:url(#linearGradient5482);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + style="opacity:0.22784807;color:black;fill:url(#linearGradient5484);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 16.700942,32.490544 C 18.348787,31.712992 19.115834,29.810737 19.115834,29.810737 C 17.832196,24.39981 13.794355,20.652646 13.794355,20.652646 C 13.794355,20.652646 17.092843,29.141269 16.700942,32.490544 z " + id="path4370" + sodipodi:nodetypes="cccc" /> + <g + transform="matrix(1.443435e-2,0,0,1.697277e-2,30.00245,30.05774)" + id="g5022" + style="display:inline"> + <rect + style="opacity:0.40206185;color:black;fill:url(#linearGradient5486);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="rect4173" + width="1339.6335" + height="478.35718" + x="-1559.2523" + y="-150.69685" /> + <path + style="opacity:0.40206185;color:black;fill:url(#radialGradient5488);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " + id="path5058" + sodipodi:nodetypes="cccc" /> + <path + sodipodi:nodetypes="cccc" + id="path5018" + d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " + style="opacity:0.40206185;color:black;fill:url(#radialGradient5490);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + </g> + <path + sodipodi:nodetypes="cczcczc" + id="path4308" + d="M 11.666184,33.499999 L 22.630126,33.499999 C 25.736577,33.499999 28.812096,32.401458 29.939419,29.270409 C 31.00995,26.297106 30.122153,20.634992 23.178323,16.052935 L 10.204323,16.052935 C 3.2604944,20.282525 2.3927351,26.06687 3.9914241,29.446641 C 5.6201015,32.889807 8.3770015,33.499999 11.666184,33.499999 z " + style="opacity:1;color:black;fill:url(#radialGradient5492);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999928px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + inkscape:r_cy="true" + inkscape:r_cx="true" + style="opacity:0.29120878;color:black;fill:url(#linearGradient5494);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 26.968941,31.809458 C 28.227045,31.215239 28.812673,29.761502 28.812673,29.761502 C 27.832636,25.626372 24.749806,22.762722 24.749806,22.762722 C 24.749806,22.762722 27.268151,29.249881 26.968941,31.809458 z " + id="path4364" + sodipodi:nodetypes="cccc" /> + <path + inkscape:r_cy="true" + inkscape:r_cx="true" + sodipodi:nodetypes="cccc" + id="path4354" + d="M 6.7785466,32.51927 C 5.5037298,31.961879 4.9331641,30.618639 4.9331641,30.618639 C 5.7927935,26.456761 8.7342195,23.411829 8.7342195,23.411829 C 8.7342195,23.411829 6.4051874,29.969472 6.7785466,32.51927 z " + style="opacity:0.54945056;color:black;fill:url(#linearGradient5496);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + style="opacity:0.64285715;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999863px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 11.614344,32.499985 L 22.544063,32.477728 C 25.293538,32.477728 28.01563,31.502849 29.013408,28.724263 C 29.96092,26.085665 28.914748,21.060936 22.768871,16.994681 L 10.764996,16.749865 C 4.6191173,20.503331 3.429572,25.636533 4.8675621,28.880657 C 6.3055541,32.124781 8.4039325,32.477728 11.614344,32.499985 z " + id="path4314" + sodipodi:nodetypes="cczcczc" /> + <path + transform="matrix(1.021809,0,0,1.022791,-15.11053,-5.36187)" + sodipodi:type="arc" + style="opacity:1;color:black;fill:url(#radialGradient5498);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4318" + sodipodi:cx="31.112698" + sodipodi:cy="19.008621" + sodipodi:rx="8.6620579" + sodipodi:ry="8.6620579" + d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z" /> + <path + transform="matrix(0.981291,0,0,0.981291,-13.71259,-7.652994)" + d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z" + sodipodi:ry="8.6620579" + sodipodi:rx="8.6620579" + sodipodi:cy="19.008621" + sodipodi:cx="31.112698" + id="path4320" + style="opacity:1;color:black;fill:url(#radialGradient5500);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.0190649px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" /> + <path + transform="matrix(0.865845,0,0,0.865845,-10.12076,-5.458528)" + sodipodi:type="arc" + style="opacity:0.52571429;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.15494144px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path4322" + sodipodi:cx="31.112698" + sodipodi:cy="19.008621" + sodipodi:rx="8.6620579" + sodipodi:ry="8.6620579" + d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z" /> + </g> + <g + id="g5434" + transform="translate(11.78858,8.906086)"> + <path + style="opacity:1;color:black;fill:url(#linearGradient5462);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 10.183488,24.850231 L 15.861626,24.850231 L 12.54938,21.774572 L 11.839612,22.720929 L 11.129844,22.011162 L 10.183488,24.850231 z " + id="path5436" /> + <path + sodipodi:nodetypes="cccc" + id="path5438" + d="M 16.700942,32.490544 C 18.348787,31.712992 19.115834,29.810737 19.115834,29.810737 C 17.832196,24.39981 13.794355,20.652646 13.794355,20.652646 C 13.794355,20.652646 17.092843,29.141269 16.700942,32.490544 z " + style="opacity:0.22784807;color:black;fill:url(#linearGradient5464);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <g + style="display:inline" + id="g5440" + transform="matrix(1.443435e-2,0,0,1.697277e-2,30.00245,30.05774)"> + <rect + y="-150.69685" + x="-1559.2523" + height="478.35718" + width="1339.6335" + id="rect5442" + style="opacity:0.40206185;color:black;fill:url(#linearGradient5466);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + sodipodi:nodetypes="cccc" + id="path5444" + d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z " + style="opacity:0.40206185;color:black;fill:url(#radialGradient5468);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + style="opacity:0.40206185;color:black;fill:url(#radialGradient5470);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z " + id="path5446" + sodipodi:nodetypes="cccc" /> + </g> + <path + style="opacity:1;color:black;fill:url(#radialGradient5472);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999928px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 11.666184,33.499999 L 22.630126,33.499999 C 25.736577,33.499999 28.812096,32.401458 29.939419,29.270409 C 31.00995,26.297106 30.122153,20.634992 23.178323,16.052935 L 10.204323,16.052935 C 3.2604944,20.282525 2.3927351,26.06687 3.9914241,29.446641 C 5.6201015,32.889807 8.3770015,33.499999 11.666184,33.499999 z " + id="path5448" + sodipodi:nodetypes="cczcczc" /> + <path + sodipodi:nodetypes="cccc" + id="path5450" + d="M 26.968941,31.809458 C 28.227045,31.215239 28.812673,29.761502 28.812673,29.761502 C 27.832636,25.626372 24.749806,22.762722 24.749806,22.762722 C 24.749806,22.762722 27.268151,29.249881 26.968941,31.809458 z " + style="opacity:0.29120878;color:black;fill:url(#linearGradient5474);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + <path + style="opacity:0.54945056;color:black;fill:url(#linearGradient5476);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + d="M 6.7785466,32.51927 C 5.5037298,31.961879 4.9331641,30.618639 4.9331641,30.618639 C 5.7927935,26.456761 8.7342195,23.411829 8.7342195,23.411829 C 8.7342195,23.411829 6.4051874,29.969472 6.7785466,32.51927 z " + id="path5452" + sodipodi:nodetypes="cccc" + inkscape:r_cx="true" + inkscape:r_cy="true" /> + <path + sodipodi:nodetypes="cczcczc" + id="path5454" + d="M 11.614344,32.499985 L 22.544063,32.477728 C 25.293538,32.477728 28.01563,31.502849 29.013408,28.724263 C 29.96092,26.085665 28.914748,21.060936 22.768871,16.994681 L 10.764996,16.749865 C 4.6191173,20.503331 3.429572,25.636533 4.8675621,28.880657 C 6.3055541,32.124781 8.4039325,32.477728 11.614344,32.499985 z " + style="opacity:0.64285715;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999863px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z" + sodipodi:ry="8.6620579" + sodipodi:rx="8.6620579" + sodipodi:cy="19.008621" + sodipodi:cx="31.112698" + id="path5456" + style="opacity:1;color:black;fill:url(#radialGradient5478);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" + transform="matrix(1.021809,0,0,1.022791,-15.11053,-5.36187)" /> + <path + sodipodi:type="arc" + style="opacity:1;color:black;fill:url(#radialGradient5480);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.0190649px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + id="path5458" + sodipodi:cx="31.112698" + sodipodi:cy="19.008621" + sodipodi:rx="8.6620579" + sodipodi:ry="8.6620579" + d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z" + transform="matrix(0.981291,0,0,0.981291,-13.71259,-7.652994)" /> + <path + d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z" + sodipodi:ry="8.6620579" + sodipodi:rx="8.6620579" + sodipodi:cy="19.008621" + sodipodi:cx="31.112698" + id="path5460" + style="opacity:0.52571429;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.15494144px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" + sodipodi:type="arc" + transform="matrix(0.865845,0,0,0.865845,-10.12076,-5.458528)" /> + </g> + </g> +</svg> diff --git a/sflphone-gtk/src/Makefile.am b/sflphone-gtk/src/Makefile.am index e7b56542ccc70998994f11ba54410e52a615c0ae..0f4ed7d1faa047df6257a0f79af7848732c7008f 100644 --- a/sflphone-gtk/src/Makefile.am +++ b/sflphone-gtk/src/Makefile.am @@ -1,5 +1,9 @@ bin_PROGRAMS = sflphone-gtk +SUBDIRS=contactlist + +# noinst_LTLIBRARIES = libsflphonegtk.la + NOFIFY_LIBS=-lnotify SEXY_LIBS=-lsexy @@ -24,7 +28,7 @@ sflphone_gtk_SOURCES = \ menus.c \ calltab.c \ calltree.c \ - historyfilter.c \ + searchfilter.c \ actions.c \ configwindow.c \ accountlist.c \ @@ -34,14 +38,18 @@ sflphone_gtk_SOURCES = \ $(STATUSICON_SOURCE) \ codeclist.c \ timestamp.c \ - reqaccount.c - + reqaccount.c \ + addressbook-config.c + noinst_HEADERS = actions.h dbus.h sflnotify.h mainwindow.h calllist.h dialpad.h audioconf.h codeclist.h assistant.h \ callmanager-glue.h errors.h sflphone_const.h configurationmanager-glue.h instance-glue.h menus.h calltab.h calltree.h configwindow.h \ - accountlist.h accountwindow.h marshaller.h sliders.h $(STATUSICON_HEADER) timestamp.h historyfilter.c reqaccount.h + accountlist.h accountwindow.h marshaller.h sliders.h $(STATUSICON_HEADER) timestamp.h searchfilter.h reqaccount.h addressbook-config.h EXTRA_DIST = marshaller.list -sflphone_gtk_LDADD = $(DEPS_LIBS) $(NOTIFY_LIBS) $(SEXY_LIBS) + +sflphone_gtk_LDADD = $(DEPS_LIBS) $(NOTIFY_LIBS) $(SEXY_LIBS) \ + ./contactlist/libcontact.la + AM_CPPFLAGS = $(DEPS_CFLAGS) \ -DICONS_DIR=\""$(prefix)/share/sflphone"\" \ diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c index 6d6bbe50b07bdde12073bf4567ab5dd476d2f2f5..0e6d68437b9d2b73bab76555f4e7e6082adfe215 100644 --- a/sflphone-gtk/src/actions.c +++ b/sflphone-gtk/src/actions.c @@ -2,17 +2,17 @@ * Copyright (C) 2007 - 2008 Savoir-Faire Linux inc. * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -25,7 +25,8 @@ #include <menus.h> #include <statusicon.h> #include <calltab.h> -#include <historyfilter.h> +#include <searchfilter.h> +#include <contactlist/eds.h> #include <gtk/gtk.h> #include <string.h> @@ -36,12 +37,12 @@ guint voice_mails; -void + void sflphone_notify_voice_mail ( const gchar* accountID , guint count ) { gchar *id; gchar *current; - + // We want to notify only for the default current account; ie the first in the list id = g_strdup( accountID ); current = account_list_get_current_id(); @@ -56,91 +57,91 @@ sflphone_notify_voice_mail ( const gchar* accountID , guint count ) if( count > 1) g_sprintf(message, _("%d voice mails"), count); else - g_sprintf(message, _("%d voice mail"), count); + g_sprintf(message, _("%d voice mail"), count); statusbar_push_message(message, __MSG_VOICE_MAILS); g_free(message); } - + // TODO: add ifdef if( account_list_get_size() > 0 ) { account_t* acc = account_list_get_by_id( id ); - if( acc != NULL ) - notify_voice_mails( count , acc ); + if( acc != NULL ) + notify_voice_mails( count , acc ); } } -void + void status_bar_display_account( call_t* c) { gchar* msg; account_t* acc; if(c->accountID != NULL){ - acc = account_list_get_by_id(c->accountID); - msg = g_markup_printf_escaped(_("%s account- %s") , - (gchar*)g_hash_table_lookup( acc->properties , ACCOUNT_TYPE), - (gchar*)g_hash_table_lookup( acc->properties , ACCOUNT_ALIAS)); - statusbar_push_message( msg , __MSG_ACCOUNT_DEFAULT); - g_free(msg); - } + acc = account_list_get_by_id(c->accountID); + msg = g_markup_printf_escaped(_("%s account- %s") , + (gchar*)g_hash_table_lookup( acc->properties , ACCOUNT_TYPE), + (gchar*)g_hash_table_lookup( acc->properties , ACCOUNT_ALIAS)); + statusbar_push_message( msg , __MSG_ACCOUNT_DEFAULT); + g_free(msg); + } } - -gboolean + + gboolean sflphone_quit () { - gboolean quit = FALSE; - guint count = call_list_get_size(current_calls); - if(count > 0){ - quit = main_window_ask_quit(); - } - else{ - quit = TRUE; - } - - if (quit) - { - dbus_unregister(getpid()); - dbus_clean (); - //call_list_clean(); TODO - //account_list_clean() - gtk_main_quit (); - } - return quit; + gboolean quit = FALSE; + guint count = call_list_get_size(current_calls); + if(count > 0){ + quit = main_window_ask_quit(); + } + else{ + quit = TRUE; + } + + if (quit) + { + dbus_unregister(getpid()); + dbus_clean (); + //call_list_clean(); TODO + //account_list_clean() + gtk_main_quit (); + } + return quit; } -void + void sflphone_hold(call_t * c ) { - c->state = CALL_STATE_HOLD; - update_call_tree(current_calls,c); - update_menus(); + c->state = CALL_STATE_HOLD; + update_call_tree(current_calls,c); + update_menus(); } -void + void sflphone_ringing(call_t * c ) { - c->state = CALL_STATE_RINGING; - update_call_tree(current_calls,c); - update_menus(); + c->state = CALL_STATE_RINGING; + update_call_tree(current_calls,c); + update_menus(); } -void + void sflphone_hung_up( call_t * c) { - call_list_remove( current_calls, c->callID); - update_call_tree_remove(current_calls, c); - c->state = CALL_STATE_DIALING; - update_menus(); + call_list_remove( current_calls, c->callID); + update_call_tree_remove(current_calls, c); + c->state = CALL_STATE_DIALING; + update_menus(); #if GTK_CHECK_VERSION(2,10,0) - status_tray_icon_blink( FALSE ); + status_tray_icon_blink( FALSE ); #endif - statusbar_pop_message(__MSG_ACCOUNT_DEFAULT); + statusbar_pop_message(__MSG_ACCOUNT_DEFAULT); } /** Internal to actions: Fill account list */ - void + void sflphone_fill_account_list(gboolean toolbarInitialized) { @@ -148,533 +149,533 @@ sflphone_fill_account_list(gboolean toolbarInitialized) gchar** accountID; unsigned int i; - account_list_clear ( ); + account_list_clear ( ); - array = (gchar **)dbus_account_list(); + array = (gchar **)dbus_account_list(); if(array) { - for (accountID = array; *accountID; accountID++) - { - account_t * a = g_new0(account_t,1); - a->accountID = g_strdup(*accountID); - account_list_add(a); - } - g_strfreev (array); + for (accountID = array; *accountID; accountID++) + { + account_t * a = g_new0(account_t,1); + a->accountID = g_strdup(*accountID); + account_list_add(a); + } + g_strfreev (array); } - for( i = 0; i < account_list_get_size(); i++) - { - account_t * a = account_list_get_nth (i); - GHashTable * details = (GHashTable *) dbus_account_details(a->accountID); + for( i = 0; i < account_list_get_size(); i++) + { + account_t * a = account_list_get_nth (i); + GHashTable * details = (GHashTable *) dbus_account_details(a->accountID); if( details == NULL ) break; - a->properties = details; - - gchar * status = g_hash_table_lookup(details, "Status"); - if(strcmp(status, "REGISTERED") == 0) - { - a->state = ACCOUNT_STATE_REGISTERED; - } - else if(strcmp(status, "UNREGISTERED") == 0) - { - a->state = ACCOUNT_STATE_UNREGISTERED; - } - else if(strcmp(status, "TRYING") == 0) - { - a->state = ACCOUNT_STATE_TRYING; - } - else if(strcmp(status, "ERROR") == 0) - { - a->state = ACCOUNT_STATE_ERROR; - } - else if(strcmp( status , "ERROR_AUTH") == 0 ) - { - a->state = ACCOUNT_STATE_ERROR_AUTH; - } - else if(strcmp( status , "ERROR_NETWORK") == 0 ) - { - a->state = ACCOUNT_STATE_ERROR_NETWORK; - } - else if(strcmp( status , "ERROR_HOST") == 0 ) - { - a->state = ACCOUNT_STATE_ERROR_HOST; - } - else if(strcmp( status , "ERROR_CONF_STUN") == 0 ) - { - a->state = ACCOUNT_STATE_ERROR_CONF_STUN; - } - else if(strcmp( status , "ERROR_EXIST_STUN") == 0 ) - { - a->state = ACCOUNT_STATE_ERROR_EXIST_STUN; - } - else - { - a->state = ACCOUNT_STATE_INVALID; - } - - } - - // Prevent update being called when toolbar is not yet initialized - if(toolbarInitialized) - toolbar_update_buttons(); + a->properties = details; + + gchar * status = g_hash_table_lookup(details, "Status"); + if(strcmp(status, "REGISTERED") == 0) + { + a->state = ACCOUNT_STATE_REGISTERED; + } + else if(strcmp(status, "UNREGISTERED") == 0) + { + a->state = ACCOUNT_STATE_UNREGISTERED; + } + else if(strcmp(status, "TRYING") == 0) + { + a->state = ACCOUNT_STATE_TRYING; + } + else if(strcmp(status, "ERROR") == 0) + { + a->state = ACCOUNT_STATE_ERROR; + } + else if(strcmp( status , "ERROR_AUTH") == 0 ) + { + a->state = ACCOUNT_STATE_ERROR_AUTH; + } + else if(strcmp( status , "ERROR_NETWORK") == 0 ) + { + a->state = ACCOUNT_STATE_ERROR_NETWORK; + } + else if(strcmp( status , "ERROR_HOST") == 0 ) + { + a->state = ACCOUNT_STATE_ERROR_HOST; + } + else if(strcmp( status , "ERROR_CONF_STUN") == 0 ) + { + a->state = ACCOUNT_STATE_ERROR_CONF_STUN; + } + else if(strcmp( status , "ERROR_EXIST_STUN") == 0 ) + { + a->state = ACCOUNT_STATE_ERROR_EXIST_STUN; + } + else + { + a->state = ACCOUNT_STATE_INVALID; + } + + } + + // Prevent update being called when toolbar is not yet initialized + if(toolbarInitialized) + toolbar_update_buttons(); } gboolean sflphone_init() { - if(!dbus_connect ()){ - - main_window_error_message(_("Unable to connect to the SFLphone server.\nMake sure the daemon is running.")); - return FALSE; - } - else - { - dbus_register(getpid(), "Gtk+ Client"); + if(!dbus_connect ()){ + + main_window_error_message(_("Unable to connect to the SFLphone server.\nMake sure the daemon is running.")); + return FALSE; + } + else + { + dbus_register(getpid(), "Gtk+ Client"); current_calls = calltab_init(); - history = calltab_init(); - if(SHOW_SEARCHBAR) histfilter = create_filter(GTK_TREE_MODEL(history->store)); - account_list_init (); + history = calltab_init(); + contacts = calltab_init(); + if(SHOW_SEARCHBAR) histfilter = create_filter(GTK_TREE_MODEL(history->store)); + init(); + account_list_init (); codec_list_init(); - sflphone_fill_account_list(FALSE); - sflphone_fill_codec_list(); - sflphone_set_current_account(); - return TRUE; - } + sflphone_fill_account_list(FALSE); + sflphone_fill_codec_list(); + sflphone_set_current_account(); + return TRUE; + } } -void + void sflphone_hang_up() { - call_t * selectedCall = call_get_selected(current_calls); - if(selectedCall) - { - switch(selectedCall->state) - { - case CALL_STATE_DIALING: - dbus_hang_up (selectedCall); - break; - case CALL_STATE_RINGING: - dbus_hang_up (selectedCall); - selectedCall->state = CALL_STATE_DIALING; - selectedCall->_stop = 0; - break; - case CALL_STATE_CURRENT: - case CALL_STATE_HOLD: - case CALL_STATE_BUSY: + call_t * selectedCall = call_get_selected(current_calls); + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_DIALING: + dbus_hang_up (selectedCall); + break; + case CALL_STATE_RINGING: + dbus_hang_up (selectedCall); + selectedCall->state = CALL_STATE_DIALING; + selectedCall->_stop = 0; + break; + case CALL_STATE_CURRENT: + case CALL_STATE_HOLD: + case CALL_STATE_BUSY: case CALL_STATE_RECORD: - dbus_hang_up (selectedCall); - selectedCall->state = CALL_STATE_DIALING; - (void) time(&selectedCall->_stop); - break; - case CALL_STATE_FAILURE: - dbus_hang_up (selectedCall); - selectedCall->state = CALL_STATE_DIALING; - selectedCall->_stop = 0; - break; - case CALL_STATE_INCOMING: - dbus_refuse (selectedCall); - selectedCall->state = CALL_STATE_DIALING; - selectedCall->_stop = 0; - g_print("from sflphone_hang_up : "); stop_notification(); - break; - case CALL_STATE_TRANSFERT: - dbus_hang_up (selectedCall); - (void) time(&selectedCall->_stop); - break; - default: - g_warning("Should not happen in sflphone_hang_up()!"); - break; - } - } - update_call_tree( history , selectedCall ); + dbus_hang_up (selectedCall); + selectedCall->state = CALL_STATE_DIALING; + (void) time(&selectedCall->_stop); + break; + case CALL_STATE_FAILURE: + dbus_hang_up (selectedCall); + selectedCall->state = CALL_STATE_DIALING; + selectedCall->_stop = 0; + break; + case CALL_STATE_INCOMING: + dbus_refuse (selectedCall); + selectedCall->state = CALL_STATE_DIALING; + selectedCall->_stop = 0; + g_print("from sflphone_hang_up : "); stop_notification(); + break; + case CALL_STATE_TRANSFERT: + dbus_hang_up (selectedCall); + (void) time(&selectedCall->_stop); + break; + default: + g_warning("Should not happen in sflphone_hang_up()!"); + break; + } + } + update_call_tree( history , selectedCall ); } -void + void sflphone_pick_up() { - call_t * selectedCall = call_get_selected(active_calltree); - if(selectedCall) - { - switch(selectedCall->state) - { - case CALL_STATE_DIALING: - sflphone_place_call (selectedCall); - break; - case CALL_STATE_INCOMING: - selectedCall->history_state = INCOMING; - update_call_tree( history , selectedCall ); - dbus_accept (selectedCall); - g_print("from sflphone_pick_up : "); stop_notification(); - break; - case CALL_STATE_HOLD: - sflphone_new_call(); - break; - case CALL_STATE_TRANSFERT: - dbus_transfert (selectedCall); - (void) time(&selectedCall->_stop); - break; - case CALL_STATE_CURRENT: - case CALL_STATE_RECORD: - sflphone_new_call(); - break; - case CALL_STATE_RINGING: - sflphone_new_call(); - break; - default: - g_warning("Should not happen in sflphone_pick_up()!"); - break; - } - } + call_t * selectedCall = call_get_selected(active_calltree); + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_DIALING: + sflphone_place_call (selectedCall); + break; + case CALL_STATE_INCOMING: + selectedCall->history_state = INCOMING; + update_call_tree( history , selectedCall ); + dbus_accept (selectedCall); + g_print("from sflphone_pick_up : "); stop_notification(); + break; + case CALL_STATE_HOLD: + sflphone_new_call(); + break; + case CALL_STATE_TRANSFERT: + dbus_transfert (selectedCall); + (void) time(&selectedCall->_stop); + break; + case CALL_STATE_CURRENT: + case CALL_STATE_RECORD: + sflphone_new_call(); + break; + case CALL_STATE_RINGING: + sflphone_new_call(); + break; + default: + g_warning("Should not happen in sflphone_pick_up()!"); + break; + } + } } -void + void sflphone_on_hold () { - call_t * selectedCall = call_get_selected(current_calls); - if(selectedCall) - { - switch(selectedCall->state) - { - case CALL_STATE_CURRENT: - dbus_hold (selectedCall); - break; - case CALL_STATE_RECORD: - dbus_hold (selectedCall); - break; - - default: - g_warning("Should not happen in sflphone_on_hold!"); - break; - } - } + call_t * selectedCall = call_get_selected(current_calls); + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_CURRENT: + dbus_hold (selectedCall); + break; + case CALL_STATE_RECORD: + dbus_hold (selectedCall); + break; + + default: + g_warning("Should not happen in sflphone_on_hold!"); + break; + } + } } -void + void sflphone_off_hold () { - call_t * selectedCall = call_get_selected(current_calls); - if(selectedCall) - { - switch(selectedCall->state) - { - case CALL_STATE_HOLD: - dbus_unhold (selectedCall); - break; - default: - g_warning("Should not happen in sflphone_off_hold ()!"); - break; - } - } + call_t * selectedCall = call_get_selected(current_calls); + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_HOLD: + dbus_unhold (selectedCall); + break; + default: + g_warning("Should not happen in sflphone_off_hold ()!"); + break; + } + } } -void + void sflphone_fail( call_t * c ) { - c->state = CALL_STATE_FAILURE; - update_call_tree(current_calls,c); - update_menus(); + c->state = CALL_STATE_FAILURE; + update_call_tree(current_calls,c); + update_menus(); } -void + void sflphone_busy( call_t * c ) { - c->state = CALL_STATE_BUSY; - update_call_tree(current_calls, c); - update_menus(); + c->state = CALL_STATE_BUSY; + update_call_tree(current_calls, c); + update_menus(); } -void + void sflphone_current( call_t * c ) { - if( c->state != CALL_STATE_HOLD ) - (void) time(&c->_start); - c->state = CALL_STATE_CURRENT; - update_call_tree(current_calls,c); - update_menus(); + if( c->state != CALL_STATE_HOLD ) + (void) time(&c->_start); + c->state = CALL_STATE_CURRENT; + update_call_tree(current_calls,c); + update_menus(); } -void + void sflphone_record( call_t * c ) { - if( c->state != CALL_STATE_HOLD ) - (void) time(&c->_start); - c->state = CALL_STATE_RECORD; - update_call_tree(current_calls,c); - update_menus(); + if( c->state != CALL_STATE_HOLD ) + (void) time(&c->_start); + c->state = CALL_STATE_RECORD; + update_call_tree(current_calls,c); + update_menus(); } -void + void sflphone_set_transfert() { - call_t * c = call_get_selected(current_calls); - if(c) - { - c->state = CALL_STATE_TRANSFERT; - c->to = g_strdup(""); - update_call_tree(current_calls,c); - update_menus(); - } - toolbar_update_buttons(); + call_t * c = call_get_selected(current_calls); + if(c) + { + c->state = CALL_STATE_TRANSFERT; + c->to = g_strdup(""); + update_call_tree(current_calls,c); + update_menus(); + } + toolbar_update_buttons(); } -void + void sflphone_unset_transfert() { - call_t * c = call_get_selected(current_calls); - if(c) - { - c->state = CALL_STATE_CURRENT; - c->to = g_strdup(""); - update_call_tree(current_calls,c); - update_menus(); - } - toolbar_update_buttons(); + call_t * c = call_get_selected(current_calls); + if(c) + { + c->state = CALL_STATE_CURRENT; + c->to = g_strdup(""); + update_call_tree(current_calls,c); + update_menus(); + } + toolbar_update_buttons(); } -void -sflphone_incoming_call (call_t * c) + void +sflphone_incoming_call (call_t * c) { - c->history_state = MISSED; - call_list_add ( current_calls, c ); - call_list_add( history, c ); - update_call_tree_add( current_calls , c ); - update_menus(); - if( active_calltree == history ) switch_tab(); + c->history_state = MISSED; + call_list_add ( current_calls, c ); + call_list_add( history, c ); + update_call_tree_add( current_calls , c ); + update_menus(); + display_calltree (current_calls); } -void + void process_dialing(call_t * c, guint keyval, gchar * key) { - // We stop the tone - if(strlen(c->to) == 0 && c->state != CALL_STATE_TRANSFERT){ - dbus_start_tone( FALSE , 0 ); - //dbus_play_dtmf( key ); - } - - g_print("process_dialing : keyval : %i \n",keyval); - g_print("process_dialing : key : %s \n",key); - - switch (keyval) - { - case 65293: /* ENTER */ - case 65421: /* ENTER numpad */ - sflphone_place_call(c); - break; - case 65307: /* ESCAPE */ - sflphone_hang_up(c); - break; - case 65288: /* BACKSPACE */ - { /* Brackets mandatory because of local vars */ - gchar * before = c->to; - if(strlen(c->to) >= 1){ - - c->to = g_strndup(c->to, strlen(c->to) -1); - g_free(before); - g_print("TO: backspace %s\n", c->to); - - if(c->state == CALL_STATE_DIALING) - { - g_free(c->from); - c->from = g_strconcat("\"\" <", c->to, ">", NULL); - } - update_call_tree(current_calls,c); - } - else if(strlen(c->to) == 0) - { - if(c->state != CALL_STATE_TRANSFERT) - dbus_hang_up(c); - } - } - break; - case 65289: /* TAB */ - case 65513: /* ALT */ - case 65507: /* CTRL */ - case 65515: /* SUPER */ - case 65509: /* CAPS */ - break; - default: - // if (keyval < 255 || (keyval >65453 && keyval < 65466)) - if (keyval < 127) - { - - if(c->state != CALL_STATE_TRANSFERT) - dbus_play_dtmf( key ); - gchar * before = c->to; - c->to = g_strconcat(c->to, key, NULL); - g_free(before); - g_print("TO:default %s\n", c->to); - - if(c->state == CALL_STATE_DIALING) - { - g_free(c->from); - c->from = g_strconcat("\"\" <", c->to, ">", NULL); - } - update_call_tree(current_calls,c); - } - break; - } + // We stop the tone + if(strlen(c->to) == 0 && c->state != CALL_STATE_TRANSFERT){ + dbus_start_tone( FALSE , 0 ); + //dbus_play_dtmf( key ); + } + g_print("process_dialing : keyval : %i \n",keyval); + g_print("process_dialing : key : %s \n",key); + + switch (keyval) + { + case 65293: /* ENTER */ + case 65421: /* ENTER numpad */ + sflphone_place_call(c); + break; + case 65307: /* ESCAPE */ + sflphone_hang_up(c); + break; + case 65288: /* BACKSPACE */ + { /* Brackets mandatory because of local vars */ + gchar * before = c->to; + if(strlen(c->to) >= 1){ + + c->to = g_strndup(c->to, strlen(c->to) -1); + g_free(before); + g_print("TO: backspace %s\n", c->to); + + if(c->state == CALL_STATE_DIALING) + { + g_free(c->from); + c->from = g_strconcat("\"\" <", c->to, ">", NULL); + } + update_call_tree(current_calls,c); + } + else if(strlen(c->to) == 0) + { + if(c->state != CALL_STATE_TRANSFERT) + dbus_hang_up(c); + } + } + break; + case 65289: /* TAB */ + case 65513: /* ALT */ + case 65507: /* CTRL */ + case 65515: /* SUPER */ + case 65509: /* CAPS */ + break; + default: + // if (keyval < 255 || (keyval >65453 && keyval < 65466)) + if (keyval < 127 || (keyval > 65400 && keyval < 65466)) + { + + if(c->state != CALL_STATE_TRANSFERT) + dbus_play_dtmf( key ); + gchar * before = c->to; + c->to = g_strconcat(c->to, key, NULL); + g_free(before); + g_print("TO:default %s\n", c->to); + + if(c->state == CALL_STATE_DIALING) + { + g_free(c->from); + c->from = g_strconcat("\"\" <", c->to, ">", NULL); + } + update_call_tree(current_calls,c); + } + break; + } } -call_t * + call_t * sflphone_new_call() { - sflphone_on_hold(); + sflphone_on_hold(); - // Play a tone when creating a new call - if( call_list_get_size(current_calls) == 0 ) - dbus_start_tone( TRUE , ( voice_mails > 0 )? TONE_WITH_MESSAGE : TONE_WITHOUT_MESSAGE) ; + // Play a tone when creating a new call + if( call_list_get_size(current_calls) == 0 ) + dbus_start_tone( TRUE , ( voice_mails > 0 )? TONE_WITH_MESSAGE : TONE_WITHOUT_MESSAGE) ; - call_t * c = g_new0 (call_t, 1); - c->state = CALL_STATE_DIALING; - c->from = g_strconcat("\"\" <>", NULL); + call_t * c = g_new0 (call_t, 1); + c->state = CALL_STATE_DIALING; + c->from = g_strconcat("\"\" <>", NULL); - c->callID = g_new0(gchar, 30); - g_sprintf(c->callID, "%d", rand()); + c->callID = g_new0(gchar, 30); + g_sprintf(c->callID, "%d", rand()); - c->to = g_strdup(""); + c->to = g_strdup(""); - c->_start = 0; - c->_stop = 0; + c->_start = 0; + c->_stop = 0; - call_list_add(current_calls,c); - update_call_tree_add(current_calls,c); - update_menus(); + call_list_add(current_calls,c); + update_call_tree_add(current_calls,c); + update_menus(); - return c; + return c; } -void + void sflphone_keypad( guint keyval, gchar * key) { - - call_t * c = call_get_selected(current_calls); - if(c) - { - switch(c->state) - { - case CALL_STATE_DIALING: // Currently dialing => edit number - process_dialing(c, keyval, key); - break; - case CALL_STATE_RECORD: - case CALL_STATE_CURRENT: - switch (keyval) - { - case 65307: /* ESCAPE */ - dbus_hang_up(c); - (void) time(&c->_stop); - update_call_tree( history , c ); - break; - default: - // To play the dtmf when calling mail box for instance - dbus_play_dtmf(key); - if (keyval < 255 || (keyval >65453 && keyval < 65466)) - { - //gchar * temp = g_strconcat(call_get_number(c), key, NULL); - //gchar * before = c->from; - //c->from = g_strconcat("\"",call_get_name(c) ,"\" <", temp, ">", NULL); - //g_free(before); - //g_free(temp); - //update_call_tree(current_calls,c); - } - break; - } - break; - case CALL_STATE_INCOMING: - switch (keyval) - { - case 65293: /* ENTER */ - case 65421: /* ENTER numpad */ - c->history_state = INCOMING; - update_call_tree( history , c ); - dbus_accept(c); - g_print("from sflphone_keypad ( enter ) : "); stop_notification(); - break; - case 65307: /* ESCAPE */ - dbus_refuse(c); - g_print("from sflphone_keypad ( escape ) : "); stop_notification(); - break; - } - break; - case CALL_STATE_TRANSFERT: - switch (keyval) - { - case 65293: /* ENTER */ - case 65421: /* ENTER numpad */ - dbus_transfert(c); - (void) time(&c->_stop); - break; - case 65307: /* ESCAPE */ - sflphone_unset_transfert(c); - break; - default: // When a call is on transfert, typing new numbers will add it to c->to - process_dialing(c, keyval, key); - break; - } - break; - case CALL_STATE_HOLD: - switch (keyval) - { - case 65293: /* ENTER */ - case 65421: /* ENTER numpad */ - dbus_unhold(c); - break; - case 65307: /* ESCAPE */ - dbus_hang_up(c); - break; - default: // When a call is on hold, typing new numbers will create a new call - process_dialing(sflphone_new_call(), keyval, key); - break; - } - break; - case CALL_STATE_RINGING: - case CALL_STATE_BUSY: - case CALL_STATE_FAILURE: - c->_stop = 0; - switch (keyval) - { - case 65307: /* ESCAPE */ - dbus_hang_up(c); - c->_stop = 0; - update_call_tree( history , c ); - break; - } - break; - default: - break; - } - } - else - { // Not in a call, not dialing, create a new call - //dbus_play_dtmf(key); - switch (keyval) - { - case 65293: /* ENTER */ - case 65421: /* ENTER numpad */ - case 65307: /* ESCAPE */ - break; - default: - if( active_calltree == history ) - switch_tab(); - process_dialing(sflphone_new_call(), keyval, key); - break; - } - - - } - } + call_t * c = call_get_selected(current_calls); + + if((active_calltree != current_calls) || (active_calltree == current_calls && !c)) + { + // Not in a call, not dialing, create a new call + //dbus_play_dtmf(key); + switch (keyval) + { + case 65293: /* ENTER */ + case 65421: /* ENTER numpad */ + case 65307: /* ESCAPE */ + break; + default: + display_calltree (current_calls); + process_dialing(sflphone_new_call(), keyval, key); + break; + } + } + else if(c) + { + printf("call\n"); + switch(c->state) + { + case CALL_STATE_DIALING: // Currently dialing => edit number + process_dialing(c, keyval, key); + break; + case CALL_STATE_RECORD: + case CALL_STATE_CURRENT: + switch (keyval) + { + case 65307: /* ESCAPE */ + dbus_hang_up(c); + (void) time(&c->_stop); + update_call_tree( history , c ); + break; + default: + // To play the dtmf when calling mail box for instance + dbus_play_dtmf(key); + if (keyval < 255 || (keyval >65453 && keyval < 65466)) + { + //gchar * temp = g_strconcat(call_get_number(c), key, NULL); + //gchar * before = c->from; + //c->from = g_strconcat("\"",call_get_name(c) ,"\" <", temp, ">", NULL); + //g_free(before); + //g_free(temp); + //update_call_tree(current_calls,c); + } + break; + } + break; + case CALL_STATE_INCOMING: + switch (keyval) + { + case 65293: /* ENTER */ + case 65421: /* ENTER numpad */ + c->history_state = INCOMING; + update_call_tree( history , c ); + dbus_accept(c); + g_print("from sflphone_keypad ( enter ) : "); stop_notification(); + break; + case 65307: /* ESCAPE */ + dbus_refuse(c); + g_print("from sflphone_keypad ( escape ) : "); stop_notification(); + break; + } + break; + case CALL_STATE_TRANSFERT: + switch (keyval) + { + case 65293: /* ENTER */ + case 65421: /* ENTER numpad */ + dbus_transfert(c); + (void) time(&c->_stop); + break; + case 65307: /* ESCAPE */ + sflphone_unset_transfert(c); + break; + default: // When a call is on transfert, typing new numbers will add it to c->to + process_dialing(c, keyval, key); + break; + } + break; + case CALL_STATE_HOLD: + switch (keyval) + { + case 65293: /* ENTER */ + case 65421: /* ENTER numpad */ + dbus_unhold(c); + break; + case 65307: /* ESCAPE */ + dbus_hang_up(c); + break; + default: // When a call is on hold, typing new numbers will create a new call + process_dialing(sflphone_new_call(), keyval, key); + break; + } + break; + case CALL_STATE_RINGING: + case CALL_STATE_BUSY: + case CALL_STATE_FAILURE: + c->_stop = 0; + switch (keyval) + { + case 65307: /* ESCAPE */ + dbus_hang_up(c); + c->_stop = 0; + update_call_tree( history , c ); + break; + } + break; + default: + break; + } + } +} /* * Place a call with the current account. - * If there is no default account selected, place a call with the first + * If there is no default account selected, place a call with the first * registered account of the account list * Else, popup an error message */ -void + void sflphone_place_call ( call_t * c ) { @@ -685,13 +686,13 @@ sflphone_place_call ( call_t * c ) notify_no_accounts(); sflphone_fail(c); } - + else if( account_list_get_by_state( ACCOUNT_STATE_REGISTERED ) == NULL ) { notify_no_registered_accounts(); sflphone_fail(c); } - + else { account_t * current; @@ -707,155 +708,155 @@ sflphone_place_call ( call_t * c ) if( current ) { - if(g_strcasecmp(g_hash_table_lookup( current->properties, "Status"),"REGISTERED")==0) - { - // OK, everything alright - the call is made with the current account - c -> accountID = current -> accountID; - status_bar_display_account(c); - dbus_place_call(c); - } - else - { - // Current account is not registered - // So we place a call with the first registered account - // And we switch the current account - current = account_list_get_by_state( ACCOUNT_STATE_REGISTERED ); - c -> accountID = current -> accountID; - dbus_place_call(c); - notify_current_account( current ); - status_bar_display_account(c); - account_list_set_current_id( c-> accountID ); - } + if(g_strcasecmp(g_hash_table_lookup( current->properties, "Status"),"REGISTERED")==0) + { + // OK, everything alright - the call is made with the current account + c -> accountID = current -> accountID; + status_bar_display_account(c); + dbus_place_call(c); + } + else + { + // Current account is not registered + // So we place a call with the first registered account + // And we switch the current account + current = account_list_get_by_state( ACCOUNT_STATE_REGISTERED ); + c -> accountID = current -> accountID; + dbus_place_call(c); + notify_current_account( current ); + status_bar_display_account(c); + account_list_set_current_id( c-> accountID ); + } } else { - // No current accounts have been setup. - // So we place a call with the first registered account - // and we change the current account - current = account_list_get_by_state( ACCOUNT_STATE_REGISTERED ); - c -> accountID = current -> accountID; - dbus_place_call(c); - notify_current_account( current ); - status_bar_display_account(c); - account_list_set_current_id( c-> accountID ); + // No current accounts have been setup. + // So we place a call with the first registered account + // and we change the current account + current = account_list_get_by_state( ACCOUNT_STATE_REGISTERED ); + c -> accountID = current -> accountID; + dbus_place_call(c); + notify_current_account( current ); + status_bar_display_account(c); + account_list_set_current_id( c-> accountID ); } } - // Update history - c->history_state = OUTGOING; - call_list_add(history, c); + // Update history + c->history_state = OUTGOING; + call_list_add(history, c); } } -void + void sflphone_display_selected_codec (const gchar* codecName) { call_t * selectedCall = call_get_selected(current_calls); gchar* msg; account_t* acc; if(selectedCall->accountID != NULL){ - acc = account_list_get_by_id(selectedCall->accountID); - msg = g_markup_printf_escaped(_("%s account- %s %s") , - (gchar*)g_hash_table_lookup( acc->properties , ACCOUNT_TYPE), - (gchar*)g_hash_table_lookup( acc->properties , ACCOUNT_ALIAS), - codecName); - statusbar_push_message( msg , __MSG_ACCOUNT_DEFAULT); - g_free(msg); - } + acc = account_list_get_by_id(selectedCall->accountID); + msg = g_markup_printf_escaped(_("%s account- %s %s") , + (gchar*)g_hash_table_lookup( acc->properties , ACCOUNT_TYPE), + (gchar*)g_hash_table_lookup( acc->properties , ACCOUNT_ALIAS), + codecName); + statusbar_push_message( msg , __MSG_ACCOUNT_DEFAULT); + g_free(msg); + } } -gchar* + gchar* sflphone_get_current_codec_name() { call_t * selectedCall = call_get_selected(current_calls); return dbus_get_current_codec_name(selectedCall); } -void + void sflphone_rec_call() { - call_t * selectedCall = call_get_selected(current_calls); - dbus_set_record(selectedCall); - + call_t * selectedCall = call_get_selected(current_calls); + dbus_set_record(selectedCall); - switch(selectedCall->state) - { - case CALL_STATE_CURRENT: + + switch(selectedCall->state) + { + case CALL_STATE_CURRENT: selectedCall->state = CALL_STATE_RECORD; - break; - case CALL_STATE_RECORD: + break; + case CALL_STATE_RECORD: selectedCall->state = CALL_STATE_CURRENT; break; - default: + default: g_warning("Should not happen in sflphone_off_hold ()!"); - break; - } - update_call_tree(current_calls,selectedCall); - update_menus(); + break; + } + update_call_tree(current_calls,selectedCall); + update_menus(); - // gchar* codname = sflphone_get_current_codec_name(); - // printf("sflphone_get_current_codec_name: %s \n",codname); + // gchar* codname = sflphone_get_current_codec_name(); + // printf("sflphone_get_current_codec_name: %s \n",codname); } /* Internal to action - set the __CURRENT_ACCOUNT variable */ -void + void sflphone_set_current_account() { - if( account_list_get_size() > 0 ) - account_list_set_current_pos( 0 ); + if( account_list_get_size() > 0 ) + account_list_set_current_pos( 0 ); } /* Internal to action - get the codec list */ -void + void sflphone_fill_codec_list() { - codec_list_clear(); - - gchar** codecs = (gchar**)dbus_codec_list(); - gchar** order = (gchar**)dbus_get_active_codec_list(); - gchar** details; - gchar** pl; - - for(pl=order; *order; order++) - { - codec_t * c = g_new0(codec_t, 1); - c->_payload = atoi(*order); - details = (gchar **)dbus_codec_details(c->_payload); - //printf("Codec details: %s / %s / %s / %s\n",details[0],details[1],details[2],details[3]); - c->name = details[0]; - c->is_active = TRUE; - c->sample_rate = atoi(details[1]); - c->_bitrate = atof(details[2]); - c->_bandwidth = atof(details[3]); - codec_list_add(c); - } - - for(pl=codecs; *codecs; codecs++) - { - details = (gchar **)dbus_codec_details(atoi(*codecs)); - if(codec_list_get(details[0])!=NULL){ - // does nothing - the codec is already in the list, so is active. + codec_list_clear(); + + gchar** codecs = (gchar**)dbus_codec_list(); + gchar** order = (gchar**)dbus_get_active_codec_list(); + gchar** details; + gchar** pl; + + for(pl=order; *order; order++) + { + codec_t * c = g_new0(codec_t, 1); + c->_payload = atoi(*order); + details = (gchar **)dbus_codec_details(c->_payload); + //printf("Codec details: %s / %s / %s / %s\n",details[0],details[1],details[2],details[3]); + c->name = details[0]; + c->is_active = TRUE; + c->sample_rate = atoi(details[1]); + c->_bitrate = atof(details[2]); + c->_bandwidth = atof(details[3]); + codec_list_add(c); } - else{ - codec_t* c = g_new0(codec_t, 1); - c->_payload = atoi(*codecs); - c->name = details[0]; - c->is_active = FALSE; - c->sample_rate = atoi(details[1]); - c->_bitrate = atof(details[2]); - c->_bandwidth = atof(details[3]); - codec_list_add(c); + + for(pl=codecs; *codecs; codecs++) + { + details = (gchar **)dbus_codec_details(atoi(*codecs)); + if(codec_list_get(details[0])!=NULL){ + // does nothing - the codec is already in the list, so is active. + } + else{ + codec_t* c = g_new0(codec_t, 1); + c->_payload = atoi(*codecs); + c->name = details[0]; + c->is_active = FALSE; + c->sample_rate = atoi(details[1]); + c->_bitrate = atof(details[2]); + c->_bandwidth = atof(details[3]); + codec_list_add(c); + } + } + if( codec_list_get_size() == 0) { + + gchar* markup = g_markup_printf_escaped(_("<b>Error: No audio codecs found.\n\n</b> SFL audio codecs have to be placed in <i>%s</i> or in the <b>.sflphone</b> directory in your home( <i>%s</i> )") , CODECS_DIR , g_get_home_dir()); + main_window_error_message( markup ); + dbus_unregister(getpid()); + exit(0); } - } - if( codec_list_get_size() == 0) { - - gchar* markup = g_markup_printf_escaped(_("<b>Error: No audio codecs found.\n\n</b> SFL audio codecs have to be placed in <i>%s</i> or in the <b>.sflphone</b> directory in your home( <i>%s</i> )") , CODECS_DIR , g_get_home_dir()); - main_window_error_message( markup ); - dbus_unregister(getpid()); - exit(0); - } } diff --git a/sflphone-gtk/src/addressbook-config.c b/sflphone-gtk/src/addressbook-config.c new file mode 100644 index 0000000000000000000000000000000000000000..3edc93265b2fbf92995fb777f2c352995bd0a016 --- /dev/null +++ b/sflphone-gtk/src/addressbook-config.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2009 Savoir-Faire Linux inc. + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "addressbook-config.h" + +AddressBook_Config *addressbook_config; + +void addressbook_load_parameters (AddressBook_Config **settings) { + + GHashTable *_params = NULL; + AddressBook_Config *_settings; + + // Allocate a struct + _settings = g_new0 (AddressBook_Config, 1); + + // Fetch the settings from D-Bus + _params = (GHashTable*) dbus_get_addressbook_settings (); + + if (_params == NULL) { + _settings->max_results = 30; + _settings->display_contact_photo = 0; + _settings->search_phone_business = 1; + _settings->search_phone_home = 1; + _settings->search_phone_mobile = 1; + } + else { + _settings->max_results = (guint)(g_hash_table_lookup (_params, ADDRESSBOOK_MAX_RESULTS)); + _settings->display_contact_photo = (guint) (g_hash_table_lookup (_params, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO)); + _settings->search_phone_business = (guint) (g_hash_table_lookup (_params, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS)); + _settings->search_phone_home = (guint) (g_hash_table_lookup (_params, ADDRESSBOOK_DISPLAY_PHONE_HOME)); + _settings->search_phone_mobile = (guint) (g_hash_table_lookup (_params, ADDRESSBOOK_DISPLAY_PHONE_MOBILE)); + } + + *settings = _settings; +} + +void addressbook_save_parameters (void) { + + GHashTable *params = NULL; + + params = g_hash_table_new (NULL, g_str_equal); + g_hash_table_replace (params, (gpointer)ADDRESSBOOK_MAX_RESULTS, (gpointer)addressbook_config->max_results); + g_hash_table_replace (params, (gpointer)ADDRESSBOOK_DISPLAY_CONTACT_PHOTO, (gpointer)addressbook_config->display_contact_photo); + g_hash_table_replace (params, (gpointer)ADDRESSBOOK_DISPLAY_PHONE_BUSINESS, (gpointer)addressbook_config->search_phone_business); + g_hash_table_replace (params, (gpointer)ADDRESSBOOK_DISPLAY_PHONE_HOME, (gpointer)addressbook_config->search_phone_home); + g_hash_table_replace (params, (gpointer)ADDRESSBOOK_DISPLAY_PHONE_MOBILE, (gpointer)addressbook_config->search_phone_mobile); + + dbus_set_addressbook_settings (params); + + // Decrement the reference count + g_hash_table_unref (params); +} + +static void max_results_cb (GtkRange* scale) { + + addressbook_config->max_results = (guint) gtk_range_get_value (GTK_RANGE (scale)); +} + +static void display_contact_photo_cb (GtkWidget *widget) { + + addressbook_config->display_contact_photo = (guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); +} + +static void search_phone_business_cb (GtkWidget *widget) { + + addressbook_config->search_phone_business = (guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); +} + +static void search_phone_home_cb (GtkWidget *widget) { + + addressbook_config->search_phone_home = (guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); +} + +static void search_phone_mobile_cb (GtkWidget *widget) { + + addressbook_config->search_phone_mobile = (guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget)); +} + +GtkWidget* create_addressbook_settings () { + + GtkWidget *ret, *result_frame, *box, *value, *label, *photo, *item; + + // Load the user value + addressbook_load_parameters (&addressbook_config); + + ret = gtk_vbox_new(FALSE, 10); + gtk_container_set_border_width(GTK_CONTAINER(ret), 10); + + result_frame = gtk_frame_new(_("Search Parameters")); + gtk_box_pack_start(GTK_BOX(ret), result_frame, FALSE, FALSE, 0); + gtk_widget_show (result_frame); + + box = gtk_vbox_new( FALSE , 1); + gtk_widget_show (box); + gtk_container_add (GTK_CONTAINER(result_frame) , box); + + // SCALE BUTTON - NUMBER OF RESULTS + label = gtk_label_new (_("Maximum result number for a request: ")); + gtk_box_pack_start (GTK_BOX(box) , label , FALSE , FALSE , 1); + value = gtk_hscale_new_with_range (25.0 , 50.0 , 5.0); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), value); + gtk_scale_set_digits (GTK_SCALE(value) , 0); + gtk_scale_set_value_pos (GTK_SCALE(value) , GTK_POS_RIGHT); + gtk_range_set_value (GTK_RANGE( value ) , addressbook_config->max_results); + gtk_box_pack_start (GTK_BOX(box) , value , TRUE , TRUE , 0); + g_signal_connect (G_OBJECT (value) , "value-changed" , G_CALLBACK(max_results_cb), NULL ); + + // PHOTO DISPLAY + photo = gtk_check_button_new_with_mnemonic( _("_Display contact photo if available")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(photo), addressbook_config->display_contact_photo); + g_signal_connect (G_OBJECT(photo) , "clicked" , G_CALLBACK (display_contact_photo_cb), NULL); + gtk_box_pack_start (GTK_BOX(box) , photo , TRUE , TRUE , 1); + + label = gtk_label_new (_("Search for and display: ")); + gtk_box_pack_start (GTK_BOX(box) , label , FALSE , FALSE , 1); + + item = gtk_check_button_new_with_mnemonic( _("_Business phone")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_business); + g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_business_cb) , NULL); + gtk_box_pack_start (GTK_BOX(box) , item , TRUE , TRUE , 1); + + item = gtk_check_button_new_with_mnemonic( _("_Home phone")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_home); + g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_home_cb) , NULL); + gtk_box_pack_start (GTK_BOX(box) , item , TRUE , TRUE , 1); + + item = gtk_check_button_new_with_mnemonic( _("_Mobile phone")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), addressbook_config->search_phone_mobile); + g_signal_connect (G_OBJECT(item) , "clicked" , G_CALLBACK (search_phone_mobile_cb) , NULL); + gtk_box_pack_start (GTK_BOX(box) , item , TRUE , TRUE , 1); + + gtk_widget_show_all(ret); + + return ret; + +} + +gboolean addressbook_display (AddressBook_Config *settings, const gchar *field) { + + gboolean display = FALSE; + + if (g_strcasecmp (field, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO) == 0) + display = (settings->display_contact_photo == 1)? TRUE : FALSE; + + else if (g_strcasecmp (field, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS) == 0) + display = (settings->search_phone_business == 1)? TRUE : FALSE; + + else if (g_strcasecmp (field, ADDRESSBOOK_DISPLAY_PHONE_HOME) == 0) + display = (settings->search_phone_home == 1)? TRUE : FALSE; + + else if (g_strcasecmp (field, ADDRESSBOOK_DISPLAY_PHONE_MOBILE) == 0) + display = (settings->search_phone_mobile == 1)? TRUE : FALSE; + + else + display = FALSE; + + return display; +} diff --git a/sflphone-gtk/src/addressbook-config.h b/sflphone-gtk/src/addressbook-config.h new file mode 100644 index 0000000000000000000000000000000000000000..f880d726bb33500eca10b4f3b302eb26195fe001 --- /dev/null +++ b/sflphone-gtk/src/addressbook-config.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2009 Savoir-Faire Linux inc. + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef _ADDRESS_BOOK_CONFIG +#define _ADDRESS_BOOK_CONFIG + +#include <gtk/gtk.h> +#include <glib/gtypes.h> + +#include "actions.h" + +G_BEGIN_DECLS + +#define ADDRESSBOOK_MAX_RESULTS "ADDRESSBOOK_MAX_RESULTS" +#define ADDRESSBOOK_DISPLAY_CONTACT_PHOTO "ADDRESSBOOK_DISPLAY_CONTACT_PHOTO" +#define ADDRESSBOOK_DISPLAY_PHONE_BUSINESS "ADDRESSBOOK_DISPLAY_PHONE_BUSINESS" +#define ADDRESSBOOK_DISPLAY_PHONE_HOME "ADDRESSBOOK_DISPLAY_PHONE_HOME" +#define ADDRESSBOOK_DISPLAY_PHONE_MOBILE "ADDRESSBOOK_DISPLAY_PHONE_MOBILE" + +typedef struct _AddressBook_Config { + guint max_results; + guint display_contact_photo; + guint search_phone_home; + guint search_phone_business; + guint search_phone_mobile; +} AddressBook_Config; + +/** + * Save the parameters through D-BUS + */ +void addressbook_save_parameters (void); + +/** + * Initialize the address book structure, and retrieve the saved parameters through D-Bus + * + * @param settings The addressbook structure + */ +void addressbook_load_parameters (AddressBook_Config **settings); + +gboolean addressbook_display (AddressBook_Config *settings, const gchar *field); + +GtkWidget* create_addressbook_settings (); + +G_END_DECLS + +#endif // _ADDRESS_BOOK_CONFIG diff --git a/sflphone-gtk/src/calllist.c b/sflphone-gtk/src/calllist.c index c9629ad463cb8b8cd91d72294d39237e78d768c3..8bc082c668236e153a69a21b8709fc7145429f21 100644 --- a/sflphone-gtk/src/calllist.c +++ b/sflphone-gtk/src/calllist.c @@ -1,27 +1,27 @@ /* * Copyright (C) 2007 Savoir-Faire Linux inc. * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #include <calllist.h> #include <calltree.h> #include <dbus.h> -#include <string.h> +#include <glib/gprintf.h> /* * GQueue * callQueue = NULL; @@ -29,11 +29,11 @@ */ /* GCompareFunc to compare a callID (gchar* and a call_t) */ -gint +gint is_callID_callstruct ( gconstpointer a, gconstpointer b) { call_t * c = (call_t*)a; - if(strcmp(c->callID, (const gchar*) b) == 0) + if(g_strcasecmp(c->callID, (const gchar*) b) == 0) { return 0; } @@ -44,7 +44,7 @@ is_callID_callstruct ( gconstpointer a, gconstpointer b) } /* GCompareFunc to get current call (gchar* and a call_t) */ -gint +gint get_state_callstruct ( gconstpointer a, gconstpointer b) { call_t * c = (call_t*)a; @@ -58,30 +58,30 @@ get_state_callstruct ( gconstpointer a, gconstpointer b) } } -void +void call_list_init (calltab_t* tab) { tab->callQueue = g_queue_new (); tab->selectedCall = NULL; } -void +void call_list_clean (calltab_t* tab) { g_queue_free (tab->callQueue); } -void +void call_list_reset (calltab_t* tab) { g_queue_free (tab->callQueue); tab->callQueue = g_queue_new(); } -void +void call_list_add (calltab_t* tab, call_t * c) { - if( tab == history ) + if( tab == history ) { // First case: can still add calls to the list if( call_list_get_size(tab) < dbus_get_max_calls() ) @@ -92,7 +92,7 @@ call_list_add (calltab_t* tab, call_t * c) // List full -> Remove the last call from history and preprend the new call to the list else { - update_call_tree_remove( history , (call_t*)g_queue_pop_head( tab -> callQueue ) ); + update_call_tree_remove( history , (call_t*)g_queue_pop_head( tab -> callQueue ) ); g_queue_push_tail (tab->callQueue, (gpointer *) c); update_call_tree_add( history , c ); } @@ -126,7 +126,7 @@ call_list_remove_from_history( call_t* c ) g_print("Size of history = %i\n" , call_list_get_size( history )); } -void +void call_list_remove (calltab_t* tab, const gchar * callID) { call_t * c = call_list_get(tab, callID); @@ -137,7 +137,7 @@ call_list_remove (calltab_t* tab, const gchar * callID) } -call_t * +call_t * call_list_get_by_state (calltab_t* tab, call_state_t state ) { GList * c = g_queue_find_custom (tab->callQueue, &state, get_state_callstruct); @@ -145,11 +145,11 @@ call_list_get_by_state (calltab_t* tab, call_state_t state ) { return (call_t *)c->data; } - else + else { return NULL; } - + } guint @@ -158,13 +158,13 @@ call_list_get_size (calltab_t* tab) return g_queue_get_length (tab->callQueue); } -call_t * +call_t * call_list_get_nth (calltab_t* tab, guint n ) { return g_queue_peek_nth (tab->callQueue, n); } -gchar * +gchar * call_get_name (const call_t * c) { gchar * end = g_strrstr(c->from, "\""); @@ -176,7 +176,7 @@ call_get_name (const call_t * c) } } -gchar * +gchar * call_get_number (const call_t * c) { gchar * number = g_strrstr(c->from, "<") + 1; @@ -192,7 +192,7 @@ call_get_recipient( const call_t * c ) } -call_t * +call_t * call_list_get (calltab_t* tab, const gchar * callID ) { GList * c = g_queue_find_custom (tab->callQueue, callID, is_callID_callstruct); @@ -200,7 +200,7 @@ call_list_get (calltab_t* tab, const gchar * callID ) { return (call_t *)c->data; } - else + else { return NULL; } @@ -218,3 +218,27 @@ call_get_selected (calltab_t* tab) { return tab->selectedCall; } + +void create_new_call (gchar *to, gchar *from, call_state_t state, gchar *accountID, call_t **new_call) { + + gchar *call_id; + call_t *call; + + call = g_new0 (call_t, 1); + call->to = g_strdup (to); + call->from = g_strdup (from); + call->state = state; + call->accountID = g_strdup (accountID); + call->_start = 0; + call->_stop = 0; + + call_id = g_new0(gchar, 30); + g_sprintf(call_id, "%d", rand()); + call->callID = g_strdup (call_id); + + *new_call = call; +} + +void attach_thumbnail (call_t *call, GdkPixbuf *pixbuf) { + call->contact_thumbnail = pixbuf; +} diff --git a/sflphone-gtk/src/calllist.h b/sflphone-gtk/src/calllist.h index 98ed11dd7d3791f91b925aab902e15d1ef804a68..bfd773263bc7bf227f8341f15878723092b3ffd6 100644 --- a/sflphone-gtk/src/calllist.h +++ b/sflphone-gtk/src/calllist.h @@ -1,22 +1,22 @@ /* * Copyright (C) 2007 Savoir-Faire Linux inc. * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #ifndef __CALLLIST_H__ #define __CALLLIST_H__ @@ -25,31 +25,31 @@ /** @file calllist.h * @brief A list to hold calls. */ - -/** @enum call_state_t + +/** @enum call_state_t * This enum have all the states a call can take. */ typedef enum { /** Invalid state */ - CALL_STATE_INVALID = 0, + CALL_STATE_INVALID = 0, /** Ringing incoming call */ - CALL_STATE_INCOMING, + CALL_STATE_INCOMING, /** Ringing outgoing call */ - CALL_STATE_RINGING, + CALL_STATE_RINGING, /** Call to which the user can speak and hear */ - CALL_STATE_CURRENT, + CALL_STATE_CURRENT, /** Call which numbers are being added by the user */ - CALL_STATE_DIALING, + CALL_STATE_DIALING, /** Call is on hold */ - CALL_STATE_HOLD, + CALL_STATE_HOLD, /** Call has failed */ - CALL_STATE_FAILURE, + CALL_STATE_FAILURE, /** Call is busy */ - CALL_STATE_BUSY, + CALL_STATE_BUSY, /** Call is being transfert. During this state, the user can enter the new number. */ CALL_STATE_TRANSFERT, /** Call is on hold */ - CALL_STATE_RECORD + CALL_STATE_RECORD } call_state_t; /** @@ -64,25 +64,51 @@ typedef enum MISSED } history_state_t; +/** + * @enum call_type + * This enum have all types of call + */ +typedef enum +{ + CALL, + HISTORY, + CONTACT +} call_type_t; + +/** + * @enum contact_type + * This enum have all types of contacts: HOME phone, cell phone, etc... + */ +typedef enum +{ + CONTACT_PHONE_HOME, + CONTACT_PHONE_BUSINESS, + CONTACT_PHONE_MOBILE +} contact_type_t; + /** @struct call_t * @brief Call information. - * This struct holds information about a call. + * This struct holds information about a call. */ typedef struct { + /** Type of call entry */ + call_type_t call_type; /** Unique identifier of the call */ gchar * callID; /** The account used to place/receive the call */ gchar * accountID; -/** The information about the calling person. See call_get_name() and call_get_number() + /** The information about the calling person. See call_get_name() and call_get_number() * on how to get the name and number separately. */ gchar * from; /** The number we are calling. Only used when dialing out */ gchar * to; /** The current state of the call */ call_state_t state; - /** The history state */ + /** The history state if necessary */ history_state_t history_state; + GdkPixbuf *contact_thumbnail; + time_t _start; time_t _stop; @@ -100,6 +126,7 @@ typedef struct { calltab_t* current_calls; calltab_t* history; +calltab_t* contacts; /** This function initialize a call list. */ void call_list_init (calltab_t* tab); @@ -111,22 +138,22 @@ void call_list_clean(calltab_t* tab); void call_list_reset (calltab_t* tab); /** Get the maximun number of calls in the history calltab */ -gdouble call_history_get_max_calls( void ); +gdouble call_history_get_max_calls( void ); /** Set the maximun number of calls in the history calltab */ -void call_history_set_max_calls( const gdouble number ); +void call_history_set_max_calls( const gdouble number ); -/** This function append a call to list. - * @param c The call you want to add +/** This function append a call to list. + * @param c The call you want to add * */ void call_list_add (calltab_t* tab, call_t * c); -/** This function remove a call from list. +/** This function remove a call from list. * @param callID The callID of the call you want to remove */ void call_list_remove (calltab_t* tab, const gchar * callID); -/** Return the first call that corresponds to the state. +/** Return the first call that corresponds to the state. * This is usefull for unique states as DIALING and CURRENT. * @param state The state * @return A call or NULL */ @@ -151,10 +178,10 @@ call_t * call_list_get (calltab_t* tab, const gchar * callID ); * @return The full name of the caller or an empty string */ gchar * call_get_name ( const call_t * c); -/** +/** * This function parse the call_t.from field to return the number * @param c The call - * @return The number of the caller + * @return The number of the caller */ gchar * call_get_number (const call_t * c); @@ -178,4 +205,8 @@ void call_list_clean_history(); */ void call_list_remove_from_history( call_t* c); -#endif +void create_new_call (gchar *to, gchar *from, call_state_t state, gchar *accountID, call_t **new_call); + +void attach_thumbnail (call_t *call, GdkPixbuf *pixbuf); + +#endif diff --git a/sflphone-gtk/src/calltab.c b/sflphone-gtk/src/calltab.c index ca78b0269c4dae65454af0bb3376b4f95e4ca9a0..1ec9a9a95d357d03fa90fc93a8729924d0a6b020 100644 --- a/sflphone-gtk/src/calltab.c +++ b/sflphone-gtk/src/calltab.c @@ -1,17 +1,17 @@ /* * Copyright (C) 2007 Savoir-Faire Linux inc. * Author: Antoine Reversat <antoine.reversat@savoirfairelinux.com> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -27,6 +27,7 @@ calltab_t* calltab_init() { calltab_t* ret; + ret = malloc(sizeof(calltab_t)); ret->store = NULL; @@ -37,6 +38,6 @@ calltab_init() create_call_tree(ret); call_list_init(ret); - + return ret; } diff --git a/sflphone-gtk/src/calltab.h b/sflphone-gtk/src/calltab.h index dcc47b2605551556b6085ca6b67fab3021697d65..7d84696df2fa4f4471455b09859b54ccb75d5a79 100644 --- a/sflphone-gtk/src/calltab.h +++ b/sflphone-gtk/src/calltab.h @@ -1,22 +1,22 @@ /* * Copyright (C) 2007 Savoir-Faire Linux inc. * Author: Antoine Reversat <antoine.reversat@savoirfairelinux.com> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #ifndef __NOTEBOOK_H__ #define __NOTEBOOK_H__ diff --git a/sflphone-gtk/src/calltree.c b/sflphone-gtk/src/calltree.c index 7359a34bb1e6dde63b06c4e80bf607b236a5e4aa..b9fbdab365ebf7065185f8e2469a834cb0fc19e8 100644 --- a/sflphone-gtk/src/calltree.c +++ b/sflphone-gtk/src/calltree.c @@ -2,17 +2,17 @@ * Copyright (C) 2007 Savoir-Faire Linux inc. * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -27,8 +27,8 @@ #include <calllist.h> #include <menus.h> #include <dbus.h> - - +#include <contactlist/eds.h> +#include "addressbook-config.h" GtkWidget * toolbar; GtkToolItem * pickupButton; @@ -37,30 +37,33 @@ GtkToolItem * hangupButton; GtkToolItem * holdButton; GtkToolItem * transfertButton; GtkToolItem * unholdButton; -// GtkToolItem * historyButton; GtkToolItem * mailboxButton; GtkToolItem * recButton; +GtkToolItem * historyButton; +GtkToolItem * contactButton; + guint transfertButtonConnId; //The button toggled signal connection ID -gboolean history_shown; - void -switch_tab() +void +free_call_t (call_t *c) { - (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(historyButton)))? - gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(historyButton), FALSE): - gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(historyButton), TRUE); + g_free (c->callID); + g_free (c->accountID); + g_free (c->from); + g_free (c->to); + g_free (c); } /** * Show popup menu */ - static gboolean + static gboolean popup_menu (GtkWidget *widget, gpointer user_data UNUSED) { show_popup_menu(widget, NULL); return TRUE; -} +} static gboolean is_inserted( GtkWidget* button ) @@ -89,50 +92,52 @@ button_pressed(GtkWidget* widget, GdkEventButton *event, gpointer user_data UNUS /** * Make a call */ - static void + static void call_button( GtkWidget *widget UNUSED, gpointer data UNUSED) { - call_t * selectedCall = call_get_selected(active_calltree); - call_t* newCall = g_new0 (call_t, 1); - printf("Call button pressed\n"); + call_t * selectedCall; + call_t* new_call; + gchar *to, *from; + + selectedCall = call_get_selected(active_calltree); + if(call_list_get_size(current_calls)>0) sflphone_pick_up(); + else if(call_list_get_size(active_calltree) > 0){ if( selectedCall) { printf("Calling a called num\n"); - newCall->to = g_strdup(call_get_number(selectedCall)); - newCall->from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL); - newCall->state = CALL_STATE_DIALING; - newCall->callID = g_new0(gchar, 30); - g_sprintf(newCall->callID, "%d", rand()); - newCall->_start = 0; - newCall->_stop = 0; - - printf("call : from : %s to %s\n", newCall->from, newCall->to); - call_list_add(current_calls, newCall); - update_call_tree_add(current_calls, newCall); - sflphone_place_call(newCall); - if( active_calltree == history ) switch_tab(); + to = g_strdup(call_get_number(selectedCall)); + from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL); + + create_new_call (to, from, CALL_STATE_DIALING, "", &new_call); + + printf("call : from : %s to %s\n", new_call->from, new_call->to); + + call_list_add(current_calls, new_call); + update_call_tree_add(current_calls, new_call); + sflphone_place_call(new_call); + display_calltree (current_calls); } else { sflphone_new_call(); - if( active_calltree == history ) switch_tab(); + display_calltree(current_calls); } } else { sflphone_new_call(); - if( active_calltree == history ) switch_tab(); + display_calltree(current_calls); } } /** * Hang up the line */ - static void + static void hang_up( GtkWidget *widget UNUSED, gpointer data UNUSED) { sflphone_hang_up(); @@ -141,7 +146,7 @@ hang_up( GtkWidget *widget UNUSED, gpointer data UNUSED) /** * Hold the line */ - static void + static void hold( GtkWidget *widget UNUSED, gpointer data UNUSED) { sflphone_on_hold(); @@ -150,7 +155,7 @@ hold( GtkWidget *widget UNUSED, gpointer data UNUSED) /** * Transfert the line */ - static void + static void transfert (GtkToggleToolButton *toggle_tool_button, gpointer user_data UNUSED ) { @@ -168,56 +173,86 @@ transfert (GtkToggleToolButton *toggle_tool_button, /** * Unhold call */ - static void + static void unhold( GtkWidget *widget UNUSED, gpointer data UNUSED) { sflphone_off_hold(); } - static void -toggle_history(GtkToggleToolButton *toggle_tool_button UNUSED, - gpointer user_data UNUSED) +static void toggle_button_cb (GtkToggleToolButton *widget, gpointer user_data) { - GtkTreeSelection *sel; - if(history_shown){ - active_calltree = current_calls; - gtk_widget_hide(history->tree); - gtk_widget_show(current_calls->tree); - history_shown = FALSE; - }else{ - active_calltree = history; - gtk_widget_hide(current_calls->tree); - gtk_widget_show(history->tree); - history_shown = TRUE; - } - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (active_calltree->view)); - g_signal_emit_by_name(sel, "changed"); - toolbar_update_buttons(); - gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(histfilter)); + calltab_t * to_switch; + gboolean toggle; + + to_switch = (calltab_t*) user_data; + toggle = gtk_toggle_tool_button_get_active (widget); + + g_print ("%i\n", toggle); + + (toggle)? display_calltree (to_switch) : display_calltree (current_calls); +} + +void create_new_entry_in_contactlist (gchar *contact_name, gchar *contact_phone, contact_type_t type, GdkPixbuf *photo){ + + gchar *from; + call_t *new_call; + GdkPixbuf *pixbuf; + + /* Check if the information is valid */ + if (g_strcasecmp (contact_phone, EMPTY_ENTRY) != 0){ + from = g_strconcat("\"" , contact_name, "\"<", contact_phone, ">", NULL); + create_new_call (from, from, CALL_STATE_DIALING, "", &new_call); + + // Attach a pixbuf to a contact + if (photo) { + attach_thumbnail (new_call, photo); + } + else { + switch (type) { + case CONTACT_PHONE_BUSINESS: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/face-monkey.svg", NULL); + break; + case CONTACT_PHONE_HOME: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/home.svg", NULL); + break; + case CONTACT_PHONE_MOBILE: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/users.svg", NULL); + break; + default: + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/contact_default.svg", NULL); + break; + } + attach_thumbnail (new_call, pixbuf); + } + + call_list_add (contacts, new_call); + update_call_tree_add(contacts, new_call); + } } static void call_mailbox( GtkWidget* widget UNUSED, gpointer data UNUSED) { - account_t* current = account_list_get_current(); - if( current == NULL ) // Should not happens - return; - call_t* mailboxCall = g_new0( call_t , 1); - mailboxCall->state = CALL_STATE_DIALING; - mailboxCall->to = g_strdup(g_hash_table_lookup(current->properties, ACCOUNT_MAILBOX)); - mailboxCall->from = g_markup_printf_escaped(_("\"Voicemail\" <%s>"), mailboxCall->to); - mailboxCall->callID = g_new0(gchar, 30); - g_sprintf(mailboxCall->callID, "%d", rand()); - mailboxCall->accountID = g_strdup(current->accountID); - mailboxCall->_start = 0; - mailboxCall->_stop = 0; - g_print("TO : %s\n" , mailboxCall->to); - call_list_add( current_calls , mailboxCall ); - update_call_tree_add( current_calls , mailboxCall ); - update_menus(); - sflphone_place_call( mailboxCall ); - if( active_calltree == history ) switch_tab(); + account_t* current; + call_t *mailbox_call; + gchar *to, *from, *account_id; + + current = account_list_get_current (); + if( current == NULL ) // Should not happens + return; + + to = g_strdup(g_hash_table_lookup(current->properties, ACCOUNT_MAILBOX)); + from = g_markup_printf_escaped(_("\"Voicemail\" <%s>"), to); + account_id = g_strdup (current->accountID); + + create_new_call (to, from, CALL_STATE_DIALING, account_id, &mailbox_call); + g_print("TO : %s\n" , mailbox_call->to); + call_list_add( current_calls , mailbox_call ); + update_call_tree_add( current_calls , mailbox_call ); + update_menus(); + sflphone_place_call( mailbox_call ); + display_calltree(current_calls); } @@ -225,14 +260,14 @@ call_mailbox( GtkWidget* widget UNUSED, gpointer data UNUSED) /** * Static rec_button */ -static void +static void rec_button( GtkWidget *widget UNUSED, gpointer data UNUSED) { sflphone_rec_call(); } - void + void toolbar_update_buttons () { gtk_widget_set_sensitive( GTK_WIDGET(callButton), FALSE); @@ -262,12 +297,12 @@ toolbar_update_buttons () call_t * selectedCall = call_get_selected(active_calltree); if (selectedCall) { - switch(selectedCall->state) + switch(selectedCall->state) { case CALL_STATE_INCOMING: gtk_widget_set_sensitive( GTK_WIDGET(pickupButton), TRUE); gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), TRUE); - g_object_ref(callButton); + g_object_ref(callButton); gtk_container_remove(GTK_CONTAINER(toolbar), GTK_WIDGET(callButton)); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), pickupButton, 0); break; @@ -300,7 +335,7 @@ toolbar_update_buttons () case CALL_STATE_BUSY: case CALL_STATE_FAILURE: gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), TRUE); - break; + break; case CALL_STATE_TRANSFERT: gtk_signal_handler_block(GTK_OBJECT(transfertButton),transfertButtonConnId); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(transfertButton), TRUE); @@ -318,11 +353,11 @@ toolbar_update_buttons () gtk_widget_set_sensitive( GTK_WIDGET(recButton), TRUE); break; default: - g_warning("Should not happen!"); + g_warning("Toolbar update - Should not happen!"); break; } } - else + else { if( account_list_get_size() > 0 ) { @@ -339,8 +374,8 @@ toolbar_update_buttons () /* Call back when the user click on a call in the list */ - static void -selected(GtkTreeSelection *sel, void* data UNUSED ) + static void +selected(GtkTreeSelection *sel, void* data UNUSED ) { GtkTreeIter iter; GValue val; @@ -362,11 +397,12 @@ selected(GtkTreeSelection *sel, void* data UNUSED ) void row_activated(GtkTreeView *tree_view UNUSED, GtkTreePath *path UNUSED, GtkTreeViewColumn *column UNUSED, - void * data UNUSED) + void * data UNUSED) { g_print("double click action\n"); call_t* selectedCall; - call_t* newCall; + call_t* new_call; + gchar *to, *from, *account_id; selectedCall = call_get_selected( active_calltree ); if (selectedCall) @@ -374,7 +410,7 @@ void row_activated(GtkTreeView *tree_view UNUSED, // Get the right event from the right calltree if( active_calltree == current_calls ) { - switch(selectedCall->state) + switch(selectedCall->state) { case CALL_STATE_INCOMING: dbus_accept(selectedCall); @@ -392,33 +428,28 @@ void row_activated(GtkTreeView *tree_view UNUSED, sflphone_place_call (selectedCall); break; default: - g_warning("Should not happen!"); + g_warning("Row activated - Should not happen!"); break; } } // if history else { - newCall = g_new0( call_t, 1 ); - newCall->to = g_strdup(call_get_number(selectedCall)); - newCall->from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL); - newCall->state = CALL_STATE_DIALING; - newCall->callID = g_new0(gchar, 30); - g_sprintf(newCall->callID, "%d", rand()); - newCall->_start = 0; - newCall->_stop = 0; - printf("call : account : %s \n", selectedCall->accountID); - newCall->accountID = selectedCall->accountID; - printf("call : from : %s to %s\n", newCall->from, newCall->to); - call_list_add(current_calls, newCall); - update_call_tree_add(current_calls, newCall); - sflphone_place_call(newCall); - switch_tab(); + to = g_strdup(call_get_number(selectedCall)); + from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL); + account_id = g_strdup (selectedCall->accountID); + + create_new_call (to, from, CALL_STATE_DIALING, account_id, &new_call); + + call_list_add(current_calls, new_call); + update_call_tree_add(current_calls, new_call); + sflphone_place_call(new_call); + display_calltree(current_calls); } } } - GtkWidget * + GtkWidget * create_toolbar () { GtkWidget *ret; @@ -445,7 +476,7 @@ create_toolbar () gtk_widget_set_tooltip_text(GTK_WIDGET(pickupButton), _("Pick up")); #endif gtk_widget_set_state( GTK_WIDGET(pickupButton), GTK_STATE_INSENSITIVE); - g_signal_connect(G_OBJECT (pickupButton), "clicked", + g_signal_connect(G_OBJECT (pickupButton), "clicked", G_CALLBACK (call_button), NULL); gtk_widget_show_all(GTK_WIDGET(pickupButton)); @@ -457,7 +488,7 @@ create_toolbar () gtk_widget_set_state( GTK_WIDGET(hangupButton), GTK_STATE_INSENSITIVE); g_signal_connect (G_OBJECT (hangupButton), "clicked", G_CALLBACK (hang_up), NULL); - gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(hangupButton), -1); + gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(hangupButton), -1); image = gtk_image_new_from_file( ICONS_DIR "/unhold.svg"); unholdButton = gtk_tool_button_new (image, _("Off Hold")); @@ -490,21 +521,29 @@ create_toolbar () gtk_widget_set_state( GTK_WIDGET(transfertButton), GTK_STATE_INSENSITIVE); transfertButtonConnId = g_signal_connect (G_OBJECT (transfertButton), "toggled", G_CALLBACK (transfert), NULL); - gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(transfertButton), -1); + gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(transfertButton), -1); image = gtk_image_new_from_file( ICONS_DIR "/history2.svg"); historyButton = gtk_toggle_tool_button_new(); - gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(historyButton), image); + gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (historyButton), image); #if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text(GTK_WIDGET(historyButton), _("History")); #endif - gtk_tool_button_set_label(GTK_TOOL_BUTTON(historyButton), _("History")); - g_signal_connect (G_OBJECT (historyButton), "toggled", - G_CALLBACK (toggle_history), NULL); - gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(historyButton), -1); - history_shown = FALSE; + gtk_tool_button_set_label (GTK_TOOL_BUTTON (historyButton), _("History")); + g_signal_connect (G_OBJECT (historyButton), "toggled", G_CALLBACK (toggle_button_cb), history); + gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(historyButton), -1); active_calltree = current_calls; + image = gtk_image_new_from_file( ICONS_DIR "/addressbook.svg"); + contactButton = gtk_toggle_tool_button_new(); + gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (contactButton), image); +#if GTK_CHECK_VERSION(2,12,0) + gtk_widget_set_tooltip_text(GTK_WIDGET(contactButton), _("Address book")); +#endif + gtk_tool_button_set_label (GTK_TOOL_BUTTON (contactButton), _("Address book")); + g_signal_connect (G_OBJECT (contactButton), "toggled", G_CALLBACK (toggle_button_cb), contacts); + gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(contactButton), -1); + image = gtk_image_new_from_file( ICONS_DIR "/mailbox.svg"); mailboxButton = gtk_tool_button_new( image , _("Voicemail")); gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(mailboxButton), image); @@ -516,9 +555,6 @@ create_toolbar () G_CALLBACK (call_mailbox), NULL); gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(mailboxButton), -1); - - //image = gtk_image_new_from_file( ICONS_DIR "/record.svg"); - //recButton = gtk_tool_button_new (image, _("Record a call")); recButton = gtk_tool_button_new_from_stock (GTK_STOCK_MEDIA_RECORD); #if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text(GTK_WIDGET(recButton), _("Record a call")); @@ -531,14 +567,14 @@ create_toolbar () return ret; -} +} static gboolean on_key_released (GtkWidget *widget UNUSED, GdkEventKey *event, - gpointer user_data UNUSED) + gpointer user_data UNUSED) { // If a modifier key is pressed, it's a shortcut, pass along - if(event->state & GDK_CONTROL_MASK || + if(event->state & GDK_CONTROL_MASK || event->state & GDK_MOD1_MASK || event->keyval == 60 || // < event->keyval == 62 || // > @@ -554,7 +590,16 @@ on_key_released (GtkWidget *widget UNUSED, return TRUE; } - void +/** + * Reset call tree + */ + void +reset_call_tree (calltab_t* tab) +{ + gtk_list_store_clear (tab->store); +} + + void create_call_tree (calltab_t* tab) { GtkWidget *sw; @@ -562,7 +607,7 @@ create_call_tree (calltab_t* tab) GtkTreeViewColumn *col; GtkTreeSelection *sel; - tab->tree = gtk_vbox_new(FALSE, 10); + tab->tree = gtk_vbox_new(FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (tab->tree), 0); @@ -571,8 +616,8 @@ create_call_tree (calltab_t* tab) gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); g_signal_connect (G_OBJECT ( sw ), "key-release-event",G_CALLBACK (on_key_released), NULL); - tab->store = gtk_list_store_new (3, - GDK_TYPE_PIXBUF,// Icon + tab->store = gtk_list_store_new (3, + GDK_TYPE_PIXBUF,// Icon G_TYPE_STRING, // Description G_TYPE_POINTER // Pointer to the Object ); @@ -586,10 +631,10 @@ create_call_tree (calltab_t* tab) // Connect the popup menu g_signal_connect (G_OBJECT (tab->view), "popup-menu", - G_CALLBACK (popup_menu), + G_CALLBACK (popup_menu), NULL); g_signal_connect (G_OBJECT (tab->view), "button-press-event", - G_CALLBACK (button_pressed), + G_CALLBACK (button_pressed), NULL); @@ -617,13 +662,13 @@ create_call_tree (calltab_t* tab) gtk_box_pack_start(GTK_BOX(tab->tree), sw, TRUE, TRUE, 0); - gtk_widget_show(tab->tree); + gtk_widget_show(tab->tree); //toolbar_update_buttons(); } - void + void update_call_tree_remove (calltab_t* tab, call_t * c) { GtkTreeIter iter; @@ -655,7 +700,7 @@ update_call_tree_remove (calltab_t* tab, call_t * c) toolbar_update_buttons(); } - void + void update_call_tree (calltab_t* tab, call_t * c) { g_print("update call tree\n"); @@ -685,16 +730,16 @@ update_call_tree (calltab_t* tab, call_t * c) gchar * duration=""; if(c->state == CALL_STATE_TRANSFERT) { - description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>\n<i>Transfert to:</i> %s", - call_get_number(c), - call_get_name(c), + description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>\n<i>Transfert to:</i> %s", + call_get_number(c), + call_get_name(c), c->to); } else { - description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>", + description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>", call_get_number(c), - call_get_name(c)); + call_get_name(c)); } if( tab == current_calls ) @@ -726,7 +771,7 @@ update_call_tree (calltab_t* tab, call_t * c) pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/rec_call.svg", NULL); break; default: - g_warning("Should not happen!"); + g_warning("Update calltree - Should not happen!"); } } else @@ -746,10 +791,10 @@ update_call_tree (calltab_t* tab, call_t * c) pixbuf = gdk_pixbuf_new_from_file( ICONS_DIR "/missed.svg", NULL); break; default: - g_print("No history state\n"); + g_print("No history state\n"); break; } - date = timestamp_get_call_date(); + date = timestamp_get_call_date(); duration = process_call_duration(c); duration = g_strconcat( date , duration , NULL); description = g_strconcat( description , duration, NULL); @@ -770,14 +815,14 @@ update_call_tree (calltab_t* tab, call_t * c) if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - } + } } - } + } toolbar_update_buttons(); } - void + void update_call_tree_add (calltab_t* tab, call_t * c) { if( tab == history && ( call_list_get_size( tab ) > dbus_get_max_calls() ) ) @@ -790,9 +835,9 @@ update_call_tree_add (calltab_t* tab, call_t * c) // New call in the list gchar * description; gchar * date=""; - description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>", + description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>", call_get_number(c), - call_get_name(c)); + call_get_name(c)); gtk_list_store_prepend (tab->store, &iter); @@ -811,14 +856,15 @@ update_call_tree_add (calltab_t* tab, call_t * c) pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL); break; default: - g_warning("Should not happen!"); + g_warning("Update calltree add - Should not happen!"); } } - else{ + + else if (tab == history) { switch(c->history_state) { case INCOMING: - pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/incoming.svg", NULL); + pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/incoming.svg", NULL); break; case OUTGOING: pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/outgoing.svg", NULL); @@ -827,12 +873,22 @@ update_call_tree_add (calltab_t* tab, call_t * c) pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/missed.svg", NULL); break; default: - g_warning("History - Should not happen!"); + g_warning("History - Should not happen!"); } - date = timestamp_get_call_date(); + date = timestamp_get_call_date(); description = g_strconcat( date , description , NULL); } + else if (tab == contacts) { + pixbuf = c->contact_thumbnail; + description = g_strconcat( description , NULL); + } + + else { + g_warning ("This widget doesn't exist - This is a bug in the application\n."); + } + + //Resize it if(pixbuf) { @@ -850,8 +906,87 @@ update_call_tree_add (calltab_t* tab, call_t * c) if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf)); - sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view)); gtk_tree_selection_select_iter(GTK_TREE_SELECTION(sel), &iter); toolbar_update_buttons(); } + +void display_calltree (calltab_t *tab) { + + GtkTreeSelection *sel; + + g_print ("display_calltree called\n"); + + /* If we already are displaying the specified calltree */ + if (active_calltree == tab) + return; + + /* case 1: we want to display the main calltree */ + if (tab==current_calls) { + + g_print ("display main tab\n"); + + if (active_calltree==contacts) { + gtk_toggle_tool_button_set_active ((GtkToggleToolButton*)contactButton, FALSE); + } else { + gtk_toggle_tool_button_set_active ((GtkToggleToolButton*)historyButton, FALSE); + } + + } + + /* case 2: we want to display the history */ + else if (tab==history) { + + g_print ("display history tab\n"); + + if (active_calltree==contacts) { + gtk_toggle_tool_button_set_active ((GtkToggleToolButton*)contactButton, FALSE); + } + + gtk_toggle_tool_button_set_active ((GtkToggleToolButton*)historyButton, TRUE); + } + + else if (tab==contacts) { + + g_print ("display contact tab\n"); + + if (active_calltree==history) { + gtk_toggle_tool_button_set_active ((GtkToggleToolButton*)historyButton, FALSE); + } + + gtk_toggle_tool_button_set_active ((GtkToggleToolButton*)contactButton, TRUE); + } + + else + g_print ("calltree.c line 1050 . This is probably a bug in the application\n"); + + + gtk_widget_hide (active_calltree->tree); + active_calltree = tab; + gtk_widget_show (active_calltree->tree); + + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (active_calltree->view)); + g_signal_emit_by_name(sel, "changed"); + toolbar_update_buttons(); + //gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(histfilter)); +} + + + + + + + + + + + + + + + + + + + + diff --git a/sflphone-gtk/src/calltree.h b/sflphone-gtk/src/calltree.h index f1148a749f0802e8215e56bb402eef5a8d3e46ab..f307116040084dc7f11aaca0681bf7feb7e41b9c 100644 --- a/sflphone-gtk/src/calltree.h +++ b/sflphone-gtk/src/calltree.h @@ -1,22 +1,22 @@ /* * Copyright (C) 2007 Savoir-Faire Linux inc. * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #ifndef __CALLTREE_H__ #define __CALLTREE_H__ @@ -31,9 +31,12 @@ * @brief The GtkTreeView that list calls in the main window. */ -GtkToolItem * historyButton; +GtkWidget * filter_entry; calltab_t* active_calltree; + +void free_call_t (call_t *c); + /** * Create a new widget calltree * @return GtkWidget* A new widget @@ -54,7 +57,7 @@ void update_call_tree_add (calltab_t* ct, call_t * c); /* * Update the call tree if the call state changes * @param c The call to update - */ + */ void update_call_tree (calltab_t* ct, call_t * c); /** * Remove a call from the call tree @@ -62,12 +65,16 @@ void update_call_tree (calltab_t* ct, call_t * c); */ void update_call_tree_remove (calltab_t* ct, call_t * c); +void reset_call_tree (calltab_t* tab); + /** * Build the toolbar * @return GtkWidget* The toolbar */ GtkWidget * create_toolbar(); -void switch_tab( void ); +void display_calltree (calltab_t *tab); + +void create_new_entry_in_contactlist (gchar *contact_name, gchar *contact_phone, contact_type_t type, GdkPixbuf *photo); -#endif +#endif diff --git a/sflphone-gtk/src/configurationmanager-glue.h b/sflphone-gtk/src/configurationmanager-glue.h index 73169299172735238b6094755fef2ca4c797c373..194b6f27be4b6511492afa23c77d8b40d12f0ba0 100644 --- a/sflphone-gtk/src/configurationmanager-glue.h +++ b/sflphone-gtk/src/configurationmanager-glue.h @@ -2225,6 +2225,81 @@ org_sflphone_SFLphone_ConfigurationManager_is_stun_enabled_async (DBusGProxy *pr stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "isStunEnabled", org_sflphone_SFLphone_ConfigurationManager_is_stun_enabled_async_callback, stuff, g_free, G_TYPE_INVALID); } +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings (DBusGProxy *proxy, GHashTable** OUT_settings, GError **error) + +{ + return dbus_g_proxy_call (proxy, "getAddressbookSettings", error, G_TYPE_INVALID, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_INT), OUT_settings, G_TYPE_INVALID); +} + +typedef void (*org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings_reply) (DBusGProxy *proxy, GHashTable *OUT_settings, GError *error, gpointer userdata); + +static void +org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*) user_data; + GError *error = NULL; + GHashTable* OUT_settings; + dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_INT), &OUT_settings, G_TYPE_INVALID); + (*(org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings_reply)data->cb) (proxy, OUT_settings, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings_async (DBusGProxy *proxy, org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "getAddressbookSettings", org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings_async_callback, stuff, g_free, G_TYPE_INVALID); +} +static +#ifdef G_HAVE_INLINE +inline +#endif +gboolean +org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings (DBusGProxy *proxy, const GHashTable* IN_settings, GError **error) + +{ + return dbus_g_proxy_call (proxy, "setAddressbookSettings", error, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_INT), IN_settings, G_TYPE_INVALID, G_TYPE_INVALID); +} + +typedef void (*org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); + +static void +org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) +{ + DBusGAsyncData *data = (DBusGAsyncData*) user_data; + GError *error = NULL; + dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); + (*(org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings_reply)data->cb) (proxy, error, data->userdata); + return; +} + +static +#ifdef G_HAVE_INLINE +inline +#endif +DBusGProxyCall* +org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings_async (DBusGProxy *proxy, const GHashTable* IN_settings, org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings_reply callback, gpointer userdata) + +{ + DBusGAsyncData *stuff; + stuff = g_new (DBusGAsyncData, 1); + stuff->cb = G_CALLBACK (callback); + stuff->userdata = userdata; + return dbus_g_proxy_begin_call (proxy, "setAddressbookSettings", org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings_async_callback, stuff, g_free, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_INT), IN_settings, G_TYPE_INVALID); +} #endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_sflphone_SFLphone_ConfigurationManager */ G_END_DECLS diff --git a/sflphone-gtk/src/configwindow.c b/sflphone-gtk/src/configwindow.c index ae4c2652818457bc116391bb9eef36cde179075c..81063f99aa69c8020d0464c99f56a06df48b6b4e 100644 --- a/sflphone-gtk/src/configwindow.c +++ b/sflphone-gtk/src/configwindow.c @@ -28,6 +28,7 @@ #include <dbus.h> #include <mainwindow.h> #include <audioconf.h> +#include <addressbook-config.h> #include <stdlib.h> #include <stdio.h> @@ -738,6 +739,7 @@ show_config_window () GtkDialog * dialog; GtkWidget * notebook; GtkWidget * tab; + guint result; dialogOpen = TRUE; @@ -774,9 +776,16 @@ show_config_window () gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Record"))); gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); + // Addressbook tab + tab = create_addressbook_settings(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Address Book"))); + gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); + gtk_notebook_set_current_page( GTK_NOTEBOOK( notebook) , 1); - gtk_dialog_run(dialog); + result = gtk_dialog_run(dialog); + + save_configuration_parameters (); dialogOpen = FALSE; @@ -843,3 +852,9 @@ void config_window_set_stun_visible() { gtk_widget_set_sensitive( GTK_WIDGET(stunFrame), TRUE ); } + +void save_configuration_parameters (void) { + + addressbook_save_parameters (); + +} diff --git a/sflphone-gtk/src/configwindow.h b/sflphone-gtk/src/configwindow.h index ffb212706be5b3b48d2b125dc139bb2c6ade23df..4585b99ff665943f58a990346aeaa0b59ba5723c 100644 --- a/sflphone-gtk/src/configwindow.h +++ b/sflphone-gtk/src/configwindow.h @@ -116,4 +116,6 @@ void show_accounts_window(); void config_window_set_stun_visible(); +void save_configuration_parameters (void); + #endif diff --git a/sflphone-gtk/src/contactlist/Makefile.am b/sflphone-gtk/src/contactlist/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..d8fee4636b19b1bd2d28abe3d21b7753647c0412 --- /dev/null +++ b/sflphone-gtk/src/contactlist/Makefile.am @@ -0,0 +1,8 @@ +noinst_LTLIBRARIES = libcontact.la + +libcontact_la_SOURCES = \ + eds.c + +libcontact_la_LDFLAGS= -pthread -lebook-1.2 -lgnome-2 -lpopt -ledataserver-1.2 -lxml2 -lgconf-2 -lsoup-2.4 -lbonobo-2 -lbonobo-activation -lORBit-2 -lgthread-2.0 -lrt -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lz -lfontconfig -lgmodule-2.0 -lgobject-2.0 -lglib-2.0 + +libcontact_la_CFLAGS=-DORBIT2=1 -pthread -I/usr/include/evolution-data-server-2.24 -I/usr/include/libbonobo-2.0 -I/usr/include/libgnome-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/orbit-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/gconf/2 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/libxml2 -I/usr/include/libsoup-2.4 -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pygtk-2.0 diff --git a/sflphone-gtk/src/contactlist/TODO b/sflphone-gtk/src/contactlist/TODO new file mode 100644 index 0000000000000000000000000000000000000000..d520dd99e7feff8a03b173935df27517818fb38f --- /dev/null +++ b/sflphone-gtk/src/contactlist/TODO @@ -0,0 +1,7 @@ +Ref trac http://dev.savoirfairelinux.net/sflphone/report/3 + +* Ticket #163 +* Ticket #164 +* Ticket #165 +* Ticket #166 + diff --git a/sflphone-gtk/src/contactlist/eds.c b/sflphone-gtk/src/contactlist/eds.c new file mode 100644 index 0000000000000000000000000000000000000000..6071f27e96b2828284c850c8ffd05cabbff94cef --- /dev/null +++ b/sflphone-gtk/src/contactlist/eds.c @@ -0,0 +1,318 @@ +/* + * Copyright (C) 2009 Savoir-Faire Linux inc. + * Author: Julien Bonjean <julien.bonjean@savoirfairelinux.com> + * + * File originally copied from evolution module of deskbar-applet 2.24.1 + * Authors : + * Nigel Tao <nigel.tao@myrealbox.com> + * Raphaël Slinckx <raphael@slinckx.net> + * Mikkel Kamstrup Erlandsen <kamstrup@daimi.au.dk> + * Sebastian Pölsterl <marduk@k-d-w.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <glib.h> +#include <glib/gstring.h> +#include <string.h> +#include <pango/pango.h> +#include "eds.h" + +typedef struct _Handler_And_Data { + SearchAsyncHandler handler; + gpointer user_data; + GList *hits; + int max_results_remaining; + int book_views_remaining; +} Handler_And_Data; + +static GSList *books = NULL; +static int pixbuf_size = 32; + +static EContactField search_fields[] = { E_CONTACT_FULL_NAME, E_CONTACT_PHONE_BUSINESS, E_CONTACT_NICKNAME, 0 }; +static int n_search_fields = G_N_ELEMENTS (search_fields) - 1; + + void +free_hit (Hit *h) +{ + g_free (h->name); + g_free (h->phone_business); + g_free (h->phone_home); + g_free (h->phone_mobile); + g_free (h); +} + +/** + * Split a string of tokens separated by whitespace into an array of tokens. + */ + static GArray * +split_query_string (const gchar *str) +{ + GArray *parts = g_array_sized_new (FALSE, FALSE, sizeof (char *), 2); + PangoLogAttr *attrs; + guint str_len = strlen (str), word_start = 0, i; + + attrs = g_new0 (PangoLogAttr, str_len + 1); + /* TODO: do we need to specify a particular language or is NULL ok? */ + pango_get_log_attrs (str, -1, -1, NULL, attrs, str_len + 1); + + for (i = 0; i < str_len + 1; i++) { + char *start_word, *end_word, *word; + if (attrs[i].is_word_end) { + start_word = g_utf8_offset_to_pointer (str, word_start); + end_word = g_utf8_offset_to_pointer (str, i); + word = g_strndup (start_word, end_word - start_word); + g_array_append_val (parts, word); + } + if (attrs[i].is_word_start) { + word_start = i; + } + } + g_free (attrs); + return parts; +} + +/** + * Create a query which looks for the specified string in a contact's full name, email addresses and + * nick name. + */ + static EBookQuery* +create_query (const char* s) +{ + EBookQuery *query; + GArray *parts = split_query_string (s); + EBookQuery ***field_queries; + EBookQuery **q; + guint j; + int i; + + q = g_new0 (EBookQuery *, n_search_fields); + field_queries = g_new0 (EBookQuery **, n_search_fields); + + for (i = 0; i < n_search_fields; i++) { + field_queries[i] = g_new0 (EBookQuery *, parts->len); + for (j = 0; j < parts->len; j++) { + field_queries[i][j] = e_book_query_field_test (search_fields[i], E_BOOK_QUERY_CONTAINS, g_array_index (parts, gchar *, j)); + } + q[i] = e_book_query_and (parts->len, field_queries[i], TRUE); + } + g_array_free (parts, TRUE); + + query = e_book_query_or (n_search_fields, q, TRUE); + + for (i = 0; i < n_search_fields; i++) { + g_free (field_queries[i]); + } + g_free (field_queries); + g_free (q); + + return query; +} + +static GdkPixbuf* +pixbuf_from_contact (EContact *contact) +{ + GdkPixbuf *pixbuf = NULL; + EContactPhoto *photo = e_contact_get (contact, E_CONTACT_PHOTO); + if (photo) { + GdkPixbufLoader *loader; + + loader = gdk_pixbuf_loader_new (); + + if (photo->type == E_CONTACT_PHOTO_TYPE_INLINED) { + if (gdk_pixbuf_loader_write (loader, (guchar *) photo->data.inlined.data, photo->data.inlined.length, NULL)) + pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + } + + if (pixbuf) { + GdkPixbuf *tmp; + gint width = gdk_pixbuf_get_width (pixbuf); + gint height = gdk_pixbuf_get_height (pixbuf); + double scale = 1.0; + + if (height > width) { + scale = pixbuf_size / (double) height; + } else { + scale = pixbuf_size / (double) width; + } + + if (scale < 1.0) { + tmp = gdk_pixbuf_scale_simple (pixbuf, width * scale, height * scale, GDK_INTERP_BILINEAR); + g_object_unref (pixbuf); + pixbuf = tmp; + } + } + e_contact_photo_free (photo); + } + return pixbuf; +} + +/** + * Initialize address book + */ + void +init (void) +{ + GSList *list, *l; + ESourceList *source_list; + source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); + + if (source_list == NULL) { + return; + } + list = e_source_list_peek_groups (source_list); + + for (l = list; l != NULL; l = l->next) { + ESourceGroup *group = l->data; + GSList *sources = NULL, *m; + sources = e_source_group_peek_sources (group); + for (m = sources; m != NULL; m = m->next) { + ESource *source = m->data; + EBook *book = e_book_new (source, NULL); + if (book != NULL) { + books = g_slist_prepend (books, book); + e_book_open(book, TRUE, NULL); + } + } + } + + g_object_unref (source_list); +} + + static void +view_finish (EBookView *book_view, Handler_And_Data *had) +{ + SearchAsyncHandler had_handler = had->handler; + GList *had_hits = had->hits; + gpointer had_user_data = had->user_data; + g_free (had); + + g_return_if_fail (book_view != NULL); + g_object_unref (book_view); + + had_handler (had_hits, had_user_data); +} + + static void +view_contacts_added_cb (EBookView *book_view, GList *contacts, gpointer user_data) +{ + + GdkPixbuf *photo; + + Handler_And_Data *had = (Handler_And_Data *) user_data; + if (had->max_results_remaining <= 0) { + e_book_view_stop (book_view); + had->book_views_remaining--; + if (had->book_views_remaining == 0) { + view_finish (book_view, had); + return; + } + } + for (; contacts != NULL; contacts = g_list_next (contacts)) { + EContact *contact; + Hit *hit; + gchar *number; + + contact = E_CONTACT (contacts->data); + hit = g_new (Hit, 1); + + /* Get the photo contact */ + photo = pixbuf_from_contact (contact); + hit->photo = photo; + + /* Get business phone information */ + fetch_information_from_contact (contact, E_CONTACT_PHONE_BUSINESS, &number); + hit->phone_business = g_strdup (number); + + /* Get home phone information */ + fetch_information_from_contact (contact, E_CONTACT_PHONE_HOME, &number); + hit->phone_home = g_strdup (number); + + /* Get mobile phone information */ + fetch_information_from_contact (contact, E_CONTACT_PHONE_MOBILE, &number); + hit->phone_mobile = g_strdup (number); + + hit->name = g_strdup ((char*) e_contact_get_const (contact, E_CONTACT_NAME_OR_ORG)); + if(! hit->name) + hit->name = ""; + + had->hits = g_list_append (had->hits, hit); + had->max_results_remaining--; + if (had->max_results_remaining <= 0) { + e_book_view_stop (book_view); + had->book_views_remaining--; + if (had->book_views_remaining == 0) { + view_finish (book_view, had); + } + break; + } + } +} + + static void +view_completed_cb (EBookView *book_view, EBookViewStatus status, gpointer user_data) +{ + Handler_And_Data *had = (Handler_And_Data *) user_data; + had->book_views_remaining--; + if (had->book_views_remaining == 0) { + view_finish (book_view, had); + } +} + + void +search_async (const char *query, + int max_results, + SearchAsyncHandler handler, + gpointer user_data) +{ + GSList *iter; + + EBookQuery* book_query = create_query (query); + + Handler_And_Data *had = g_new (Handler_And_Data, 1); + had->handler = handler; + had->user_data = user_data; + had->hits = NULL; + had->max_results_remaining = max_results; + had->book_views_remaining = 0; + for (iter = books; iter != NULL; iter = iter->next) { + EBook *book = (EBook *) iter->data; + EBookView *book_view = NULL; + e_book_get_book_view (book, book_query, NULL, max_results, &book_view, NULL); + if (book_view != NULL) { + had->book_views_remaining++; + g_signal_connect (book_view, "contacts_added", (GCallback) view_contacts_added_cb, had); + g_signal_connect (book_view, "sequence_complete", (GCallback) view_completed_cb, had); + e_book_view_start (book_view); + } + } + if (had->book_views_remaining == 0) { + g_free (had); + } + + e_book_query_unref (book_query); +} + +void fetch_information_from_contact (EContact *contact, EContactField field, gchar **info){ + + gchar *to_fetch; + + to_fetch = g_strdup ((char*) e_contact_get_const (contact, field)); + if(! to_fetch) { + to_fetch = g_strdup (EMPTY_ENTRY); + } + + *info = g_strdup (to_fetch); +} diff --git a/sflphone-gtk/src/contactlist/eds.h b/sflphone-gtk/src/contactlist/eds.h new file mode 100644 index 0000000000000000000000000000000000000000..c0e411dc797f7be5edee7a6f0cfd7be84627b49c --- /dev/null +++ b/sflphone-gtk/src/contactlist/eds.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2009 Savoir-Faire Linux inc. + * Author: Julien Bonjean <julien.bonjean@savoirfairelinux.com> + * + * File originally copied from evolution module of deskbar-applet 2.24.1 + * Authors : + * Nigel Tao <nigel.tao@myrealbox.com> + * Raphaël Slinckx <raphael@slinckx.net> + * Mikkel Kamstrup Erlandsen <kamstrup@daimi.au.dk> + * Sebastian Pölsterl <marduk@k-d-w.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __EDS_H__ +#define __EDS_H__ + +#include <glib/gtypes.h> +#include <gdk-pixbuf/gdk-pixbuf.h> +#include <libebook/e-book.h> + +#define EMPTY_ENTRY "empty" + +G_BEGIN_DECLS + +/** + * Reprsent a contact entry + */ +typedef struct _Hit +{ + gchar *name; + GdkPixbuf *photo; + gchar *phone_business; + gchar *phone_home; + gchar *phone_mobile; +} Hit; + +/** + * Free a contact entry + */ +void free_hit (Hit *h); + +/** + * Template callback function for the asynchronous search + */ +typedef void (* SearchAsyncHandler) (GList *hits, gpointer user_data); + +/** + * Initialize the address book. + * Connection to evolution data server + */ +void init (void); + +/** + * Asynchronous search function + */ +void search_async (const char *query, + int max_results, + SearchAsyncHandler handler, + gpointer user_data); + +/** + * Retrieve the specified information from the contact + */ +void fetch_information_from_contact (EContact *contact, EContactField field, gchar **info); + +G_END_DECLS + +#endif /* __EDS_H__ */ diff --git a/sflphone-gtk/src/dbus.c b/sflphone-gtk/src/dbus.c index 428333e55943631d14c7a46afb0a816554c1da3c..45b9285619c32f0b4bdbe6632c08509d5d5dac0c 100644 --- a/sflphone-gtk/src/dbus.c +++ b/sflphone-gtk/src/dbus.c @@ -1448,3 +1448,34 @@ void dbus_enable_stun (void) g_error_free(error); } } + +GHashTable* dbus_get_addressbook_settings (void) { + + GError *error = NULL; + GHashTable *results = NULL; + + //g_print ("Calling org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings\n"); + + org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings (configurationManagerProxy, &results, &error); + if (error){ + g_print ("Error calling org_sflphone_SFLphone_ConfigurationManager_get_addressbook_settings\n"); + g_error_free (error); + } + + return results; +} + +void dbus_set_addressbook_settings (GHashTable * settings){ + + GError *error = NULL; + + g_print ("Calling org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings\n"); + + org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings (configurationManagerProxy, settings, &error); + if (error){ + g_print ("Error calling org_sflphone_SFLphone_ConfigurationManager_set_addressbook_settings\n"); + g_error_free (error); + } +} + + diff --git a/sflphone-gtk/src/dbus.h b/sflphone-gtk/src/dbus.h index f347a4a47e4395900d8b4fb4edb9417e9b82a421..7eac089d8ae3d9768301b2ac134e5cb77e10eb4f 100644 --- a/sflphone-gtk/src/dbus.h +++ b/sflphone-gtk/src/dbus.h @@ -446,4 +446,19 @@ void dbus_set_record (const call_t * c); void dbus_set_record_path (const gchar *path); gchar* dbus_get_record_path (void); +/** + * Encapsulate all the address book-related configuration + * Get the configuration + */ +GHashTable* dbus_get_addressbook_settings (void); + +/** + * Encapsulate all the address book-related configuration + * Set the configuration + */ +void dbus_set_addressbook_settings (GHashTable *); + + + + #endif diff --git a/sflphone-gtk/src/mainwindow.c b/sflphone-gtk/src/mainwindow.c index 6eaa0c0c723bed27ae928c77d4360422a6da2017..5eb09084712bba75755e6280d47930bcf7e927ad 100644 --- a/sflphone-gtk/src/mainwindow.c +++ b/sflphone-gtk/src/mainwindow.c @@ -2,22 +2,22 @@ * Copyright (C) 2007 Savoir-Faire Linux inc. * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + #include <config.h> #include <actions.h> #include <calltab.h> @@ -27,7 +27,7 @@ #include <mainwindow.h> #include <menus.h> #include <sliders.h> -#include <historyfilter.h> +#include <searchfilter.h> #include <assistant.h> #include <gtk/gtk.h> @@ -57,7 +57,7 @@ on_delete (GtkWidget * widget UNUSED, gpointer data UNUSED) } /** Ask the user if he wants to hangup current calls */ -gboolean +gboolean main_window_ask_quit(){ guint count = call_list_get_size(current_calls); GtkWidget * dialog; @@ -72,7 +72,7 @@ main_window_ask_quit(){ { question = _("There are calls in progress."); } - + dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW(window) , GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, @@ -81,12 +81,12 @@ main_window_ask_quit(){ question, _("Do you still want to quit?") ); - + response = gtk_dialog_run (GTK_DIALOG (dialog)); - + gtk_widget_destroy (dialog); if(response == GTK_RESPONSE_YES) - { + { return TRUE; } else if(response == GTK_RESPONSE_NO) @@ -105,7 +105,7 @@ create_main_window () gtk_container_set_border_width (GTK_CONTAINER (window), 0); gtk_window_set_title (GTK_WINDOW (window), PACKAGE); gtk_window_set_default_size (GTK_WINDOW (window), 258, 320); - gtk_window_set_default_icon_from_file (ICONS_DIR "/sflphone.png", + gtk_window_set_default_icon_from_file (ICONS_DIR "/sflphone.png", NULL); gtk_window_set_position( GTK_WINDOW( window ) , GTK_WIN_POS_MOUSE); @@ -123,26 +123,27 @@ create_main_window () vbox = gtk_vbox_new ( FALSE /*homogeneous*/, 0 /*spacing*/); subvbox = gtk_vbox_new ( FALSE /*homogeneous*/, 5 /*spacing*/); gtk_container_set_border_width (GTK_CONTAINER(subvbox), 5); - + widget = create_menus(); gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); - + widget = create_toolbar(); gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); gtk_box_pack_start (GTK_BOX (vbox), current_calls->tree, TRUE /*expand*/, TRUE /*fill*/, 0 /*padding*/); gtk_box_pack_start (GTK_BOX (vbox), history->tree, TRUE /*expand*/, TRUE /*fill*/, 0 /*padding*/); - + gtk_box_pack_start (GTK_BOX (vbox), contacts->tree, TRUE /*expand*/, TRUE /*fill*/, 0 /*padding*/); + gtk_box_pack_start (GTK_BOX (vbox), subvbox, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/); - + if( SHOW_SEARCHBAR ){ filterEntry = create_filter_entry(); gtk_box_pack_start (GTK_BOX (subvbox), filterEntry, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); gtk_widget_show_all ( filterEntry ); } - if( SHOW_VOLUME ){ + if( SHOW_VOLUME ){ speaker_control = create_slider("speaker"); gtk_box_pack_end (GTK_BOX (subvbox), speaker_control, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); gtk_widget_show_all (speaker_control); @@ -151,7 +152,7 @@ create_main_window () gtk_widget_show_all (mic_control); } - if( SHOW_DIALPAD ){ + if( SHOW_DIALPAD ){ dialpad = create_dialpad(); gtk_box_pack_end (GTK_BOX (subvbox), dialpad, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); gtk_widget_show_all (dialpad); @@ -167,10 +168,12 @@ create_main_window () /* dont't show the history */ gtk_widget_hide(history->tree); - //gtk_widget_show(current_calls->tree); - + + /* dont't show the contact list */ + gtk_widget_hide(contacts->tree); + gtk_tree_view_set_model(GTK_TREE_VIEW(history->view), GTK_TREE_MODEL(histfilter)); - // Configuration wizard + // Configuration wizard if (account_list_get_size() == 0) { #if GTK_CHECK_VERSION(2,10,0) @@ -194,13 +197,13 @@ create_main_window () } } -GtkAccelGroup * +GtkAccelGroup * get_accel_group() { return accelGroup; } -GtkWidget * +GtkWidget * get_main_window() { return window; @@ -215,7 +218,7 @@ main_window_message(GtkMessageType type, gchar * markup){ "%s\n", markup); gtk_dialog_run (GTK_DIALOG(dialog)); - + gtk_widget_destroy (GTK_WIDGET(dialog)); } @@ -286,15 +289,15 @@ main_window_searchbar( gboolean *state ){ } } -void +void statusbar_push_message(const gchar * message, guint id) -{ +{ gtk_statusbar_push(GTK_STATUSBAR(statusBar), id, message); } -void +void statusbar_pop_message(guint id) -{ +{ gtk_statusbar_pop(GTK_STATUSBAR(statusBar), id); } diff --git a/sflphone-gtk/src/menus.c b/sflphone-gtk/src/menus.c index c0a21e40f1238f66570060ba8f3a51c9d43c714a..2030f12ccef32560ea4b0d72b016d80b6eeca1fa 100644 --- a/sflphone-gtk/src/menus.c +++ b/sflphone-gtk/src/menus.c @@ -251,22 +251,23 @@ remove_from_history( void * foo UNUSED) static void call_back( void * foo UNUSED) { - call_t* selectedCall = call_get_selected( history ); - call_t* newCall = g_new0 (call_t, 1); - if( selectedCall ) - { - newCall->to = g_strdup(call_get_number(selectedCall)); - newCall->from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL); - newCall->state = CALL_STATE_DIALING; - newCall->callID = g_new0(gchar, 30); - g_sprintf(newCall->callID, "%d", rand()); - newCall->_start = 0; - newCall->_stop = 0; - call_list_add(current_calls, newCall); - update_call_tree_add(current_calls, newCall); - sflphone_place_call(newCall); - switch_tab(); - } + call_t *selected_call, *new_call; + gchar *to, *from; + + selected_call = call_get_selected( active_calltree ); + + if( selected_call ) + { + to = g_strdup(call_get_number(selected_call)); + from = g_strconcat("\"\" <", call_get_number(selected_call), ">",NULL); + + create_new_call (to, from, CALL_STATE_DIALING, "", &new_call); + + call_list_add(current_calls, new_call); + update_call_tree_add(current_calls, new_call); + sflphone_place_call(new_call); + display_calltree (current_calls); + } } GtkWidget * diff --git a/sflphone-gtk/src/searchfilter.c b/sflphone-gtk/src/searchfilter.c new file mode 100644 index 0000000000000000000000000000000000000000..8cc99aba8bb27ced019d15fc4030cb07da94540c --- /dev/null +++ b/sflphone-gtk/src/searchfilter.c @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2008 2009 Savoir-Faire Linux inc. + * + * Author: Antoine Reversat <antoine.reversat@savoirfairelinux.com> + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <string.h> + +#include <searchfilter.h> +#include <calltree.h> +#include <contactlist/eds.h> +#include "addressbook-config.h" + +static void handler_async_search (GList *hits, gpointer user_data UNUSED); + +GtkTreeModel* create_filter (GtkTreeModel* child) { + + GtkTreeModel* ret; + + ret = gtk_tree_model_filter_new(child, NULL); + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(ret), is_visible, NULL, NULL); + return GTK_TREE_MODEL(ret); + +} + +gboolean is_visible (GtkTreeModel* model, GtkTreeIter* iter, gpointer data UNUSED) { + + if( SHOW_SEARCHBAR ) + { + GValue val; + + gchar* text = NULL; + gchar* search = (gchar*)gtk_entry_get_text(GTK_ENTRY(filter_entry)); + memset (&val, 0, sizeof(val)); + gtk_tree_model_get_value(GTK_TREE_MODEL(model), iter, 1, &val); + if(G_VALUE_HOLDS_STRING(&val)){ + text = (gchar *)g_value_get_string(&val); + } + if(text != NULL && g_ascii_strncasecmp(search, _("Search"), 6) != 0){ + return g_regex_match_simple(search, text, G_REGEX_CASELESS, 0); + } + g_value_unset (&val); + return TRUE; + } + return TRUE; + +} + +static void handler_async_search (GList *hits, gpointer user_data) { + + GList *i; + GdkPixbuf *photo = NULL; + AddressBook_Config *addressbook_config; + call_t *j; + + // freeing calls + while((j = (call_t *)g_queue_pop_tail (contacts->callQueue)) != NULL) + { + free_call_t(j); + } + + // Retrieve the address book parameters + addressbook_config = (AddressBook_Config*) user_data; + + // reset previous results + reset_call_tree(contacts); + call_list_reset(contacts); + + for (i = hits; i != NULL; i = i->next) + { + Hit *entry; + entry = i->data; + if (entry) + { + /* Get the photo */ + if (addressbook_display (addressbook_config, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO)) + photo = entry->photo; + /* Create entry for business phone information */ + if (addressbook_display (addressbook_config, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS)) + create_new_entry_in_contactlist (entry->name, entry->phone_business, CONTACT_PHONE_BUSINESS, photo); + /* Create entry for home phone information */ + if (addressbook_display (addressbook_config, ADDRESSBOOK_DISPLAY_PHONE_HOME)) + create_new_entry_in_contactlist (entry->name, entry->phone_home, CONTACT_PHONE_HOME, photo); + /* Create entry for mobile phone information */ + if (addressbook_display (addressbook_config, ADDRESSBOOK_DISPLAY_PHONE_MOBILE)) + create_new_entry_in_contactlist (entry->name, entry->phone_mobile, CONTACT_PHONE_MOBILE, photo); + } + free_hit(entry); + } + g_list_free(hits); + +} + +void filter_entry_changed (GtkEntry* entry UNUSED, gchar* arg1 UNUSED, gpointer data UNUSED) { + + AddressBook_Config *addressbook_config; + + /* Switch to the address book when the focus is on the search bar */ + if (active_calltree == current_calls) + display_calltree (contacts); + + + /* We want to search in the contact list */ + if (active_calltree == contacts) { + // Load the address book parameters + addressbook_load_parameters (&addressbook_config); + // Start the asynchronous search as soon as we have an entry */ + search_async (gtk_entry_get_text (GTK_ENTRY (filter_entry)), addressbook_config->max_results, &handler_async_search, addressbook_config); + } + +} + +void clear_filter_entry_if_default (GtkWidget* widget UNUSED, gpointer user_data UNUSED) { + + if(g_ascii_strncasecmp(gtk_entry_get_text(GTK_ENTRY(filter_entry)), _("Search"), 6) == 0) + gtk_entry_set_text(GTK_ENTRY(filter_entry), ""); + +} + +GtkWidget* create_filter_entry() { + + GtkWidget* image; + GtkWidget* ret = gtk_hbox_new(FALSE, 0); + + filter_entry = sexy_icon_entry_new(); + //filter_entry = gtk_entry_new(); + image = gtk_image_new_from_stock( GTK_STOCK_FIND , GTK_ICON_SIZE_SMALL_TOOLBAR); + sexy_icon_entry_set_icon( SEXY_ICON_ENTRY(filter_entry), SEXY_ICON_ENTRY_PRIMARY , GTK_IMAGE(image) ); + sexy_icon_entry_add_clear_button( SEXY_ICON_ENTRY(filter_entry) ); + gtk_entry_set_text(GTK_ENTRY(filter_entry), _("Search")); + g_signal_connect(GTK_ENTRY(filter_entry), "changed", G_CALLBACK(filter_entry_changed), NULL); + g_signal_connect(GTK_ENTRY(filter_entry), "grab-focus", G_CALLBACK(clear_filter_entry_if_default), NULL); + + gtk_box_pack_start(GTK_BOX(ret), filter_entry, TRUE, TRUE, 0); + return ret; + +} diff --git a/sflphone-gtk/src/searchfilter.h b/sflphone-gtk/src/searchfilter.h new file mode 100644 index 0000000000000000000000000000000000000000..6a85eda4ae7b3b3af7bd6792dce7c0cd0a20d61b --- /dev/null +++ b/sflphone-gtk/src/searchfilter.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2008 2009 Savoir-Faire Linux inc. + * + * Author: Antoine Reversat <antoine.reversat@savoirfairelinux.com> + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __SEARCH_FILTER_H__ +#define __SEARCH_FILTER_H__ + +#include <calllist.h> +#include <gtk/gtk.h> +#include <libsexy/sexy-icon-entry.h> + +GtkTreeModel* create_filter(GtkTreeModel* child); + +gboolean is_visible(GtkTreeModel* model, GtkTreeIter* iter, gpointer data); + +GtkWidget* create_filter_entry(); + +#endif diff --git a/sflphone-gtk/src/sflphone_const.h b/sflphone-gtk/src/sflphone_const.h index cdd85602d928af95a22ee93580ab8be0885a96db..71f67fa2ec94795951c9e4d04d5eaa3fdedfac1f 100644 --- a/sflphone-gtk/src/sflphone_const.h +++ b/sflphone-gtk/src/sflphone_const.h @@ -94,4 +94,5 @@ /** Desktop notifications - Time before to close the notification*/ #define __TIMEOUT_TIME 18000 // 30 secondes + #endif diff --git a/src/Makefile.am b/src/Makefile.am index 7af7dbfec2d5350a0c1b9aa2d9cc6cfa4ec44835..62b16508816ef09325ff14cbc183059016e7c9b7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -25,7 +25,7 @@ sflphoned_SOURCES = \ eventthread.cpp \ sipaccount.cpp \ accountcreator.cpp \ - sipvoiplink.cpp \ + sipvoiplink.cpp \ call.cpp \ account.cpp \ sipcall.cpp \ @@ -33,6 +33,7 @@ sflphoned_SOURCES = \ sdpmedia.cpp \ $(IAXSOURCES) + sflphoned_CXXFLAGS = \ -DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone\" \ $(IAX_FLAGS) @@ -49,9 +50,11 @@ sflphoned_LDADD = \ @CCRTP_LIBS@ \ @ALSA_LIBS@ \ @PULSEAUDIO_LIBS@ \ - @SAMPLERATE_LIBS@ + @SAMPLERATE_LIBS@ \ + @LIBOPENSSL_LIBS@ -#sflphoned_LDFLAGS=-pg +# sflphoned_LDFLAGS= -pg -luuid +sflphoned_LDFLAGS= -luuid noinst_LTLIBRARIES = libsflphone.la @@ -72,10 +75,10 @@ noinst_HEADERS = \ sipcall.h \ sdp.h \ sdpmedia.h - + libsflphone_la_LIBADD = \ $(src)/libs/stund/libstun.la \ - $(src)/libs/utilspp/libutilspp.la \ + $(src)/libs/utilspp/libutilspp.la \ ./audio/libaudio.la \ ./dbus/libdbus.la \ ./config/libconfig.la \ diff --git a/src/audio/audiostream.cpp b/src/audio/audiostream.cpp index c031b4ac0d4a5119a7444736eb26a417d21d869f..01a56c974a63f160cb7cb1f8db1ebf3bd33c0690 100644 --- a/src/audio/audiostream.cpp +++ b/src/audio/audiostream.cpp @@ -66,7 +66,7 @@ AudioStream::stream_state_callback( pa_stream* s, void* user_data UNUSED ) case PA_STREAM_READY: _debug("Stream successfully created, connected to %s\n", pa_stream_get_device_name( s )); - pa_stream_cork( s, 0, NULL, NULL); + // pa_stream_cork( s, 0, NULL, NULL); break; case PA_STREAM_UNCONNECTED: _debug("Stream unconnected\n"); @@ -102,9 +102,8 @@ AudioStream::createStream( pa_context* c ) attributes->tlength = 10000; attributes->prebuf = 10000; attributes->minreq = 940; - pa_stream_connect_playback( s , NULL , attributes, - PA_STREAM_START_CORKED, - &_volume, NULL); + // pa_stream_connect_playback( s , NULL , attributes, PA_STREAM_INTERPOLATE_TIMING, &_volume, NULL); + pa_stream_connect_playback( s , NULL , attributes, PA_STREAM_START_CORKED, &_volume, NULL); } else if( _streamType == CAPTURE_STREAM ){ @@ -112,6 +111,7 @@ AudioStream::createStream( pa_context* c ) attributes->fragsize = (uint32_t)-1; pa_stream_connect_record( s , NULL , attributes , PA_STREAM_START_CORKED ); + // pa_stream_connect_record( s , NULL , attributes , PA_STREAM_INTERPOLATE_TIMING ); } else if( _streamType == UPLOAD_STREAM ){ pa_stream_connect_upload( s , 1024 ); diff --git a/src/audio/pulselayer.cpp b/src/audio/pulselayer.cpp index 8101e5e23839497707a618fe7f7afd1c08c533a2..6367de5248cf0a467ab168ff206fcacb55442e60 100644 --- a/src/audio/pulselayer.cpp +++ b/src/audio/pulselayer.cpp @@ -37,7 +37,7 @@ static void audioCallback ( pa_stream* s, size_t bytes, void* userdata ) , context(NULL) , m(NULL) , playback() - , record() + , record() { PulseLayer::streamState = 0; _debug("PulseLayer::Pulse audio constructor: Create context\n"); @@ -155,7 +155,7 @@ void PulseLayer::createStreams( pa_context* c ) bool PulseLayer::openDevice(int indexIn UNUSED, int indexOut UNUSED, int sampleRate, int frameSize , int stream UNUSED, std::string plugin UNUSED) { - _debug("PulseLayer::openDevice \n"); + _debug("PulseLayer::openDevice \n"); _sampleRate = sampleRate; _frameSize = frameSize; @@ -174,7 +174,7 @@ bool PulseLayer::openDevice(int indexIn UNUSED, int indexOut UNUSED, int sampleR connectPulseAudioServer(); - startStream(); + // startStream(); _debug("Connection Done!! \n"); return true; @@ -222,15 +222,16 @@ void PulseLayer::startStream (void) PulseLayer::stopStream (void) { _debug("PulseLayer::Stop stream\n"); - pa_stream_flush( playback->pulseStream(), NULL, NULL ); - pa_stream_flush( record->pulseStream(), NULL, NULL ); + pa_stream_flush( playback->pulseStream(), NULL, NULL ); + pa_stream_flush( record->pulseStream(), NULL, NULL ); - pa_stream_cork( playback->pulseStream(), 1, NULL, NULL); - pa_stream_cork( record->pulseStream(), 1, NULL, NULL); flushMic(); flushMain(); flushUrgent(); + + pa_stream_cork( playback->pulseStream(), 1, NULL, NULL); + pa_stream_cork( record->pulseStream(), 1, NULL, NULL); } @@ -255,6 +256,7 @@ void PulseLayer::stream_suspended_callback(pa_stream *s, void *userdata UNUSED ) void PulseLayer::processData( void ) { + // Handle the mic // We check if the stream is ready diff --git a/src/call.cpp b/src/call.cpp index b1625d346e3bc726bb6c48c66cf91a49e1323ad5..45ee195eee3aa6bfb5a32c6410e70983c166db05 100644 --- a/src/call.cpp +++ b/src/call.cpp @@ -30,6 +30,7 @@ Call::Call(const CallID& id, Call::CallType type) , _type(type) , _connectionState(Call::Disconnected) , _callState(Call::Inactive) + , _callConfig (Call::Classic) , _peerName() , _peerNumber() { diff --git a/src/call.h b/src/call.h index d82ff7ba583c2253571532ddcd7f80561cf3aad2..836ee3daa6cf444ee65e1531d9f5ac6d8a7d89a8 100644 --- a/src/call.h +++ b/src/call.h @@ -1,5 +1,6 @@ /* - * Copyright (C) 2004-2006 Savoir-Faire Linux inc. + * Copyright (C) 2004-2009 Savoir-Faire Linux inc. + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> * Author: Yan Morin <yan.morin@savoirfairelinux.com> * Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com> * @@ -25,6 +26,9 @@ #include "plug-in/audiorecorder/audiorecord.h" +#define IP_TO_IP_PATTERN "ip:" + +#define CallConfigNULL NULL /* * @file call.h * @brief A call is the base class for protocol-based calls @@ -35,219 +39,232 @@ typedef std::string CallID; class AudioRecord; class Call{ - public: - /** - * This determines if the call originated from the local user (Outgoing) - * or from some remote peer (Incoming). - */ - enum CallType {Incoming, Outgoing}; - - /** - * Tell where we're at with the call. The call gets Connected when we know - * from the other end what happened with out call. A call can be 'Connected' - * even if the call state is Busy, Refused, or Error. - * - * Audio should be transmitted when ConnectionState = Connected AND - * CallState = Active. - */ - enum ConnectionState {Disconnected, Trying, Progressing, Ringing, Connected}; - - /** - * The Call State. - */ - enum CallState {Inactive, Active, Hold, Busy, Refused, Error}; - - /** - * Constructor of a call - * @param id Unique identifier of the call - * @param type set definitely this call as incoming/outgoing - */ - Call(const CallID& id, Call::CallType type); - virtual ~Call(); - - /** - * Return a reference on the call id - * @return call id - */ - CallID& getCallId() {return _id; } - - /** - * Set the peer number (destination on outgoing) - * not protected by mutex (when created) - * @param number peer number - */ - void setPeerNumber(const std::string& number) { _peerNumber = number; } - - /** - * Get the peer number (destination on outgoing) - * not protected by mutex (when created) - * @return std::string The peer number - */ - const std::string& getPeerNumber() { return _peerNumber; } - - /** - * Set the peer name (caller in ingoing) - * not protected by mutex (when created) - * @param name The peer name - */ - void setPeerName(const std::string& name) { _peerName = name; } - - /** - * Get the peer name (caller in ingoing) - * not protected by mutex (when created) - * @return std::string The peer name - */ - const std::string& getPeerName() { return _peerName; } - - /** - * Tell if the call is incoming - * @return true if yes - * false otherwise - */ - bool isIncoming() { return (_type == Incoming) ? true : false; } - - /** - * Set the connection state of the call (protected by mutex) - * @param state The connection state - */ - void setConnectionState(ConnectionState state); - - /** - * Get the connection state of the call (protected by mutex) - * @return ConnectionState The connection state - */ - ConnectionState getConnectionState(); - - /** - * Set the state of the call (protected by mutex) - * @param state The call state - */ - void setState(CallState state); - - /** - * Get the call state of the call (protected by mutex) - * @return CallState The call state - */ - CallState getState(); - - /** - * Set the audio start boolean (protected by mutex) - * @param start true if we start the audio - * false otherwise - */ - void setAudioStart(bool start); - - /** - * Tell if the audio is started (protected by mutex) - * @return true if it's already started - * false otherwise - */ - bool isAudioStarted(); + public: + + /** + * This determines if the call is a direct IP-to-IP call or a classic call, made with an existing account + */ + enum CallConfiguration {Classic, IPtoIP}; + + /** + * This determines if the call originated from the local user (Outgoing) + * or from some remote peer (Incoming). + */ + enum CallType {Incoming, Outgoing}; + + /** + * Tell where we're at with the call. The call gets Connected when we know + * from the other end what happened with out call. A call can be 'Connected' + * even if the call state is Busy, Refused, or Error. + * + * Audio should be transmitted when ConnectionState = Connected AND + * CallState = Active. + */ + enum ConnectionState {Disconnected, Trying, Progressing, Ringing, Connected}; + + /** + * The Call State. + */ + enum CallState {Inactive, Active, Hold, Busy, Refused, Error}; + + /** + * Constructor of a call + * @param id Unique identifier of the call + * @param type set definitely this call as incoming/outgoing + */ + Call(const CallID& id, Call::CallType type); + virtual ~Call(); + + /** + * Return a reference on the call id + * @return call id + */ + CallID& getCallId() {return _id; } + + /** + * Set the peer number (destination on outgoing) + * not protected by mutex (when created) + * @param number peer number + */ + void setPeerNumber(const std::string& number) { _peerNumber = number; } + + /** + * Get the peer number (destination on outgoing) + * not protected by mutex (when created) + * @return std::string The peer number + */ + const std::string& getPeerNumber() { return _peerNumber; } + + /** + * Set the peer name (caller in ingoing) + * not protected by mutex (when created) + * @param name The peer name + */ + void setPeerName(const std::string& name) { _peerName = name; } + + /** + * Get the peer name (caller in ingoing) + * not protected by mutex (when created) + * @return std::string The peer name + */ + const std::string& getPeerName() { return _peerName; } + + /** + * Tell if the call is incoming + * @return true if yes + * false otherwise + */ + bool isIncoming() { return (_type == Incoming) ? true : false; } + + /** + * Set the connection state of the call (protected by mutex) + * @param state The connection state + */ + void setConnectionState(ConnectionState state); + + /** + * Get the connection state of the call (protected by mutex) + * @return ConnectionState The connection state + */ + ConnectionState getConnectionState(); + + /** + * Set the state of the call (protected by mutex) + * @param state The call state + */ + void setState(CallState state); + + /** + * Get the call state of the call (protected by mutex) + * @return CallState The call state + */ + CallState getState(); + + void setCallConfiguration (Call::CallConfiguration callConfig) { _callConfig = callConfig; } + + Call::CallConfiguration getCallConfiguration (void) { return _callConfig; } + + /** + * Set the audio start boolean (protected by mutex) + * @param start true if we start the audio + * false otherwise + */ + void setAudioStart(bool start); + + /** + * Tell if the audio is started (protected by mutex) + * @return true if it's already started + * false otherwise + */ + bool isAudioStarted(); + + /** + * Set my IP [not protected] + * @param ip The local IP address + */ + void setLocalIp(const std::string& ip) { _localIPAddress = ip; } + + /** + * Set local audio port, as seen by me [not protected] + * @param port The local audio port + */ + void setLocalAudioPort(unsigned int port) { _localAudioPort = port;} + + /** + * Set the audio port that remote will see. + * @param port The external audio port + */ + void setLocalExternAudioPort(unsigned int port) { _localExternalAudioPort = port; } /** - * Set my IP [not protected] - * @param ip The local IP address - */ - void setLocalIp(const std::string& ip) { _localIPAddress = ip; } - - /** - * Set local audio port, as seen by me [not protected] - * @param port The local audio port - */ - void setLocalAudioPort(unsigned int port) { _localAudioPort = port;} - - /** - * Set the audio port that remote will see. - * @param port The external audio port - */ - void setLocalExternAudioPort(unsigned int port) { _localExternalAudioPort = port; } - - /** - * Return the audio port seen by the remote side. - * @return unsigned int The external audio port - */ - unsigned int getLocalExternAudioPort() { return _localExternalAudioPort; } - - /** - * Return my IP [mutex protected] - * @return std::string The local IP - */ - const std::string& getLocalIp(); - - /** - * Return port used locally (for my machine) [mutex protected] - * @return unsigned int The local audio port - */ - unsigned int getLocalAudioPort(); - - /** - * @return Return the file name for this call - */ - std::string getFileName() {return _filename;} - - /** - * A recorder for this call - */ - AudioRecord recAudio; - - /** - * SetRecording - */ - void setRecording(); - - /** - * stopRecording, make sure the recording is stopped (whe transfering call) - */ - void stopRecording(); - - /** - * Return Recording state - */ - bool isRecording(); - - /** - * - */ - void initRecFileName(); - - protected: - /** Protect every attribute that can be changed by two threads */ - ost::Mutex _callMutex; - - bool _audioStarted; - - // Informations about call socket / audio - - /** My IP address */ - std::string _localIPAddress; - - /** Local audio port, as seen by me. */ - unsigned int _localAudioPort; - - /** Port assigned to my machine by the NAT, as seen by remote peer (he connects there) */ - unsigned int _localExternalAudioPort; - - - private: - - /** Unique ID of the call */ - CallID _id; - - /** Type of the call */ - CallType _type; - /** Disconnected/Progressing/Trying/Ringing/Connected */ - ConnectionState _connectionState; - /** Inactive/Active/Hold/Busy/Refused/Error */ - CallState _callState; - - /** Name of the peer */ - std::string _peerName; - - /** Number of the peer */ - std::string _peerNumber; - - /** File name for his call : time YY-MM-DD */ - std::string _filename; + * Return the audio port seen by the remote side. + * @return unsigned int The external audio port + */ + unsigned int getLocalExternAudioPort() { return _localExternalAudioPort; } + + /** + * Return my IP [mutex protected] + * @return std::string The local IP + */ + const std::string& getLocalIp(); + + /** + * Return port used locally (for my machine) [mutex protected] + * @return unsigned int The local audio port + */ + unsigned int getLocalAudioPort(); + + /** + * @return Return the file name for this call + */ + std::string getFileName() {return _filename;} + + /** + * A recorder for this call + */ + AudioRecord recAudio; + + /** + * SetRecording + */ + void setRecording(); + + /** + * stopRecording, make sure the recording is stopped (whe transfering call) + */ + void stopRecording(); + + /** + * Return Recording state + */ + bool isRecording(); + + /** + * + */ + void initRecFileName(); + + protected: + /** Protect every attribute that can be changed by two threads */ + ost::Mutex _callMutex; + + bool _audioStarted; + + // Informations about call socket / audio + + /** My IP address */ + std::string _localIPAddress; + + /** Local audio port, as seen by me. */ + unsigned int _localAudioPort; + + /** Port assigned to my machine by the NAT, as seen by remote peer (he connects there) */ + unsigned int _localExternalAudioPort; + + + private: + + /** Unique ID of the call */ + CallID _id; + + /** Type of the call */ + CallType _type; + /** Disconnected/Progressing/Trying/Ringing/Connected */ + ConnectionState _connectionState; + /** Inactive/Active/Hold/Busy/Refused/Error */ + CallState _callState; + + /** Direct IP-to-IP or classic call */ + CallConfiguration _callConfig; + + /** Name of the peer */ + std::string _peerName; + + /** Number of the peer */ + std::string _peerNumber; + + /** File name for his call : time YY-MM-DD */ + std::string _filename; }; #endif diff --git a/src/dbus/configurationmanager-glue.h b/src/dbus/configurationmanager-glue.h index 8a69473ca12dadccbdd9f9a2db4dd03d9c7d8a7e..3c9eacbf7a2558bafadec844bb1056c7939a9211 100644 --- a/src/dbus/configurationmanager-glue.h +++ b/src/dbus/configurationmanager-glue.h @@ -79,6 +79,8 @@ public: register_method(ConfigurationManager_adaptor, getStunServer, _getStunServer_stub); register_method(ConfigurationManager_adaptor, enableStun, _enableStun_stub); register_method(ConfigurationManager_adaptor, isStunEnabled, _isStunEnabled_stub); + register_method(ConfigurationManager_adaptor, getAddressbookSettings, _getAddressbookSettings_stub); + register_method(ConfigurationManager_adaptor, setAddressbookSettings, _setAddressbookSettings_stub); } ::DBus::IntrospectedInterface *const introspect() const @@ -373,6 +375,16 @@ public: { "state", "i", false }, { 0, 0, 0 } }; + static ::DBus::IntrospectedArgument getAddressbookSettings_args[] = + { + { "settings", "a{si}", false }, + { 0, 0, 0 } + }; + static ::DBus::IntrospectedArgument setAddressbookSettings_args[] = + { + { "settings", "a{si}", true }, + { 0, 0, 0 } + }; static ::DBus::IntrospectedArgument parametersChanged_args[] = { { "list", "a{ss}", false }, @@ -448,6 +460,8 @@ public: { "getStunServer", getStunServer_args }, { "enableStun", enableStun_args }, { "isStunEnabled", isStunEnabled_args }, + { "getAddressbookSettings", getAddressbookSettings_args }, + { "setAddressbookSettings", setAddressbookSettings_args }, { 0, 0 } }; static ::DBus::IntrospectedMethod ConfigurationManager_adaptor_signals[] = @@ -541,6 +555,8 @@ public: virtual std::string getStunServer() = 0; virtual void enableStun() = 0; virtual int32_t isStunEnabled() = 0; + virtual std::map< std::string, int32_t > getAddressbookSettings() = 0; + virtual void setAddressbookSettings(const std::map< std::string, int32_t >& settings) = 0; public: @@ -1130,6 +1146,25 @@ private: wi << argout1; return reply; } + ::DBus::Message _getAddressbookSettings_stub(const ::DBus::CallMessage &call) + { + ::DBus::MessageIter ri = call.reader(); + + std::map< std::string, int32_t > argout1 = getAddressbookSettings(); + ::DBus::ReturnMessage reply(call); + ::DBus::MessageIter wi = reply.writer(); + wi << argout1; + return reply; + } + ::DBus::Message _setAddressbookSettings_stub(const ::DBus::CallMessage &call) + { + ::DBus::MessageIter ri = call.reader(); + + std::map< std::string, int32_t > argin1; ri >> argin1; + setAddressbookSettings(argin1); + ::DBus::ReturnMessage reply(call); + return reply; + } }; } } } diff --git a/src/dbus/configurationmanager-introspec.xml b/src/dbus/configurationmanager-introspec.xml index 01c91654cd3c1c10ad888b23af38a15b0376fb55..6f897c2c2a0fd1082fa27fd4534bc3ac34f3c45c 100644 --- a/src/dbus/configurationmanager-introspec.xml +++ b/src/dbus/configurationmanager-introspec.xml @@ -242,6 +242,15 @@ <arg type="i" name="state" direction="out"/> </method> + <!-- Addressbook configuration --> + <method name="getAddressbookSettings"> + <arg type="a{si}" name="settings" direction="out"/> + </method> + + <method name="setAddressbookSettings"> + <arg type="a{si}" name="settings" direction="in"/> + </method> + <!-- ///////////////////////////// --> <signal name="parametersChanged"> <arg type="a{ss}" name="list" direction="out"/> diff --git a/src/dbus/configurationmanager.cpp b/src/dbus/configurationmanager.cpp index e2caf05e47f3633afbea0e167579ee5b4cbf4ebd..ac26ec4a42491e654ec61ef4e14c1aad2a207382 100644 --- a/src/dbus/configurationmanager.cpp +++ b/src/dbus/configurationmanager.cpp @@ -425,3 +425,11 @@ int32_t ConfigurationManager::isStunEnabled (void) { return Manager::instance().isStunEnabled(); } + +std::map<std::string, int32_t> ConfigurationManager::getAddressbookSettings (void) { + return Manager::instance().getAddressbookSettings (); +} + +void ConfigurationManager::setAddressbookSettings (const std::map<std::string, int32_t>& settings) { + Manager::instance().setAddressbookSettings (settings); +} diff --git a/src/dbus/configurationmanager.h b/src/dbus/configurationmanager.h index 6d5c87dacfc0d7edeed34d03d0b020c41495e320..ebbc728d1d99807b4f7d106f2fd8033af4d3d6d6 100644 --- a/src/dbus/configurationmanager.h +++ b/src/dbus/configurationmanager.h @@ -104,6 +104,9 @@ public: void enableStun (void); int32_t isStunEnabled (void); + std::map<std::string, int32_t> getAddressbookSettings (void); + void setAddressbookSettings (const std::map<std::string, int32_t>& settings); + }; diff --git a/src/iaxvoiplink.cpp b/src/iaxvoiplink.cpp index 79466dc5028ab6093d3c3565d0d2ed8818162977..af965c32a460679ae66af53c6e763fbe12b494f3 100644 --- a/src/iaxvoiplink.cpp +++ b/src/iaxvoiplink.cpp @@ -218,8 +218,7 @@ IAXVoIPLink::getEvent() if(call){ - // _debug("Are we recording"); - call->recAudio.recData(spkrDataConverted,micData,nbSampleForRec_,nbSampleForRec_); + call->recAudio.recData(spkrDataConverted,micData,nbSampleForRec_,nbSampleForRec_); } // Do the doodle-moodle to send audio from the microphone to the IAX channel. @@ -230,7 +229,6 @@ IAXVoIPLink::getEvent() sendRegister(""); } - // _debug("IAXVoIPLink::getEvent() \n"); // reinitialize speaker buffer for recording (when recording a voice mail) for (int i = 0; i < nbSampleForRec_; i++) spkrDataConverted[i] = 0; diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 4ad23121b347059f92cc050def291349b38f7c52..3978225bdb8368d6de6884f9a031218109bb1257 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -80,6 +80,7 @@ ManagerImpl::ManagerImpl (void) , _hasZeroconf(false) , _callAccountMap() , _callAccountMapMutex() + , _callConfigMap() , _accountMap() { @@ -188,13 +189,35 @@ ManagerImpl::switchCall(const CallID& id ) { // Management of events' IP-phone user /////////////////////////////////////////////////////////////////////////////// /* Main Thread */ + bool ManagerImpl::outgoingCall(const std::string& accountid, const CallID& id, const std::string& to) { + std::string pattern; + Call::CallConfiguration callConfig; + SIPVoIPLink *siplink; + _debug("ManagerImpl::outgoingCall() method \n"); - stopTone(false); - playTone(); + // stopTone(false); + // playTone(); + + /* Check what kind of call we are dealing with */ + check_call_configuration (id, to, &callConfig); + + if (callConfig == Call::IPtoIP) { + _debug ("Start IP to IP call\n"); + /* We need to retrieve the sip voiplink instance */ + siplink = SIPVoIPLink::instance(""); + if (siplink->new_ip_to_ip_call (id, to)) { + switchCall (id); + return true; + } + else { + callFailure (id); + } + return false; + } if (!accountExists(accountid)) { _debug("! Manager Error: Outgoing Call: account doesn't exist\n"); @@ -236,27 +259,13 @@ ManagerImpl::answerCall(const CallID& id) if (currentcall->getState() == 1) isActive = true; - stopTone(false); + // stopTone(false); _debug("Try to answer call: %s\n", id.data()); AccountID accountid = getAccountFromCall( id ); if (accountid == AccountNULL) { _debug("Answering Call: Call doesn't exists\n"); return false; } - - /* - _debug("_nbIncomingWaitingCall =======>>>>>>>> %i \n",_nbIncomingWaitingCall); - - CallIDSet::iterator iter = _waitingCall.begin(); - while (iter != _waitingCall.end()) { - CallID ident = *iter; - AccountID acc = getAccountFromCall( ident ); - Call* call = getAccountLink(acc)->getCall(ident); - _debug("ManagerImpl::answerCall :: incoming call ident: %s \n",ident.c_str()); - _debug("ManagerImpl::answerCall :: incoming call state: %i \n",call->getState()); - ++iter; - } - */ // if (id != getCurrentCallId()) { if (isActive) { @@ -278,7 +287,7 @@ ManagerImpl::answerCall(const CallID& id) switchCall(id); std::string codecName = getCurrentCodecName(id); - _debug("ManagerImpl::hangupCall(): broadcast codec name %s \n",codecName.c_str()); + // _debug("ManagerImpl::hangupCall(): broadcast codec name %s \n",codecName.c_str()); if (_dbus) _dbus->getCallManager()->currentSelectedCodec(id,codecName.c_str()); return true; @@ -297,19 +306,23 @@ ManagerImpl::hangupCall(const CallID& id) /* Broadcast a signal over DBus */ if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); - - accountid = getAccountFromCall( id ); - if (accountid == AccountNULL) { - /** @todo We should tell the GUI that the call doesn't exist, so - * it clears up. This can happen. */ - _debug("! Manager Hangup Call: Call doesn't exists\n"); - return false; + + /* Direct IP to IP call */ + if (getConfigFromCall (id) == Call::IPtoIP) { + returnValue = SIPVoIPLink::instance (AccountNULL)->hangup (id); } - returnValue = getAccountLink(accountid)->hangup(id); + /* Classic call, attached to an account */ + else { + accountid = getAccountFromCall( id ); + if (accountid == AccountNULL) { + _debug("! Manager Hangup Call: Call doesn't exists\n"); + return false; + } + returnValue = getAccountLink(accountid)->hangup(id); + removeCallAccount(id); + } - _debug("After voip link hungup!\n"); - removeCallAccount(id); switchCall(""); if( _audiodriver->getLayerType() == PULSEAUDIO && getConfigInt( PREFERENCES , CONFIG_PA_VOLUME_CTRL ) ) { @@ -324,43 +337,64 @@ ManagerImpl::hangupCall(const CallID& id) bool ManagerImpl::cancelCall (const CallID& id) { - stopTone(true); - AccountID accountid = getAccountFromCall( id ); - if (accountid == AccountNULL) { - _debug("! Manager Cancel Call: Call doesn't exists\n"); - return false; - } + AccountID accountid; + bool returnValue; - bool returnValue = getAccountLink(accountid)->cancel(id); - // it could be a waiting call? - removeWaitingCall(id); - removeCallAccount(id); - switchCall(""); + stopTone(true); - return returnValue; + /* Direct IP to IP call */ + if (getConfigFromCall (id) == Call::IPtoIP) { + returnValue = SIPVoIPLink::instance (AccountNULL)->cancel (id); + } + + /* Classic call, attached to an account */ + else { + accountid = getAccountFromCall( id ); + if (accountid == AccountNULL) { + _debug("! Manager Cancel Call: Call doesn't exists\n"); + return false; + } + returnValue = getAccountLink(accountid)->cancel(id); + removeCallAccount(id); + } + + // it could be a waiting call? + removeWaitingCall(id); + switchCall(""); + + return returnValue; } //THREAD=Main bool ManagerImpl::onHoldCall(const CallID& id) { + AccountID accountid; + bool returnValue; - stopTone(true); - AccountID accountid = getAccountFromCall( id ); - if (accountid == AccountNULL) { - _debug("5 Manager On Hold Call: Account ID %s or callid %s doesn't exists\n", accountid.c_str(), id.c_str()); - return false; - } + stopTone(true); - _debug("Setting ONHOLD, Account %s, callid %s\n", accountid.c_str(), id.c_str()); + /* Direct IP to IP call */ + if (getConfigFromCall (id) == Call::IPtoIP) { + returnValue = SIPVoIPLink::instance (AccountNULL)-> onhold (id); + } - bool returnValue = getAccountLink(accountid)->onhold(id); + /* Classic call, attached to an account */ + else { + accountid = getAccountFromCall( id ); + if (accountid == AccountNULL) { + _debug("Manager On Hold Call: Account ID %s or callid %s doesn't exists\n", accountid.c_str(), id.c_str()); + return false; + } + returnValue = getAccountLink(accountid)->onhold(id); + } - removeWaitingCall(id); - if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HOLD"); - switchCall(""); + removeWaitingCall(id); + switchCall(""); + + if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HOLD"); - return returnValue; + return returnValue; } //THREAD=Main @@ -368,86 +402,117 @@ ManagerImpl::onHoldCall(const CallID& id) ManagerImpl::offHoldCall(const CallID& id) { - stopTone(false); - AccountID accountid = getAccountFromCall( id ); - if (accountid == AccountNULL) { - _debug("5 Manager OffHold Call: Call doesn't exists\n"); - return false; - } + AccountID accountid; + bool returnValue, rec; + std::string codecName; - //Place current call on hold if it isn't - if (hasCurrentCall()) - { - onHoldCall(getCurrentCallId()); - } + stopTone(false); - _debug("Setting OFFHOLD, Account %s, callid %s\n", accountid.c_str(), id.c_str()); + //Place current call on hold if it isn't + if (hasCurrentCall()) + { + onHoldCall(getCurrentCallId()); + } - bool rec = getAccountLink(accountid)->isRecording(id); - - /* - if(rec) - _debug("ManagerImpl::offHoldCall(): Record state is true \n"); - else - _debug("ManagerImpl::offHoldCall(): Record state is false \n"); - */ + /* Direct IP to IP call */ + if (getConfigFromCall (id) == Call::IPtoIP) { + rec = SIPVoIPLink::instance (AccountNULL)-> isRecording (id); + returnValue = SIPVoIPLink::instance (AccountNULL)-> offhold (id); + } - bool returnValue = getAccountLink(accountid)->offhold(id); + /* Classic call, attached to an account */ + else { + accountid = getAccountFromCall( id ); + if (accountid == AccountNULL) { + _debug("Manager OffHold Call: Call doesn't exists\n"); + return false; + } + _debug("Setting OFFHOLD, Account %s, callid %s\n", accountid.c_str(), id.c_str()); + rec = getAccountLink(accountid)->isRecording(id); + returnValue = getAccountLink(accountid)->offhold(id); + } - if (_dbus){ - if (rec) - _dbus->getCallManager()->callStateChanged(id, "UNHOLD_RECORD"); - else - _dbus->getCallManager()->callStateChanged(id, "UNHOLD_CURRENT"); - } - switchCall(id); + if (_dbus){ + if (rec) + _dbus->getCallManager()->callStateChanged(id, "UNHOLD_RECORD"); + else + _dbus->getCallManager()->callStateChanged(id, "UNHOLD_CURRENT"); + } + + switchCall(id); - std::string codecName = getCurrentCodecName(id); - _debug("ManagerImpl::hangupCall(): broadcast codec name %s \n",codecName.c_str()); - if (_dbus) _dbus->getCallManager()->currentSelectedCodec(id,codecName.c_str()); + codecName = getCurrentCodecName(id); + _debug("ManagerImpl::hangupCall(): broadcast codec name %s \n",codecName.c_str()); + if (_dbus) _dbus->getCallManager()->currentSelectedCodec(id,codecName.c_str()); - return returnValue; + return returnValue; } //THREAD=Main bool ManagerImpl::transferCall(const CallID& id, const std::string& to) { - stopTone(true); - AccountID accountid = getAccountFromCall( id ); - if (accountid == AccountNULL) { - _debug("! Manager Transfer Call: Call doesn't exists\n"); - return false; - } - bool returnValue = getAccountLink(accountid)->transfer(id, to); - removeWaitingCall(id); - removeCallAccount(id); - if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); - switchCall(""); - return returnValue; + AccountID accountid; + bool returnValue; + + stopTone(true); + + /* Direct IP to IP call */ + if (getConfigFromCall (id) == Call::IPtoIP) { + returnValue = SIPVoIPLink::instance (AccountNULL)-> transfer (id, to); + } + + /* Classic call, attached to an account */ + else { + accountid = getAccountFromCall( id ); + if (accountid == AccountNULL) { + _debug("! Manager Transfer Call: Call doesn't exists\n"); + return false; + } + returnValue = getAccountLink(accountid)->transfer(id, to); + removeCallAccount(id); + } + + removeWaitingCall(id); + switchCall(""); + + if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); + return returnValue; } //THREAD=Main : Call:Incoming bool ManagerImpl::refuseCall (const CallID& id) { - _debug("ManagerImpl::refuseCall(): method called"); - stopTone(true); - AccountID accountid = getAccountFromCall( id ); - if (accountid == AccountNULL) { - _debug("! Manager OffHold Call: Call doesn't exists\n"); - return false; - } - bool returnValue = getAccountLink(accountid)->refuse(id); - // if the call was outgoing or established, we didn't refuse it - // so the method did nothing - if (returnValue) { - removeWaitingCall(id); - removeCallAccount(id); - if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); - switchCall(""); - } - return returnValue; + AccountID accountid; + bool returnValue; + + stopTone(true); + + /* Direct IP to IP call */ + if (getConfigFromCall (id) == Call::IPtoIP) { + returnValue = SIPVoIPLink::instance (AccountNULL)-> refuse (id); + } + + /* Classic call, attached to an account */ + else { + accountid = getAccountFromCall( id ); + if (accountid == AccountNULL) { + _debug("! Manager OffHold Call: Call doesn't exists\n"); + return false; + } + returnValue = getAccountLink(accountid)->refuse(id); + removeCallAccount(id); + } + + // if the call was outgoing or established, we didn't refuse it + // so the method did nothing + if (returnValue) { + removeWaitingCall(id); + if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); + switchCall(""); + } + return returnValue; } //THREAD=Main @@ -691,13 +756,14 @@ ManagerImpl::incomingMessage(const AccountID& accountId, const std::string& mess void ManagerImpl::peerAnsweredCall(const CallID& id) { - if (isCurrentCall(id)) { - stopTone(false); - } - if (_dbus) _dbus->getCallManager()->callStateChanged(id, "CURRENT"); + if (isCurrentCall(id)) { + stopTone(false); + } + + if (_dbus) _dbus->getCallManager()->callStateChanged(id, "CURRENT"); std::string codecName = getCurrentCodecName(id); - _debug("ManagerImpl::hangupCall(): broadcast codec name %s \n",codecName.c_str()); + // _debug("ManagerImpl::hangupCall(): broadcast codec name %s \n",codecName.c_str()); if (_dbus) _dbus->getCallManager()->currentSelectedCodec(id,codecName.c_str()); } @@ -1114,6 +1180,13 @@ ManagerImpl::initConfigFile ( bool load_user_value ) fill_config_int(CONFIG_PA_VOLUME_CTRL , YES_STR); fill_config_int(CONFIG_SIP_PORT, DFT_SIP_PORT); + section = ADDRESSBOOK; + fill_config_int (ADDRESSBOOK_MAX_RESULTS, "25"); + fill_config_int (ADDRESSBOOK_DISPLAY_CONTACT_PHOTO, NO_STR); + fill_config_int (ADDRESSBOOK_DISPLAY_PHONE_BUSINESS, YES_STR); + fill_config_int (ADDRESSBOOK_DISPLAY_PHONE_HOME, NO_STR); + fill_config_int (ADDRESSBOOK_DISPLAY_PHONE_MOBILE, NO_STR); + // Loads config from ~/.sflphone/sflphonedrc or so.. if (createSettingsPath() == 1 && load_user_value) { _exist = _config.populateFromFile(_path); @@ -2371,11 +2444,15 @@ void ManagerImpl::restartPJSIP (void) VoIPLink* ManagerImpl::getAccountLink(const AccountID& accountID) { - Account* acc = getAccount(accountID); - if ( acc ) { - return acc->getVoIPLink(); - } - return 0; + if (accountID!=AccountNULL) { + Account* acc = getAccount(accountID); + if ( acc ) { + return acc->getVoIPLink(); + } + return 0; + } + else + return SIPVoIPLink::instance(""); } VoIPLink* ManagerImpl::getSIPAccountLink() @@ -2438,65 +2515,76 @@ void ManagerImpl::registerCurSIPAccounts(VoIPLink *link) } } -#ifdef TEST -/** - * Test accountMap - */ -bool ManagerImpl::testCallAccountMap() -{ - if ( getAccountFromCall(1) != AccountNULL ) { - _debug("TEST: getAccountFromCall with empty list failed\n"); - } - if ( removeCallAccount(1) != false ) { - _debug("TEST: removeCallAccount with empty list failed\n"); - } - CallID newid = getNewCallID(); - if ( associateCallToAccount(newid, "acc0") == false ) { - _debug("TEST: associateCallToAccount with new CallID empty list failed\n"); - } - if ( associateCallToAccount(newid, "acc1") == true ) { - _debug("TEST: associateCallToAccount with a known CallID failed\n"); - } - if ( getAccountFromCall( newid ) != "acc0" ) { - _debug("TEST: getAccountFromCall don't return the good account id\n"); - } - CallID secondnewid = getNewCallID(); - if ( associateCallToAccount(secondnewid, "xxxx") == true ) { - _debug("TEST: associateCallToAccount with unknown account id failed\n"); - } - if ( removeCallAccount( newid ) != true ) { - _debug("TEST: removeCallAccount don't remove the association\n"); - } - return true; +std::map<std::string, int32_t> ManagerImpl::getAddressbookSettings () { + + std::map<std::string, int32_t> settings; + + settings.insert (std::pair<std::string, int32_t> ("ADDRESSBOOK_MAX_RESULTS", getConfigInt (ADDRESSBOOK, ADDRESSBOOK_MAX_RESULTS)) ); + settings.insert (std::pair<std::string, int32_t> ("ADDRESSBOOK_DISPLAY_CONTACT_PHOTO", getConfigInt (ADDRESSBOOK, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO))); + settings.insert (std::pair<std::string, int32_t> ("ADDRESSBOOK_DISPLAY_PHONE_BUSINESS", getConfigInt (ADDRESSBOOK, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS))); + settings.insert (std::pair<std::string, int32_t> ("ADDRESSBOOK_DISPLAY_PHONE_HOME", getConfigInt (ADDRESSBOOK, ADDRESSBOOK_DISPLAY_PHONE_HOME))); + settings.insert (std::pair<std::string, int32_t> ("ADDRESSBOOK_DISPLAY_PHONE_MOBILE", getConfigInt (ADDRESSBOOK, ADDRESSBOOK_DISPLAY_PHONE_MOBILE))); + + return settings; } -/** - * Test AccountMap - */ -bool ManagerImpl::testAccountMap() -{ - if (loadAccountMap() != 2) { - _debug("TEST: loadAccountMap didn't load 2 account\n"); - } - if (accountExists("acc0") == false) { - _debug("TEST: accountExists didn't find acc0\n"); - } - if (accountExists("accZ") != false) { - _debug("TEST: accountExists found an unknown account\n"); - } - if (getAccount("acc0") == 0) { - _debug("TEST: getAccount didn't find acc0\n"); - } - if (getAccount("accZ") != 0) { - _debug("TEST: getAccount found an unknown account\n"); - } - unloadAccountMap(); - if ( accountExists("acc0") == true ) { - _debug("TEST: accountExists found an account after unloadAccount\n"); - } - return true; +void ManagerImpl::setAddressbookSettings (const std::map<std::string, int32_t>& settings){ + + setConfig(ADDRESSBOOK, ADDRESSBOOK_MAX_RESULTS, (*settings.find("ADDRESSBOOK_MAX_RESULTS")).second); + setConfig(ADDRESSBOOK, ADDRESSBOOK_DISPLAY_CONTACT_PHOTO , (*settings.find("ADDRESSBOOK_DISPLAY_CONTACT_PHOTO")).second); + setConfig(ADDRESSBOOK, ADDRESSBOOK_DISPLAY_PHONE_BUSINESS , (*settings.find("ADDRESSBOOK_DISPLAY_PHONE_BUSINESS")).second); + setConfig(ADDRESSBOOK, ADDRESSBOOK_DISPLAY_PHONE_HOME , (*settings.find("ADDRESSBOOK_DISPLAY_PHONE_HOME")).second); + setConfig(ADDRESSBOOK, ADDRESSBOOK_DISPLAY_PHONE_MOBILE , (*settings.find("ADDRESSBOOK_DISPLAY_PHONE_MOBILE")).second); + + // Write it to the configuration file + saveConfig (); } +void ManagerImpl::check_call_configuration (const CallID& id, const std::string &to, Call::CallConfiguration *callConfig) { + std::string pattern; + Call::CallConfiguration config; + + /* Check if the call is an IP-to-IP call */ + /* For an IP-to-IP call, we don't need any account */ + /* Pattern looked for : ip:xxx.xxx.xxx.xxx */ + pattern = to.substr (0,3); + if (pattern==IP_TO_IP_PATTERN) { + config = Call::IPtoIP; + } else { + config = Call::Classic; + } + associateConfigToCall (id, config); + *callConfig = config; +} + + +bool ManagerImpl::associateConfigToCall (const CallID& callID, Call::CallConfiguration config) { + + if (getConfigFromCall(callID) == CallConfigNULL) { // nothing with the same ID + _callConfigMap[callID] = config; + _debug("Associate Call %s with config %i\n", callID.data(), config); + return true; + } else { + return false; + } +} + +Call::CallConfiguration ManagerImpl::getConfigFromCall(const CallID& callID) { + + CallConfigMap::iterator iter = _callConfigMap.find(callID); + if ( iter == _callConfigMap.end()) { + return (Call::CallConfiguration)CallConfigNULL; + } else { + return iter->second; + } +} + +bool ManagerImpl::removeCallConfig(const CallID& callID) { + + if ( _callConfigMap.erase(callID) ) { + return true; + } + return false; +} -#endif diff --git a/src/managerimpl.h b/src/managerimpl.h index 0765bac47619e05229a9f0fbca829f97a17611f1..c9c919d77b7a4dcf1c7f51b022bc507af12e08c9 100644 --- a/src/managerimpl.h +++ b/src/managerimpl.h @@ -58,6 +58,8 @@ typedef std::map<AccountID, Account*> AccountMap; /** Define a type for a CallID to AccountID Map inside ManagerImpl */ typedef std::map<CallID, AccountID> CallAccountMap; +typedef std::map<CallID, Call::CallConfiguration> CallConfigMap; + /** Define a type for CallID vector (waiting list, incoming not answered) */ typedef std::set<CallID> CallIDSet; @@ -553,6 +555,17 @@ class ManagerImpl { */ void setMailNotify( void ); + + /** + * Addressbook configuration + */ + std::map<std::string, int32_t> getAddressbookSettings (void); + + /** + * Addressbook configuration + */ + void setAddressbookSettings (const std::map<std::string, int32_t>& settings); + /** * Get the audio manager * @return int The audio manager @@ -989,6 +1002,14 @@ class ManagerImpl { /** Mutex to lock the call account map (main thread + voiplink thread) */ ost::Mutex _callAccountMapMutex; + CallConfigMap _callConfigMap; + + bool associateConfigToCall (const CallID& callID, Call::CallConfiguration config); + + Call::CallConfiguration getConfigFromCall(const CallID& callID); + + bool removeCallConfig(const CallID& callID); + /** Associate a new CallID to a AccountID * Protected by mutex * @param callID the new CallID not in the list yet @@ -1053,7 +1074,7 @@ public: * @param accountID Account ID to get * @return VoIPLink* The voip link from the account pointer or 0 */ - VoIPLink* getAccountLink(const AccountID& accountID); + VoIPLink* getAccountLink(const AccountID& accountID=AccountNULL); VoIPLink* getSIPAccountLink (void); @@ -1076,6 +1097,11 @@ private: // Assignment Operator ManagerImpl& operator=( const ManagerImpl& rh); + /** + * Check if the call is a classic call or a direct IP-to-IP call + */ + void check_call_configuration (const CallID& id, const std::string& to, Call::CallConfiguration *callConfig); + #ifdef TEST bool testCallAccountMap(); bool testAccountMap(); diff --git a/src/samplerateconverter.cpp b/src/samplerateconverter.cpp index a4e8474d37127fac823216486bd550cff6a711c5..e1990f930e89af183a183d4f55de26cfec82857b 100644 --- a/src/samplerateconverter.cpp +++ b/src/samplerateconverter.cpp @@ -64,8 +64,10 @@ void SamplerateConverter::init( void ) { // libSamplerateConverter-related // Set the converter type for the upsampling and the downsampling // interpolator SRC_SINC_BEST_QUALITY - _src_state_mic = src_new(SRC_LINEAR, 1, &_src_err); - _src_state_spkr = src_new(SRC_LINEAR, 1, &_src_err); + // interpolator SRC_SINC_FASTEST + // interpolator SRC_LINEAR + _src_state_mic = src_new(SRC_SINC_FASTEST, 1, &_src_err); + _src_state_spkr = src_new(SRC_SINC_FASTEST, 1, &_src_err); int nbSamplesMax = (int) ( getFrequence() * getFramesize() / 1000 ); _floatBufferDownMic = new float32[nbSamplesMax]; diff --git a/src/sdp.h b/src/sdp.h index 9bbd0d5344e43b37594a759067e9a9f4b82f7695..a30b18807f7ee780f9257189920ad55fcda9b11b 100644 --- a/src/sdp.h +++ b/src/sdp.h @@ -180,6 +180,7 @@ class Sdp { unsigned int get_remote_audio_port() { return _remote_audio_port; } void fetch_media_transport_info_from_remote_sdp (pjmedia_sdp_session *remote_sdp); + private: /** Codec Map */ std::vector<sdpMedia*> _local_media_cap; diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp index acb8d8b0e5e38efb266f586b9cff5a078b7f8ea2..d0c6d8edbc3c55e768b7e4fa4d71e3dd7a92aebd 100644 --- a/src/sipvoiplink.cpp +++ b/src/sipvoiplink.cpp @@ -25,8 +25,10 @@ #include "sipaccount.h" #include "audio/audiortp.h" + #define CAN_REINVITE 1 + /**************** EXTERN VARIABLES AND FUNCTIONS (callbacks) **************************/ /* @@ -289,7 +291,7 @@ SIPVoIPLink::getEvent() int SIPVoIPLink::sendRegister( AccountID id ) { - _debug("sendRegister called!!!!!!!!!!!!!!!!!!!!!!! \n"); + pj_status_t status; int expire_value; char contactTmp[256]; @@ -341,6 +343,7 @@ int SIPVoIPLink::sendRegister( AccountID id ) tmp = "sip:" + hostname; pj_strdup2(_pool, &svr, tmp.data()); + // tmp = "<sip:" + username + "@" + hostname + ";transport=tls>"; tmp = "<sip:" + username + "@" + hostname + ">"; pj_strdup2(_pool, &aor, tmp.data()); @@ -377,6 +380,7 @@ int SIPVoIPLink::sendRegister( AccountID id ) return false; } + _debug("Send the registration ######### \n"); status = pjsip_regc_send(regc, tdata); if (status != PJ_SUCCESS) { _debug("UserAgent: Unable to send regc request.\n"); @@ -779,7 +783,6 @@ SIPVoIPLink::transfer(const CallID& id, const std::string& to) bool SIPVoIPLink::transferStep2() { - _debug("SIPVoIPLink::transferStep2():When is this function called?"); _audiortp->closeRtpSession(); return true; } @@ -791,7 +794,7 @@ SIPVoIPLink::refuse (const CallID& id) pj_status_t status; pjsip_tx_data *tdata; - _debug("SIPVoIPLink::refuse() : teh call is refused \n"); + _debug("SIPVoIPLink::refuse() : the call is refused \n"); call = getSIPCall(id); if (call==0) { @@ -950,6 +953,7 @@ SIPVoIPLink::SIPStartCall(SIPCall* call, const std::string& subject UNUSED) pj_strdup2(_pool, &to, strTo.data()); pj_strdup2(_pool, &contact, account->getContact().data()); + _debug("%s %s %s\n", from.ptr, contact.ptr, to.ptr); // create the dialog (UAC) status = pjsip_dlg_create_uac(pjsip_ua_instance(), &from, &contact, @@ -1091,7 +1095,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam _debug ("Get remote media information from offer\n"); call->getLocalSDP()->fetch_media_transport_info_from_remote_sdp (r_sdp); - _debug ("Update call state\n"); + _debug ("Update call state , id = %s\n", call->getCallId().c_str()); call->setConnectionState(Call::Connected); call->setState(Call::Active); @@ -1133,6 +1137,83 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam } } + bool SIPVoIPLink::new_ip_to_ip_call (const CallID& id, const std::string& to) { + + SIPCall *call; + pj_status_t status; + std::string uri_from, uri_to, hostname; + std::ostringstream uri_contact; + pj_str_t from, str_to, contact; + pjsip_dialog *dialog; + pjsip_inv_session *inv; + pjsip_tx_data *tdata; + + /* Create the call */ + call = new SIPCall(id, Call::Outgoing, _pool); + + if (call) { + + call->setCallConfiguration (Call::IPtoIP); + call->setPeerNumber(getSipTo(to, getLocalIPAddress())); + + // Generate the from URI + hostname = pj_gethostname()->ptr; + uri_from = "sip:" + hostname + "@" + getLocalIPAddress() ; + + // Generate the from URI + uri_to = "sip:" + to.substr (3, to.length()); + + // Generate the to URI + setCallAudioLocal(call, getLocalIPAddress(), useStun(), getStunServer()); + + call->initRecFileName(); + + // Building the local SDP offer + call->getLocalSDP()->set_ip_address(getLocalIP()); + call->getLocalSDP()->create_initial_offer(); + + // Generate the contact URI + uri_contact << "<" << uri_from << ":" << call->getLocalSDP()->get_local_extern_audio_port() << ">"; + + // pjsip need the from and to information in pj_str_t format + pj_strdup2(_pool, &from, uri_from.data()); + pj_strdup2(_pool, &str_to, uri_to.data()); + pj_strdup2(_pool, &contact, uri_contact.str().data()); + + // create the dialog (UAC) + status = pjsip_dlg_create_uac(pjsip_ua_instance(), &from, &contact, &str_to, NULL, &dialog); + PJ_ASSERT_RETURN(status == PJ_SUCCESS, false); + + // Create the invite session for this call + status = pjsip_inv_create_uac(dialog, call->getLocalSDP()->get_local_sdp_session(), 0, &inv); + PJ_ASSERT_RETURN(status == PJ_SUCCESS, false); + + // Associate current call in the invite session + inv->mod_data[getModId()] = call; + + status = pjsip_inv_invite(inv, &tdata); + PJ_ASSERT_RETURN(status == PJ_SUCCESS, false); + + // Associate current invite session in the call + call->setInvSession(inv); + + status = pjsip_inv_send_msg(inv, tdata); + if(status != PJ_SUCCESS) { + delete call; call = 0; + return false; + } + + call->setConnectionState(Call::Progressing); + call->setState(Call::Active); + addCall(call); + + return true; + } + else + return false; + } + + /////////////////////////////////////////////////////////////////////////////// // Private functions /////////////////////////////////////////////////////////////////////////////// @@ -1356,7 +1437,8 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam pj_sockaddr_in bound_addr; pjsip_host_port a_name; char tmpIP[32]; - pj_sock_t sock; + pj_sock_t sock; + // Init bound address to ANY pj_memset(&bound_addr, 0, sizeof (bound_addr)); @@ -1367,33 +1449,29 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam bound_addr.sin_family = PJ_AF_INET; pj_bzero(bound_addr.sin_zero, sizeof(bound_addr.sin_zero)); - - - _debug("bound_addr.sin_port %i \n", bound_addr.sin_port); - - - _debug("UserAgent: Use IP: %s\n", _localExternAddress.data()); - - // Create UDP-Server (default port: 5060) strcpy(tmpIP, _localExternAddress.data()); pj_strdup2(_pool, &a_name.host, tmpIP); - a_name.port = (pj_uint16_t) _localExternPort; + a_name.port = (pj_uint16_t) _localExternPort; - // status = pjsip_tls_transport_start(_endpt, NULL, &bound_addr, &a_name, 1, NULL); - status = pjsip_udp_transport_start(_endpt, &bound_addr, &a_name, 1, NULL); - + status = pjsip_udp_transport_start(_endpt, &bound_addr, &a_name, 1, NULL); if (status != PJ_SUCCESS) { _debug("UserAgent: (%d) Unable to start UDP transport!\n", status); return -1; } else { _debug("UserAgent: UDP server listening on port %d\n", _localExternPort); } - + + + _debug("Transport initialized successfully! \n"); return PJ_SUCCESS; } + + + + bool SIPVoIPLink::loadSIPLocalIP() { bool returnValue = true; @@ -1508,11 +1586,11 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam } void SIPVoIPLink::handle_reinvite (SIPCall *call) { - + // Close the previous RTP session _audiortp->closeRtpSession (); call->setAudioStart (false); - + // Create a new one with new info if (_audiortp->createNewSession (call) >= 0) { call->setAudioStart (true); @@ -1525,6 +1603,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam /*******************************/ void call_on_state_changed( pjsip_inv_session *inv, pjsip_event *e){ + _debug("call_on_state_changed!!!!!!!!!\n"); SIPCall *call; AccountID accId; @@ -1541,6 +1620,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam //Retrieve the body message rdata = e->body.tsx_state.src.rdata; + /* If this is an outgoing INVITE that was created because of * REFER/transfer, send NOTIFY to transferer. */ @@ -1609,8 +1689,16 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam // We receive a ACK - The connection is established else if( inv->state == PJSIP_INV_STATE_CONFIRMED ){ _debug ("*************************** PJSIP_INV_STATE_CONFIRMED ***********************************\n"); - accId = Manager::instance().getAccountFromCall(call->getCallId()); - link = dynamic_cast<SIPVoIPLink *> (Manager::instance().getAccountLink(accId)); + + /* If the call is a direct IP-to-IP call */ + if (call->getCallConfiguration () == Call::IPtoIP) { + link = SIPVoIPLink::instance(""); + } + else { + accId = Manager::instance().getAccountFromCall(call->getCallId()); + link = dynamic_cast<SIPVoIPLink *> (Manager::instance().getAccountLink(accId)); + } + if (link) link->SIPCallAnswered(call, rdata); } @@ -1622,6 +1710,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam /* The call terminates normally - BYE / CANCEL */ case PJSIP_SC_OK: case PJSIP_SC_DECLINE: + case PJSIP_SC_REQUEST_TERMINATED: accId = Manager::instance().getAccountFromCall(call->getCallId()); link = dynamic_cast<SIPVoIPLink *> (Manager::instance().getAccountLink(accId)); if (link) { @@ -1629,7 +1718,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam } break; - /* The call connection failed */ + /* The call connection failed */ case PJSIP_SC_NOT_FOUND: /* peer not found */ case PJSIP_SC_REQUEST_TIMEOUT: /* request timeout */ case PJSIP_SC_NOT_ACCEPTABLE_HERE: /* no compatible codecs */ @@ -1641,7 +1730,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam link->SIPCallServerFailure(call); } break; - + default: _debug ("sipvoiplink.cpp - line 1635 : Unhandled call state. This is probably a bug.\n"); break; @@ -1653,7 +1742,6 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam } void call_on_media_update( pjsip_inv_session *inv, pj_status_t status) { - _debug("call_on_media_updated\n"); const pjmedia_sdp_session *r_sdp; SIPCall *call; @@ -1674,15 +1762,14 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam } void call_on_forked(pjsip_inv_session *inv, pjsip_event *e){ - _debug("call_on_forked\n"); } - void call_on_tsx_changed(pjsip_inv_session *inv, pjsip_transaction *tsx, pjsip_event *e){ - _debug ("call_on_tsx_changed\n"); +void call_on_tsx_changed(pjsip_inv_session *inv, pjsip_transaction *tsx, pjsip_event *e){ } void regc_cb(struct pjsip_regc_cbparam *param){ + //AccountID *id = static_cast<AccountID *> (param->token); SIPAccount *account; @@ -1735,6 +1822,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam pj_bool_t mod_on_rx_request(pjsip_rx_data *rdata) { + _debug("mod_on_rx_request!!!!!!!!!\n"); pj_status_t status; pj_str_t reason; @@ -1803,13 +1891,15 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam // Catch the NOTIFY message if( rdata->msg_info.msg->line.req.method.id == PJSIP_OTHER_METHOD ) { - method_name = "NOTIFY"; + method_name = "NOTIFY"; // Retrieve all the message. Should contains only the method name but ... request = rdata->msg_info.msg->line.req.method.name.ptr; + _debug("PRINT REQUEST: %s \n",request); // Check if the message is a notification if( request.find( method_name ) != (size_t)-1 ) { /* Notify the right account */ set_voicemail_info( account_id, rdata->msg_info.msg->body ); + request.find( method_name ); } pjsip_endpt_respond_stateless(_endpt, rdata, PJSIP_SC_OK, NULL, NULL, NULL); return true; @@ -1903,12 +1993,12 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam } pj_bool_t mod_on_rx_response(pjsip_rx_data *rdata UNUSED) { - _debug("mod_on_rx_response\n"); return PJ_SUCCESS; } void onCallTransfered(pjsip_inv_session *inv, pjsip_rx_data *rdata) { + pj_status_t status; pjsip_tx_data *tdata; SIPCall *existing_call; @@ -2114,61 +2204,66 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam void xfer_func_cb( pjsip_evsub *sub, pjsip_event *event){ + PJ_UNUSED_ARG(event); + + // _debug(" %s \n", event->body.rx_msg.rdata->msg_info.msg_buf); + _debug("UserAgent: Transfer callback is involved!\n"); + // _debug("UserAgent: pjsip_evsub_get_state_name: %s \n", pjsip_evsub_get_state_name(sub)); + /* * When subscription is accepted (got 200/OK to REFER), check if * subscription suppressed. */ if (pjsip_evsub_get_state(sub) == PJSIP_EVSUB_STATE_ACCEPTED) { + + _debug("Transfer accepted! Waiting for notifications. \n"); + /* pjsip_rx_data *rdata; pjsip_generic_string_hdr *refer_sub; const pj_str_t REFER_SUB = {(char*)"Refer-Sub", 9 }; - SIPVoIPLink *link = reinterpret_cast<SIPVoIPLink *> (pjsip_evsub_get_mod_data(sub, - _mod_ua.id)); - - /* Must be receipt of response message */ - pj_assert(event->type == PJSIP_EVENT_TSX_STATE && - event->body.tsx_state.type == PJSIP_EVENT_RX_MSG); + SIPVoIPLink *link = reinterpret_cast<SIPVoIPLink *> (pjsip_evsub_get_mod_data(sub, _mod_ua.id)); + + // Must be receipt of response message + pj_assert(event->type == PJSIP_EVENT_TSX_STATE && event->body.tsx_state.type == PJSIP_EVENT_RX_MSG); rdata = event->body.tsx_state.src.rdata; - - /* Find Refer-Sub header */ - refer_sub = (pjsip_generic_string_hdr*) - pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, - &REFER_SUB, NULL); - - /* Check if subscription is suppressed */ + + // Find Refer-Sub header + refer_sub = (pjsip_generic_string_hdr*)pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &REFER_SUB, NULL); + + // Check if subscription is suppressed if (refer_sub && pj_stricmp2(&refer_sub->hvalue, "false")==0) { - /* Since no subscription is desired, assume that call has been - * transfered successfully. - */ + // Since no subscription is desired, assume that call has been transfered successfully. + if (link) { // It's the time to stop the RTP + link->transferStep2(); } - - /* Yes, subscription is suppressed. - * Terminate our subscription now. - */ + + // Yes, subscription is suppressed.Terminate our subscription now. _debug("UserAgent: Xfer subscription suppressed, terminating event subcription...\n"); pjsip_evsub_terminate(sub, PJ_TRUE); - - } else { - /* Notify application about call transfer progress. - * Initially notify with 100/Accepted status. - */ + } + + + else { + // Notify application about call transfer progress. Initially notify with 100/Accepted status. + _debug("UserAgent: Xfer subscription 100/Accepted received...\n"); } + */ } /* * On incoming NOTIFY, notify application about call transfer progress. */ else if (pjsip_evsub_get_state(sub) == PJSIP_EVSUB_STATE_ACTIVE || - pjsip_evsub_get_state(sub) == PJSIP_EVSUB_STATE_TERMINATED) + pjsip_evsub_get_state(sub) == PJSIP_EVSUB_STATE_TERMINATED) { pjsip_msg *msg; pjsip_msg_body *body; @@ -2177,8 +2272,15 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam pj_bool_t cont; pj_status_t status; - SIPVoIPLink *link = reinterpret_cast<SIPVoIPLink *> (pjsip_evsub_get_mod_data(sub, - _mod_ua.id)); + std::string noresource; + std::string ringing; + std::string request; + + noresource = "noresource"; + ringing = "Ringing"; + + + SIPVoIPLink *link = reinterpret_cast<SIPVoIPLink *> (pjsip_evsub_get_mod_data(sub, _mod_ua.id)); /* When subscription is terminated, clear the xfer_sub member of * the inv_data. @@ -2194,18 +2296,13 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam _debug("UserAgent: Either link or event is empty!\n"); return; } - - // Get current call - SIPCall *call = dynamic_cast<SIPCall *>(link->getCall(Manager::instance().getCurrentCallId())); - if(!call) { - _debug("UserAgent: Call doesn't exit!\n"); - return; - } + /* This better be a NOTIFY request */ if (event->type == PJSIP_EVENT_TSX_STATE && event->body.tsx_state.type == PJSIP_EVENT_RX_MSG) { + pjsip_rx_data *rdata; rdata = event->body.tsx_state.src.rdata; @@ -2218,6 +2315,8 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam return; } + + /* Check for appropriate content */ if (pj_stricmp2(&body->content_type.type, "message") != 0 || pj_stricmp2(&body->content_type.subtype, "sipfrag") != 0) @@ -2240,11 +2339,39 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam status_line.reason = *pjsip_get_status_text(500); } + + if(event->body.rx_msg.rdata->msg_info.msg_buf != NULL) { + request = event->body.rx_msg.rdata->msg_info.msg_buf; + if (request.find( noresource ) != -1) { + _debug("UserAgent: NORESOURCE for transfer!\n"); + link->transferStep2(); + pjsip_evsub_terminate(sub, PJ_TRUE); + return; + } + + if (request.find( ringing ) != -1){ + _debug("UserAgent: transfered call RINGING!\n"); + link->transferStep2(); + pjsip_evsub_terminate(sub, PJ_TRUE); + return; + } + } + + + // Get current call + SIPCall *call = dynamic_cast<SIPCall *>(link->getCall(Manager::instance().getCurrentCallId())); + if(!call) { + _debug("UserAgent: Call doesn't exit!\n"); + return; + } + + /* Notify application */ is_last = (pjsip_evsub_get_state(sub)==PJSIP_EVSUB_STATE_TERMINATED); cont = !is_last; if(status_line.code/100 == 2) { + _debug("UserAgent: Try to stop rtp!\n"); pjsip_tx_data *tdata; @@ -2264,6 +2391,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam if (!cont) { pjsip_evsub_set_mod_data(sub, _mod_ua.id, NULL); } + } } @@ -2271,6 +2399,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam void xfer_svr_cb(pjsip_evsub *sub, pjsip_event *event) { + PJ_UNUSED_ARG(event); /* @@ -2292,7 +2421,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam } void on_rx_offer( pjsip_inv_session *inv, const pjmedia_sdp_session *offer ){ - + _debug ( "********************************* REINVITE RECEIVED *******************************\n" ); #ifdef CAN_REINVITE @@ -2318,7 +2447,7 @@ std::string SIPVoIPLink::getSipTo(const std::string& to_url, std::string hostnam } -/*****************************************************************************************************************/ + /*****************************************************************************************************************/ bool setCallAudioLocal(SIPCall* call, std::string localIP, bool stun, std::string server) { diff --git a/src/sipvoiplink.h b/src/sipvoiplink.h index 3180dd5c2b6a6e1972cd62cbd4939a43c89b589a..92212c29353f982c147eccdf49356f0f6ce09de6 100644 --- a/src/sipvoiplink.h +++ b/src/sipvoiplink.h @@ -312,6 +312,7 @@ class SIPVoIPLink : public VoIPLink int inv_session_reinvite (SIPCall *call, std::string direction=""); + bool new_ip_to_ip_call (const CallID& id, const std::string& to); private: /** diff --git a/src/user_cfg.h b/src/user_cfg.h index a5ab0625f91101b9fa943d9bddef934b4049ecfb..62bb5579e7676c4efac340749324a751bae83de1 100644 --- a/src/user_cfg.h +++ b/src/user_cfg.h @@ -71,6 +71,13 @@ #define STUN_ENABLE "STUN.enable" #define STUN_SERVER "STUN.server" +#define ADDRESSBOOK "Addressbook" /** Address book section */ +#define ADDRESSBOOK_MAX_RESULTS "Addressbook.max_results" +#define ADDRESSBOOK_DISPLAY_CONTACT_PHOTO "Addressbook.contact_photo" +#define ADDRESSBOOK_DISPLAY_PHONE_BUSINESS "Addressbook.phone_business" +#define ADDRESSBOOK_DISPLAY_PHONE_HOME "Addressbook.phone_home" +#define ADDRESSBOOK_DISPLAY_PHONE_MOBILE "Addressbook.phone_mobile" + #define EMPTY_FIELD "" /** Default value for empty field */ #define DFT_STUN_SERVER "stun.fwdnet.net:3478" /** Default STUN server address */ #define YES_STR "1" /** Default YES value */ diff --git a/www/css/style1.css b/www/css/style1.css index e286fb9fe8351aa9c81d9d793d0858835b03a957..93ccea13258a9902b8f3dcf15f97519be21f06b6 100644 --- a/www/css/style1.css +++ b/www/css/style1.css @@ -547,50 +547,9 @@ code { .thumbnails li img { outline: 4px solid; margin: 0.5em; - margin-top: 15%; } .thumbnails li:hover { opacity: 1; } - -.separator { - margin: 2em; -} - - -/**GNU LOGO **/ -.gpl-logo { - float: right; - position: relative; -} - -.gpl-logo img { - margin-top: -8px; -} - - -.download { - background: url(/img/download.png); - width: 280px; - height: 45px; - padding-top: 2.7em; - margin: 0 auto; -} - -.download:hover { - background: url(/img/download-up.png); -} - -.download span { - display: block; -} - -.free-download { - margin-top: 7px; -} - -.sfl-version { - line-height: 5px; -} diff --git a/www/include/footer.php b/www/include/footer.php index 6230c7eea29e2799399f1a64238f37cc5656e0f4..64f336dbbdf709a37c2548bdde281792c8e34893 100644 --- a/www/include/footer.php +++ b/www/include/footer.php @@ -38,7 +38,7 @@ <div class="rightfootBlock"> <ul> <li> - © Savoir-Faire Linux Inc 2009</li> + © Savoir-Faire Linux Inc 2009<img src="img/logos/custom/gpl3.png" /></li> </ul> </div> <div class="clear"> diff --git a/www/include/header.php b/www/include/header.php index a5589082abec0239ab582be0ec185417c6acd099..636721174ee9340582082c0be5d0be5315d1306a 100644 --- a/www/include/header.php +++ b/www/include/header.php @@ -40,22 +40,22 @@ <tbody valign="top"> <tr> <td class="option"> - <div id="option"> </div> - </td> + <div id="option"> + </div> + </td> <td class="navigation"> - <div class="gpl-logo"><a href="http://www.gnu.org/copyleft/gpl.html" ><img src="img/logos/custom/gpl3.png" /></a></div> <div id="navigation"> <div class="dynamic-nav" style="background: #CDCDCD;" > </div> - <ul> - <li <?php echo ($name == 'contact')?'class="active"':"" ?>><a href='contact.php'><span>Contact</span></a></li> - <li <?php echo ($name == 'wiki')?'class="active"':"" ?>><a href='http://dev.savoirfairelinux.net/sflphone/'><span>Wiki</span></a></li> - <li <?php echo ($name == 'download')?'class="active"':"" ?>><a href='download.php'><span>Download</span></a></li> - <li <?php echo ($name == 'screenshot')?'class="active"':"" ?>><a href='screenshot.php'><span>Screenshots</span></a></li> - <li <?php echo ($name == 'feature')?'class="active"':"" ?>><a href='features.php'><span>Features</span></a></li> - <li <?php echo ($name == 'home')?'class="active"':"" ?>><a href='index.php'><span>Home</span></a></li> - </ul> - </div> + <ul> + <li <?php echo ($name == 'contact')?'class="active"':"" ?>><a href='contact.php'><span>Contact</span></a></li> + <li <?php echo ($name == 'wiki')?'class="active"':"" ?>><a href='http://projects.savoirfairelinux.net/wiki/sflphone'><span>Wiki</span></a></li> + <li <?php echo ($name == 'download')?'class="active"':"" ?>><a href='download.php'><span>Download</span></a></li> + <li <?php echo ($name == 'screenshot')?'class="active"':"" ?>><a href='screenshot.php'><span>Screenshots</span></a></li> + <li <?php echo ($name == 'feature')?'class="active"':"" ?>><a href='features.php'><span>Features</span></a></li> + <li <?php echo ($name == 'home')?'class="active"':"" ?>><a href='index.php'><span>Home</span></a></li> + </ul> + </div> </td> </tr> </tbody> diff --git a/www/index.php b/www/index.php index 45e1afee8876079ea4ec2f8e842b707975589d54..ae4af2b780dcb40e33d28cd7340f63ad33b261fa 100644 --- a/www/index.php +++ b/www/index.php @@ -33,31 +33,17 @@ include_once('include/header.php'); <li>Gnome integration</li> </ul> <div class="float_it_middle"> - <a href="download.php" > - <div class="download"> - <span class="free-download">Free download</span> - <span class="sfl-version">Linux version: 0.9.3-3</span> - </div> - </a> - </div> - <div class="separator"> </div> + <a href="download.php" ><img src="img/download_icon.png" width="61" height="68" alt=""/></a> + </div> <div class="float_it_middle"> - <form action="https://www.paypal.com/cgi-bin/webscr" method="post"> - <input type="hidden" name="cmd" value="_s-xclick"> - <input type="hidden" name="hosted_button_id" value="3918066"> - <input type="image" - src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" - name="submit" alt="PayPal - The safer, easier way to pay online!"> - <img alt="" border="0" - src="https://www.paypal.com/fr_XC/i/scr/pixel.gif" width="1" height="1"> - </form> + <p class="highlight"><a href="download.php" >Download now!</a></p> </div> </td> </tr> - <!--<tr> + <tr> <td> </td> - </tr>--> + </tr> </tbody> </table> </td>