diff --git a/images/earth.html b/images/earth.html new file mode 100644 index 0000000000000000000000000000000000000000..8f8aadf59d0d832d707fcf540d82534dd0487800 --- /dev/null +++ b/images/earth.html @@ -0,0 +1,221 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" + +<html> + <meta http-equiv="content-type" content="text/html; charset=utf-8" /> + <head> +<!-- QGroundControl --> + <title>QGroundControl Google Earth View</title> + <!-- *** Replace the key below below with your own API key, available at http://code.google.com/apis/maps/signup.html *** --> + <script type="text/javascript" src="http://www.google.com/jsapi?key=ABQIAAAAwbkbZLyhsmTCWXbTcjbgbRSzHs7K5SvaUdm8ua-Xxy_-2dYwMxQMhnagaawTo7L1FE1-amhuQxIlXw"></script> + <script type="text/javascript"> +google.load("earth", "1", { 'language': 'en'}); + +var ge = null; +var initialized = false; +var aircraft = new Array(); +var currAircraft = 220; +var followAircraft = false; +var currLat = 47.3769; +var currLon = 8.549444; +var currAlt = 470; + +var homeLat = 0; +var homeLon = 0; +var homeAlt = 0; +var homeViewRange = 500; +var homeLocation = null; +var homeGroundLevel = 0; + +var currViewRange = 3.0; ///<< The current viewing range from this position (in meters) +var currTilt = 40.0; ///<< The tilt angle (in degrees) +var currFollowTilt = 40.0; +var currView = null; + + + +var planeOrient; +var planeLoc; + + +// Aircraft class + + +function isInitialized() +{ + return initialized; +} + + +function init() { + google.earth.createInstance("map3d", initCallback, failureCallback); +} + + + + + +function setGCSHome(lat, lon, alt) +{ + homeLat = lat; + homeLon = lon; + homeAlt = alt; + + + + var placemark = ge.createPlacemark(''); + var icon = ge.createIcon(''); + icon.setHref('http://google-maps-icons.googlecode.com/files/blackH.png'); + var style = ge.createStyle(''); + style.getIconStyle().setIcon(icon); + //style.getIconStyle().setScale(0.5); + placemark.setStyleSelector(style); + + // Set the placemark's location. + homeLocation = ge.createPoint(''); + homeLocation.setLatitude(lat); + homeLocation.setLongitude(lon); + homeLocation.setAltitude(alt); + placemark.setGeometry(homeLocation); + + // Add the placemark to Earth. + ge.getFeatures().appendChild(placemark); + + homeGroundLevel = ge.getGlobe().getGroundAltitude(lat,lon); + if (homeGroundLevel == 0) + { + homeGroundLevel = alt; + } + + + + + + + goHome(); +} + +function initCallback(object) +{ + ge = object; + ge.getWindow().setVisibility(true); + ge.getOptions().setStatusBarVisibility(true); + ge.getOptions().setScaleLegendVisibility(true); + ge.getOptions().setFlyToSpeed(ge.SPEED_TELEPORT); + ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO); + + ge.getLayerRoot().enableLayerById(ge.LAYER_TERRAIN, true); + ge.getLayerRoot().enableLayerById(ge.LAYER_BUILDINGS, true); + ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true); + ge.getLayerRoot().enableLayerById(ge.LAYER_TREES, true); + + // Now after the Google Earth initialization, initialize the GCS view + setGCSHome(currLat, currLon, currAlt); + + + // Create the first aircraft model + // Load 3D model + var planePlacemark = ge.createPlacemark(''); + planePlacemark.setName('aircraft'); + planeModel = ge.createModel(''); + ge.getFeatures().appendChild(planePlacemark); + planeLoc = ge.createLocation(''); + planeModel.setLocation(planeLoc); + planeLink = ge.createLink(''); + planeOrient = ge.createOrientation(''); + planeModel.setOrientation(planeOrient); + + planeLink.setHref('http://qgroundcontrol.org/_media/users/models/multiplex-twinstar.dae'); + planeModel.setLink(planeLink); + planeModel.setAltitudeMode (ge.ALTITUDE_ABSOLUTE); + + planeLoc.setLatitude(currLat); + planeLoc.setLongitude(currLon); + planeLoc.setAltitude(currAlt); + + planePlacemark.setGeometry(planeModel); + + setAircraftPositionAttitude(220, 47.3772, currLon, currAlt+50, 20, 15, 50); + enableFollowing(true); + updateFollowAircraft(); + initialized = true; + + +} + +function setAircraftPositionAttitude(id, lat, lon, alt, roll, pitch, yaw) +{ + if (id == currAircraft) + { + currLat = lat; + currLon = lon; + currAlt = alt; + } + + planeOrient.setRoll(roll); + planeOrient.setTilt(pitch); + planeOrient.setHeading(yaw); + + + + planeLoc.setLatitude(lat); + planeLoc.setLongitude(lon); + planeLoc.setAltitude(alt); + +} + +function goHome() +{ + var currView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE); + currView.setLatitude(homeLat); + currView.setLongitude(homeLon); + currView.setAltitude(homeAlt); + currView.setRange(homeViewRange); + currView.setTilt(currTilt); + ge.getView().setAbstractView(currView); +} + +function setCurrentAircraft(id) +{ + currAircraft = id; +} + +function enableFollowing(follow) +{ + followEnabled = follow; +} + + +function updateFollowAircraft() +{ + if (followEnabled) + { + currView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE); + currView.setLatitude(currLat); + currView.setLongitude(currLon); + currView.setAltitude(currAlt); + currView.setRange(currViewRange); + currView.setTilt(currFollowTilt); + ge.getView().setAbstractView(currView); + } +} + +function failureCallback(object) +{ +} +</script> + + + <style type="text/css"> + html, body { + margin: 0; + width: 100%; + height: 100%; + } + </style> + </head> + <body onload='init()' id='body'> + <center> + <div id='map3d' style='margin: 0; spacing: 0; height: 100%; width: 100%'></div> + </center> + </body> +</html> diff --git a/images/mapproviders/googleearth.svg b/images/mapproviders/googleearth.svg new file mode 100644 index 0000000000000000000000000000000000000000..0cb3de179f351f02088c7f09bc70cc91942245b8 --- /dev/null +++ b/images/mapproviders/googleearth.svg @@ -0,0 +1,383 @@ +<?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="svg3209" + sodipodi:version="0.32" + inkscape:version="0.45" + sodipodi:docbase="/home/bertrand/thèmes/icons" + sodipodi:docname="googleearth.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + version="1.0" + inkscape:export-filename="/home/bertrand/thèmes/icons/googleearth.png" + inkscape:export-xdpi="960" + inkscape:export-ydpi="960" + sodipodi:modified="TRUE"> + <defs + id="defs3211"> + <linearGradient + id="linearGradient4471"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4473" /> + <stop + id="stop4544" + offset="0.5" + style="stop-color:#f6f6f6;stop-opacity:1;" /> + <stop + style="stop-color:#e1e1e1;stop-opacity:1;" + offset="1" + id="stop4475" /> + </linearGradient> + <linearGradient + id="linearGradient4463"> + <stop + id="stop4465" + offset="0" + style="stop-color:#000000;stop-opacity:0;" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="0.91000003" + id="stop4467" /> + <stop + id="stop4469" + offset="1" + style="stop-color:#000000;stop-opacity:1;" /> + </linearGradient> + <linearGradient + id="linearGradient4326"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop4328" /> + <stop + id="stop4334" + offset="0.91000003" + style="stop-color:#000000;stop-opacity:1;" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop4330" /> + </linearGradient> + <linearGradient + id="linearGradient4224"> + <stop + style="stop-color:#95d2f8;stop-opacity:1;" + offset="0" + id="stop4226" /> + <stop + id="stop4240" + offset="0.41" + style="stop-color:#357bb5;stop-opacity:1;" /> + <stop + style="stop-color:#13324e;stop-opacity:1;" + offset="1" + id="stop4228" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4305" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.164251,0,0,1.1066309,-7.7152118,3.6172807)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4326" + id="radialGradient4337" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.9068628,0,-5.2669822)" + cx="-54.952297" + cy="-56.550789" + fx="-54.952297" + fy="-56.550789" + r="20.607111" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4388" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.164251,0,0,1.1066309,-7.7152118,3.6172807)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4390" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.1125941,0,0,-2.0080394,19.606479,22.674501)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4463" + id="radialGradient4461" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1373136,0,0,1.1082148,-5.9284,3.6296571)" + cx="65.260735" + cy="-19.960367" + fx="65.260735" + fy="-19.960367" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4471" + id="radialGradient4477" + cx="148.67188" + cy="23.953125" + fx="148.67188" + fy="23.953125" + r="49.921875" + gradientTransform="matrix(1,0,0,0.3452269,0,15.683862)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4471" + id="radialGradient4479" + cx="150.32812" + cy="-27.078125" + fx="150.32812" + fy="-27.078125" + r="56.234375" + gradientTransform="matrix(1,0,0,0.5665463,0,-11.737114)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4471" + id="radialGradient4481" + cx="167.20312" + cy="-47.105568" + fx="167.20312" + fy="-47.105568" + r="37.546875" + gradientTransform="matrix(1,0,0,0.5964393,0,-19.009954)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4525" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1583414,0,0,-1.1010138,78.50486,39.534321)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4528" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1583414,0,0,1.1010138,78.50486,8.465679)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4531" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1583414,0,0,-1.1010138,78.50486,39.534321)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4534" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1583414,0,0,-1.1010138,-59.769574,38.849794)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4471" + id="radialGradient4542" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.164251,0,0,1.1066309,-7.7152118,3.6172807)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4551" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1583414,0,0,-1.1010138,78.504862,39.534322)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4471" + id="radialGradient4555" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1583414,0,0,-1.1010138,78.50486,39.534321)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4471" + id="radialGradient4558" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1583414,0,0,1.1010138,78.50486,8.465679)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4326" + id="radialGradient4591" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.9068628,0,-5.2669822)" + cx="-54.952297" + cy="-56.550789" + fx="-54.952297" + fy="-56.550789" + r="20.607111" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4224" + id="radialGradient4593" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.164251,0,0,1.1066309,-7.7152118,3.6172807)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4463" + id="radialGradient4595" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1373136,0,0,1.1082148,-5.9284,3.6296571)" + cx="65.260735" + cy="-19.960367" + fx="65.260735" + fy="-19.960367" + r="60.306107" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient4471" + id="radialGradient4597" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1583414,0,0,1.1010138,78.50486,8.465679)" + cx="46.972088" + cy="-33.92337" + fx="46.972088" + fy="-33.92337" + r="60.306107" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.1912945" + inkscape:cx="90.556983" + inkscape:cy="62.870696" + inkscape:current-layer="layer2" + showgrid="false" + inkscape:grid-bbox="true" + inkscape:document-units="px" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-width="1280" + inkscape:window-height="971" + inkscape:window-x="1280" + inkscape:window-y="53" /> + <metadata + id="metadata3214"> + <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:groupmode="layer" + id="layer2" + inkscape:label="Layer 1" + style="display:inline"> + <g + id="g4585" + transform="matrix(0.375,0,0,0.375,-32.250002,28.499999)"> + <path + transform="matrix(3.105724,0,0,3.4246901,320.66667,181.66893)" + d="M -34.345186 -56.550789 A 20.607111 18.687822 0 1 1 -75.559408,-56.550789 A 20.607111 18.687822 0 1 1 -34.345186 -56.550789 z" + sodipodi:ry="18.687822" + sodipodi:rx="20.607111" + sodipodi:cy="-56.550789" + sodipodi:cx="-54.952297" + id="path4307" + style="opacity:0.54828659;color:#000000;fill:url(#radialGradient4591);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;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:0.42105264;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.9949241,0,0,0.9949241,86.18091,4.8667588)" + d="M 124.45079 -16.952808 A 60.306107 60.306107 0 1 1 3.8385773,-16.952808 A 60.306107 60.306107 0 1 1 124.45079 -16.952808 z" + sodipodi:ry="60.306107" + sodipodi:rx="60.306107" + sodipodi:cy="-16.952808" + sodipodi:cx="64.144684" + id="path3253" + style="opacity:1;color:#000000;fill:url(#radialGradient4593);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;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:0.42105264;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + transform="matrix(0.9949241,0,0,0.9949241,86.18091,4.8667588)" + d="M 124.45079 -16.952808 A 60.306107 60.306107 0 1 1 3.8385773,-16.952808 A 60.306107 60.306107 0 1 1 124.45079 -16.952808 z" + sodipodi:ry="60.306107" + sodipodi:rx="60.306107" + sodipodi:cy="-16.952808" + sodipodi:cx="64.144684" + id="path4449" + style="opacity:1;color:#000000;fill:url(#radialGradient4595);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;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:0.42105264;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + sodipodi:type="arc" /> + <path + id="path4540" + d="M 150,-69.5 C 142.83037,-69.5 135.98765,-68.150808 129.65625,-65.75 C 147.08483,-65.444227 156.92068,-63.634228 165.84375,-58.75 C 166.58734,-58.342981 167.32795,-57.919334 168.0625,-57.46875 C 170.26616,-56.116999 172.45785,-54.557678 174.71875,-52.78125 C 184.46361,-45.124541 185.31647,-35.806865 193.59375,-28.6875 C 198.63301,-24.35318 197.95095,-24.718751 200.28125,-24.71875 C 202.83164,-24.71875 204.12996,-27.024001 204.75,-29.53125 C 197.32889,-52.702654 175.62459,-69.500002 150,-69.5 z M 126.9375,-58.9375 C 125.71891,-58.9375 124.50452,-58.806172 123.3125,-58.5625 C 122.91516,-58.481276 122.51852,-58.386673 122.125,-58.28125 C 111.10642,-55.329397 101.67793,-43.173927 98.59375,-37.59375 C 98.397564,-37.238793 98.175214,-36.821586 97.96875,-36.4375 C 96.33105,-32.960142 95.012359,-29.315516 94.09375,-25.5 C 94.975993,-26.628774 95.834585,-27.688244 96.6875,-28.6875 C 102.65791,-35.682293 108.12167,-39.468749 115.96875,-39.46875 C 129.97043,-39.468751 131.74931,-33.230672 157.40625,-16.5 C 170.03357,-8.2658364 189.19518,3.0892866 205,4.78125 C 205.64834,2.6554377 206.16192,0.47219546 206.5625,-1.75 C 200.64939,-2.1768904 195.32265,-4.4309275 189.5625,-8.25 C 188.73962,-8.7955818 187.90585,-9.3595061 187.0625,-9.96875 C 180.31573,-14.842701 172.81758,-21.73368 163.0625,-30.28125 C 155.6349,-36.789448 136.95382,-58.937499 126.9375,-58.9375 z M 106.875,6.71875 C 102.43548,6.71875 99.122712,8.9689884 98.75,14.03125 C 104.97372,26.249869 115.42634,35.94422 128.1875,41.1875 C 128.01834,40.950836 127.85777,40.701503 127.6875,40.4375 C 126.49562,38.589481 125.34375,36.090037 125.34375,33.21875 C 125.34375,29.878317 127.504,28.5625 129.9375,28.5625 C 133.17844,28.5625 143.8763,33.65625 161.78125,33.65625 C 170.73699,33.65625 181.91007,32.344387 190.09375,29.1875 C 193.32597,26.040414 196.17002,22.51695 198.59375,18.6875 C 193.36291,20.808098 183.69005,23.874999 171.09375,23.875 C 146.75952,23.875 124.56774,13.488267 118.15625,10.15625 C 116.45557,9.272415 112.09631,6.7187499 106.875,6.71875 z " + style="opacity:1;color:#000000;fill:url(#radialGradient4597);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;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:0.42105264;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + </g> + </g> +</svg> diff --git a/lib/QMapControl/src/mapnetwork.cpp b/lib/QMapControl/src/mapnetwork.cpp index f1430d05ab8bc143b4d58a4295c7b9eb5debb27f..155d9202f1029ec00851f6d1e8cddbe2e3e41c2c 100644 --- a/lib/QMapControl/src/mapnetwork.cpp +++ b/lib/QMapControl/src/mapnetwork.cpp @@ -95,7 +95,9 @@ namespace qmapcontrol } else { - qDebug() << "NETWORK_PIXMAP_ERROR: " << ax; + // QGC FIXME Error is currently undetected + // TODO Error is currently undetected + //qDebug() << "NETWORK_PIXMAP_ERROR: " << ax; } } diff --git a/lib/mac32-gcc40/frameworks/.gitignore b/lib/mac32-gcc40/frameworks/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..39aa8067655ced203e5e936db165559cad9040d8 --- /dev/null +++ b/lib/mac32-gcc40/frameworks/.gitignore @@ -0,0 +1,2 @@ +*.framework +osgPlugins* diff --git a/lib/mac32-gcc40/frameworks/README b/lib/mac32-gcc40/frameworks/README new file mode 100644 index 0000000000000000000000000000000000000000..2436e3d15e557bb60a2adcecf99663c59df5963b --- /dev/null +++ b/lib/mac32-gcc40/frameworks/README @@ -0,0 +1,3 @@ +For instructions how to download or build the frameworks necessary to get OSG / osgEarth support, please refer to the QGroundControl wiki: + +http://qgroundcontrol.org/dev/open_scene_graph diff --git a/lib/mac32-gcc40/include/.gitignore b/lib/mac32-gcc40/include/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..256a7a811270f51885b8d016129ba17789fb45ee --- /dev/null +++ b/lib/mac32-gcc40/include/.gitignore @@ -0,0 +1,2 @@ +OpenThreads +osg* diff --git a/lib/mac32-gcc40/include/curl/curl.h b/lib/mac32-gcc40/include/curl/curl.h new file mode 100644 index 0000000000000000000000000000000000000000..cb9d0fbfbf5a98ec19e78bd37f868e78371abb01 --- /dev/null +++ b/lib/mac32-gcc40/include/curl/curl.h @@ -0,0 +1,2119 @@ +#ifndef __CURL_CURL_H +#define __CURL_CURL_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * If you have libcurl problems, all docs and details are found here: + * http://curl.haxx.se/libcurl/ + * + * curl-library mailing list subscription and unsubscription web interface: + * http://cool.haxx.se/mailman/listinfo/curl-library/ + */ + +#include "curlver.h" /* libcurl version defines */ +#include "curlbuild.h" /* libcurl build definitions */ +#include "curlrules.h" /* libcurl rules enforcement */ + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && \ + !defined(WIN32) && !defined(__SYMBIAN32__) +#define WIN32 +#endif + +#include <stdio.h> +#include <limits.h> + +#if defined(__FreeBSD__) && (__FreeBSD__ >= 2) +/* Needed for __FreeBSD_version symbol definition */ +#include <osreldate.h> +#endif + +/* The include stuff here below is mainly for time_t! */ +#include <sys/types.h> +#include <time.h> + +#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) && \ + !defined(__CYGWIN__) || defined(__MINGW32__) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H)) +/* The check above prevents the winsock2 inclusion if winsock.h already was + included, since they can't co-exist without problems */ +#include <winsock2.h> +#include <ws2tcpip.h> +#endif +#else + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on system that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || \ + (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) +#include <sys/select.h> +#endif + +#ifndef _WIN32_WCE +#include <sys/socket.h> +#endif +#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) +#include <sys/time.h> +#endif +#include <sys/types.h> +#endif + +#ifdef __BEOS__ +#include <support/SupportDefs.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void CURL; + +/* + * Decorate exportable functions for Win32 and Symbian OS DLL linking. + * This avoids using a .def file for building libcurl.dll. + */ +#if (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)) && \ + !defined(CURL_STATICLIB) +#if defined(BUILDING_LIBCURL) +#define CURL_EXTERN __declspec(dllexport) +#else +#define CURL_EXTERN __declspec(dllimport) +#endif +#else + +#ifdef CURL_HIDDEN_SYMBOLS +/* + * This definition is used to make external definitions visible in the + * shared library when symbols are hidden by default. It makes no + * difference when compiling applications whether this is set or not, + * only when compiling the library. + */ +#define CURL_EXTERN CURL_EXTERN_SYMBOL +#else +#define CURL_EXTERN +#endif +#endif + +#ifndef curl_socket_typedef +/* socket typedef */ +#ifdef WIN32 +typedef SOCKET curl_socket_t; +#define CURL_SOCKET_BAD INVALID_SOCKET +#else +typedef int curl_socket_t; +#define CURL_SOCKET_BAD -1 +#endif +#define curl_socket_typedef +#endif /* curl_socket_typedef */ + +struct curl_httppost { + struct curl_httppost *next; /* next entry in the list */ + char *name; /* pointer to allocated name */ + long namelength; /* length of name length */ + char *contents; /* pointer to allocated data contents */ + long contentslength; /* length of contents field */ + char *buffer; /* pointer to allocated buffer contents */ + long bufferlength; /* length of buffer field */ + char *contenttype; /* Content-Type */ + struct curl_slist* contentheader; /* list of extra headers for this form */ + struct curl_httppost *more; /* if one field name has more than one + file, this link should link to following + files */ + long flags; /* as defined below */ +#define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */ +#define HTTPPOST_READFILE (1<<1) /* specified content is a file name */ +#define HTTPPOST_PTRNAME (1<<2) /* name is only stored pointer + do not free in formfree */ +#define HTTPPOST_PTRCONTENTS (1<<3) /* contents is only stored pointer + do not free in formfree */ +#define HTTPPOST_BUFFER (1<<4) /* upload file from buffer */ +#define HTTPPOST_PTRBUFFER (1<<5) /* upload file from pointer contents */ +#define HTTPPOST_CALLBACK (1<<6) /* upload file contents by using the + regular read callback to get the data + and pass the given pointer as custom + pointer */ + + char *showfilename; /* The file name to show. If not set, the + actual file name will be used (if this + is a file part) */ + void *userp; /* custom pointer used for + HTTPPOST_CALLBACK posts */ +}; + +typedef int (*curl_progress_callback)(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +#ifndef CURL_MAX_WRITE_SIZE + /* Tests have proven that 20K is a very bad buffer size for uploads on + Windows, while 16K for some odd reason performed a lot better. + We do the ifndef check to allow this value to easier be changed at build + time for those who feel adventurous. The practical minimum is about + 400 bytes since libcurl uses a buffer of this size as a scratch area + (unrelated to network send operations). */ +#define CURL_MAX_WRITE_SIZE 16384 +#endif + +#ifndef CURL_MAX_HTTP_HEADER +/* The only reason to have a max limit for this is to avoid the risk of a bad + server feeding libcurl with a never-ending header that will cause reallocs + infinitely */ +#define CURL_MAX_HTTP_HEADER (100*1024) +#endif + + +/* This is a magic return code for the write callback that, when returned, + will signal libcurl to pause receiving on the current transfer. */ +#define CURL_WRITEFUNC_PAUSE 0x10000001 +typedef size_t (*curl_write_callback)(char *buffer, + size_t size, + size_t nitems, + void *outstream); + + + +/* enumeration of file types */ +typedef enum { + CURLFILETYPE_FILE = 0, + CURLFILETYPE_DIRECTORY, + CURLFILETYPE_SYMLINK, + CURLFILETYPE_DEVICE_BLOCK, + CURLFILETYPE_DEVICE_CHAR, + CURLFILETYPE_NAMEDPIPE, + CURLFILETYPE_SOCKET, + CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ + + CURLFILETYPE_UNKNOWN /* should never occur */ +} curlfiletype; + +#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) +#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) +#define CURLFINFOFLAG_KNOWN_TIME (1<<2) +#define CURLFINFOFLAG_KNOWN_PERM (1<<3) +#define CURLFINFOFLAG_KNOWN_UID (1<<4) +#define CURLFINFOFLAG_KNOWN_GID (1<<5) +#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) +#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) + +/* Content of this structure depends on information which is known and is + achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man + page for callbacks returning this structure -- some fields are mandatory, + some others are optional. The FLAG field has special meaning. */ +struct curl_fileinfo { + char *filename; + curlfiletype filetype; + time_t time; + unsigned int perm; + int uid; + int gid; + curl_off_t size; + long int hardlinks; + + struct { + /* If some of these fields is not NULL, it is a pointer to b_data. */ + char *time; + char *perm; + char *user; + char *group; + char *target; /* pointer to the target filename of a symlink */ + } strings; + + unsigned int flags; + + /* used internally */ + char * b_data; + size_t b_size; + size_t b_used; +}; + +/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ +#define CURL_CHUNK_BGN_FUNC_OK 0 +#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ +#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ + +/* if splitting of data transfer is enabled, this callback is called before + download of an individual chunk started. Note that parameter "remains" works + only for FTP wildcard downloading (for now), otherwise is not used */ +typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, + void *ptr, + int remains); + +/* return codes for CURLOPT_CHUNK_END_FUNCTION */ +#define CURL_CHUNK_END_FUNC_OK 0 +#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ + +/* If splitting of data transfer is enabled this callback is called after + download of an individual chunk finished. + Note! After this callback was set then it have to be called FOR ALL chunks. + Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. + This is the reason why we don't need "transfer_info" parameter in this + callback and we are not interested in "remains" parameter too. */ +typedef long (*curl_chunk_end_callback)(void *ptr); + +/* return codes for FNMATCHFUNCTION */ +#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ +#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ +#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ + +/* callback type for wildcard downloading pattern matching. If the + string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ +typedef int (*curl_fnmatch_callback)(void *ptr, + const char *pattern, + const char *string); + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ +typedef int (*curl_seek_callback)(void *instream, + curl_off_t offset, + int origin); /* 'whence' */ + +/* This is a return code for the read callback that, when returned, will + signal libcurl to immediately abort the current transfer. */ +#define CURL_READFUNC_ABORT 0x10000000 +/* This is a return code for the read callback that, when returned, will + signal libcurl to pause sending data on the current transfer. */ +#define CURL_READFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_read_callback)(char *buffer, + size_t size, + size_t nitems, + void *instream); + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +typedef int (*curl_sockopt_callback)(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it + turned really ugly and painful on the systems that + lack this type */ + struct sockaddr addr; +}; + +typedef curl_socket_t +(*curl_opensocket_callback)(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +typedef curlioerr (*curl_ioctl_callback)(CURL *handle, + int cmd, + void *clientp); + +/* + * The following typedef's are signatures of malloc, free, realloc, strdup and + * calloc respectively. Function pointers of these types can be passed to the + * curl_global_init_mem() function to set user defined memory management + * callback routines. + */ +typedef void *(*curl_malloc_callback)(size_t size); +typedef void (*curl_free_callback)(void *ptr); +typedef void *(*curl_realloc_callback)(void *ptr, size_t size); +typedef char *(*curl_strdup_callback)(const char *str); +typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); + +/* the kind of data that is passed to information_callback*/ +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +typedef int (*curl_debug_callback) + (CURL *handle, /* the handle/transfer this concerns */ + curl_infotype type, /* what kind of data */ + char *data, /* points to the data */ + size_t size, /* size of the data pointed to */ + void *userptr); /* whatever the user please */ + +/* All possible error codes from all sorts of curl functions. Future versions + may return other values, stay prepared. + + Always add new return codes last. Never *EVER* remove any. The return + codes must remain the same! + */ + +typedef enum { + CURLE_OK = 0, + CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ + CURLE_FAILED_INIT, /* 2 */ + CURLE_URL_MALFORMAT, /* 3 */ + CURLE_OBSOLETE4, /* 4 - NOT USED */ + CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ + CURLE_COULDNT_RESOLVE_HOST, /* 6 */ + CURLE_COULDNT_CONNECT, /* 7 */ + CURLE_FTP_WEIRD_SERVER_REPLY, /* 8 */ + CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server + due to lack of access - when login fails + this is not returned. */ + CURLE_OBSOLETE10, /* 10 - NOT USED */ + CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ + CURLE_OBSOLETE12, /* 12 - NOT USED */ + CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ + CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ + CURLE_FTP_CANT_GET_HOST, /* 15 */ + CURLE_OBSOLETE16, /* 16 - NOT USED */ + CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ + CURLE_PARTIAL_FILE, /* 18 */ + CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ + CURLE_OBSOLETE20, /* 20 - NOT USED */ + CURLE_QUOTE_ERROR, /* 21 - quote command failure */ + CURLE_HTTP_RETURNED_ERROR, /* 22 */ + CURLE_WRITE_ERROR, /* 23 */ + CURLE_OBSOLETE24, /* 24 - NOT USED */ + CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ + CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ + CURLE_OUT_OF_MEMORY, /* 27 */ + /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error + instead of a memory allocation error if CURL_DOES_CONVERSIONS + is defined + */ + CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ + CURLE_OBSOLETE29, /* 29 - NOT USED */ + CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ + CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ + CURLE_OBSOLETE32, /* 32 - NOT USED */ + CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ + CURLE_HTTP_POST_ERROR, /* 34 */ + CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ + CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ + CURLE_FILE_COULDNT_READ_FILE, /* 37 */ + CURLE_LDAP_CANNOT_BIND, /* 38 */ + CURLE_LDAP_SEARCH_FAILED, /* 39 */ + CURLE_OBSOLETE40, /* 40 - NOT USED */ + CURLE_FUNCTION_NOT_FOUND, /* 41 */ + CURLE_ABORTED_BY_CALLBACK, /* 42 */ + CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ + CURLE_OBSOLETE44, /* 44 - NOT USED */ + CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ + CURLE_OBSOLETE46, /* 46 - NOT USED */ + CURLE_TOO_MANY_REDIRECTS , /* 47 - catch endless re-direct loops */ + CURLE_UNKNOWN_TELNET_OPTION, /* 48 - User specified an unknown option */ + CURLE_TELNET_OPTION_SYNTAX , /* 49 - Malformed telnet option */ + CURLE_OBSOLETE50, /* 50 - NOT USED */ + CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint + wasn't verified fine */ + CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ + CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ + CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as + default */ + CURLE_SEND_ERROR, /* 55 - failed sending network data */ + CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ + CURLE_OBSOLETE57, /* 57 - NOT IN USE */ + CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ + CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ + CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */ + CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized transfer encoding */ + CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ + CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ + CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ + CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind + that failed */ + CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ + CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not + accepted and we failed to login */ + CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ + CURLE_TFTP_PERM, /* 69 - permission problem on server */ + CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ + CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ + CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ + CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ + CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ + CURLE_CONV_FAILED, /* 75 - conversion failed */ + CURLE_CONV_REQD, /* 76 - caller must register conversion + callbacks using curl_easy_setopt options + CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOPT_CONV_TO_NETWORK_FUNCTION, and + CURLOPT_CONV_FROM_UTF8_FUNCTION */ + CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing + or wrong format */ + CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ + CURLE_SSH, /* 79 - error from the SSH layer, somewhat + generic so the error message will be of + interest when this has happened */ + + CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL + connection */ + CURLE_AGAIN, /* 81 - socket is not ready for send/recv, + wait till it's ready and try again (Added + in 7.18.2) */ + CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or + wrong format (Added in 7.19.0) */ + CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in + 7.19.0) */ + CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ + CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ + CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Identifiers */ + CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ + CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ + + CURL_LAST /* never use! */ +} CURLcode; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ + +/* The following were added in 7.17.1 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.17.0 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* noone should be using this! */ +#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 +#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 +#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 +#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 +#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 +#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 +#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 +#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 +#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 +#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 +#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 +#define CURLE_URL_MALFORMAT_USER CURLE_OBSOLETE4 + +#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED +#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE +#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR +#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL +#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS +#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR +#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED + +/* The following were added earlier */ + +#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT + +#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR +#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED +#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED + +#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE +#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME + +/* This was the error code 50 in 7.7.3 and a few earlier versions, this + is no longer used by libcurl but is instead #defined here only to not + make programs break */ +#define CURLE_ALREADY_COMPLETE 99999 + +#endif /*!CURL_NO_OLDIES*/ + +/* This prototype applies to all conversion callbacks */ +typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); + +typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ + void *ssl_ctx, /* actually an + OpenSSL SSL_CTX */ + void *userptr); + +typedef enum { + CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use + CONNECT HTTP/1.1 */ + CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT + HTTP/1.0 */ + CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already + in 7.10 */ + CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ + CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ + CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the + host name rather than the IP address. added + in 7.18.0 */ +} curl_proxytype; /* this enum was added in 7.10 */ + +#define CURLAUTH_NONE 0 /* nothing */ +#define CURLAUTH_BASIC (1<<0) /* Basic (default) */ +#define CURLAUTH_DIGEST (1<<1) /* Digest */ +#define CURLAUTH_GSSNEGOTIATE (1<<2) /* GSS-Negotiate */ +#define CURLAUTH_NTLM (1<<3) /* NTLM */ +#define CURLAUTH_DIGEST_IE (1<<4) /* Digest with IE flavour */ +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) /* all fine types set */ +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) + +#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ +#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ +#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ +#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ +#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ +#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ +#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY + +#define CURL_ERROR_SIZE 256 + +struct curl_khkey { + const char *key; /* points to a zero-terminated string encoded with base64 + if len is zero, otherwise to the "raw" data */ + size_t len; + enum type { + CURLKHTYPE_UNKNOWN, + CURLKHTYPE_RSA1, + CURLKHTYPE_RSA, + CURLKHTYPE_DSS + } keytype; +}; + +/* this is the set of return values expected from the curl_sshkeycallback + callback */ +enum curl_khstat { + CURLKHSTAT_FINE_ADD_TO_FILE, + CURLKHSTAT_FINE, + CURLKHSTAT_REJECT, /* reject the connection, return an error */ + CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so + this causes a CURLE_DEFER error but otherwise the + connection will be left intact etc */ + CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ +}; + +/* this is the set of status codes pass in to the callback */ +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ + CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ +}; + +typedef int + (*curl_sshkeycallback) (CURL *easy, /* easy handle */ + const struct curl_khkey *knownkey, /* known */ + const struct curl_khkey *foundkey, /* found */ + enum curl_khmatch, /* libcurl's view on the keys */ + void *clientp); /* custom pointer passed from app */ + +/* parameter for the CURLOPT_USE_SSL option */ +typedef enum { + CURLUSESSL_NONE, /* do not attempt to use SSL */ + CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ + CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ + CURLUSESSL_ALL, /* SSL for all communication or fail */ + CURLUSESSL_LAST /* not an option, never use */ +} curl_usessl; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2009 */ + +#define CURLFTPSSL_NONE CURLUSESSL_NONE +#define CURLFTPSSL_TRY CURLUSESSL_TRY +#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL +#define CURLFTPSSL_ALL CURLUSESSL_ALL +#define CURLFTPSSL_LAST CURLUSESSL_LAST +#define curl_ftpssl curl_usessl +#endif /*!CURL_NO_OLDIES*/ + +/* parameter for the CURLOPT_FTP_SSL_CCC option */ +typedef enum { + CURLFTPSSL_CCC_NONE, /* do not send CCC */ + CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ + CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ + CURLFTPSSL_CCC_LAST /* not an option, never use */ +} curl_ftpccc; + +/* parameter for the CURLOPT_FTPSSLAUTH option */ +typedef enum { + CURLFTPAUTH_DEFAULT, /* let libcurl decide */ + CURLFTPAUTH_SSL, /* use "AUTH SSL" */ + CURLFTPAUTH_TLS, /* use "AUTH TLS" */ + CURLFTPAUTH_LAST /* not an option, never use */ +} curl_ftpauth; + +/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ +typedef enum { + CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ + CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD + again if MKD succeeded, for SFTP this does + similar magic */ + CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD + again even if MKD failed! */ + CURLFTP_CREATE_DIR_LAST /* not an option, never use */ +} curl_ftpcreatedir; + +/* parameter for the CURLOPT_FTP_FILEMETHOD option */ +typedef enum { + CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ + CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ + CURLFTPMETHOD_NOCWD, /* no CWD at all */ + CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ + CURLFTPMETHOD_LAST /* not an option, never use */ +} curl_ftpmethod; + +/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ +#define CURLPROTO_HTTP (1<<0) +#define CURLPROTO_HTTPS (1<<1) +#define CURLPROTO_FTP (1<<2) +#define CURLPROTO_FTPS (1<<3) +#define CURLPROTO_SCP (1<<4) +#define CURLPROTO_SFTP (1<<5) +#define CURLPROTO_TELNET (1<<6) +#define CURLPROTO_LDAP (1<<7) +#define CURLPROTO_LDAPS (1<<8) +#define CURLPROTO_DICT (1<<9) +#define CURLPROTO_FILE (1<<10) +#define CURLPROTO_TFTP (1<<11) +#define CURLPROTO_IMAP (1<<12) +#define CURLPROTO_IMAPS (1<<13) +#define CURLPROTO_POP3 (1<<14) +#define CURLPROTO_POP3S (1<<15) +#define CURLPROTO_SMTP (1<<16) +#define CURLPROTO_SMTPS (1<<17) +#define CURLPROTO_RTSP (1<<18) +#define CURLPROTO_RTMP (1<<19) +#define CURLPROTO_RTMPT (1<<20) +#define CURLPROTO_RTMPE (1<<21) +#define CURLPROTO_RTMPTE (1<<22) +#define CURLPROTO_RTMPS (1<<23) +#define CURLPROTO_RTMPTS (1<<24) +#define CURLPROTO_GOPHER (1<<25) +#define CURLPROTO_ALL (~0) /* enable everything */ + +/* long may be 32 or 64 bits, but we should never depend on anything else + but 32 */ +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 + +/* name is uppercase CURLOPT_<name>, + type is one of the defined CURLOPTTYPE_<type> + number is unique identifier */ +#ifdef CINIT +#undef CINIT +#endif + +#ifdef CURL_ISOCPP +#define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type + number +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLOPT_/**/name = type + number +#endif + +/* + * This macro-mania below setups the CURLOPT_[what] enum, to be used with + * curl_easy_setopt(). The first argument in the CINIT() macro is the [what] + * word. + */ + +typedef enum { + /* This is the FILE * or void * the regular output should be written to. */ + CINIT(FILE, OBJECTPOINT, 1), + + /* The full URL to get/put */ + CINIT(URL, OBJECTPOINT, 2), + + /* Port number to connect to, if other than default. */ + CINIT(PORT, LONG, 3), + + /* Name of proxy to use. */ + CINIT(PROXY, OBJECTPOINT, 4), + + /* "name:password" to use when fetching. */ + CINIT(USERPWD, OBJECTPOINT, 5), + + /* "name:password" to use with proxy. */ + CINIT(PROXYUSERPWD, OBJECTPOINT, 6), + + /* Range to get, specified as an ASCII string. */ + CINIT(RANGE, OBJECTPOINT, 7), + + /* not used */ + + /* Specified file stream to upload from (use as input): */ + CINIT(INFILE, OBJECTPOINT, 9), + + /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE + * bytes big. If this is not used, error messages go to stderr instead: */ + CINIT(ERRORBUFFER, OBJECTPOINT, 10), + + /* Function that will be called to store the output (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), + + /* Function that will be called to read the input (instead of fread). The + * parameters will use fread() syntax, make sure to follow them. */ + CINIT(READFUNCTION, FUNCTIONPOINT, 12), + + /* Time-out the read operation after this amount of seconds */ + CINIT(TIMEOUT, LONG, 13), + + /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about + * how large the file being sent really is. That allows better error + * checking and better verifies that the upload was successful. -1 means + * unknown size. + * + * For large file support, there is also a _LARGE version of the key + * which takes an off_t type, allowing platforms with larger off_t + * sizes to handle larger files. See below for INFILESIZE_LARGE. + */ + CINIT(INFILESIZE, LONG, 14), + + /* POST static input fields. */ + CINIT(POSTFIELDS, OBJECTPOINT, 15), + + /* Set the referrer page (needed by some CGIs) */ + CINIT(REFERER, OBJECTPOINT, 16), + + /* Set the FTP PORT string (interface name, named or numerical IP address) + Use i.e '-' to use default address. */ + CINIT(FTPPORT, OBJECTPOINT, 17), + + /* Set the User-Agent string (examined by some CGIs) */ + CINIT(USERAGENT, OBJECTPOINT, 18), + + /* If the download receives less than "low speed limit" bytes/second + * during "low speed time" seconds, the operations is aborted. + * You could i.e if you have a pretty high speed connection, abort if + * it is less than 2000 bytes/sec during 20 seconds. + */ + + /* Set the "low speed limit" */ + CINIT(LOW_SPEED_LIMIT, LONG, 19), + + /* Set the "low speed time" */ + CINIT(LOW_SPEED_TIME, LONG, 20), + + /* Set the continuation offset. + * + * Note there is also a _LARGE version of this key which uses + * off_t types, allowing for large file offsets on platforms which + * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. + */ + CINIT(RESUME_FROM, LONG, 21), + + /* Set cookie in request: */ + CINIT(COOKIE, OBJECTPOINT, 22), + + /* This points to a linked list of headers, struct curl_slist kind */ + CINIT(HTTPHEADER, OBJECTPOINT, 23), + + /* This points to a linked list of post entries, struct curl_httppost */ + CINIT(HTTPPOST, OBJECTPOINT, 24), + + /* name of the file keeping your private SSL-certificate */ + CINIT(SSLCERT, OBJECTPOINT, 25), + + /* password for the SSL or SSH private key */ + CINIT(KEYPASSWD, OBJECTPOINT, 26), + + /* send TYPE parameter? */ + CINIT(CRLF, LONG, 27), + + /* send linked-list of QUOTE commands */ + CINIT(QUOTE, OBJECTPOINT, 28), + + /* send FILE * or void * to store headers to, if you use a callback it + is simply passed to the callback unmodified */ + CINIT(WRITEHEADER, OBJECTPOINT, 29), + + /* point to a file to read the initial cookies from, also enables + "cookie awareness" */ + CINIT(COOKIEFILE, OBJECTPOINT, 31), + + /* What version to specifically try to use. + See CURL_SSLVERSION defines below. */ + CINIT(SSLVERSION, LONG, 32), + + /* What kind of HTTP time condition to use, see defines */ + CINIT(TIMECONDITION, LONG, 33), + + /* Time to use with the above condition. Specified in number of seconds + since 1 Jan 1970 */ + CINIT(TIMEVALUE, LONG, 34), + + /* 35 = OBSOLETE */ + + /* Custom request, for customizing the get command like + HTTP: DELETE, TRACE and others + FTP: to use a different list command + */ + CINIT(CUSTOMREQUEST, OBJECTPOINT, 36), + + /* HTTP request, for odd commands like DELETE, TRACE and others */ + CINIT(STDERR, OBJECTPOINT, 37), + + /* 38 is not used */ + + /* send linked-list of post-transfer QUOTE commands */ + CINIT(POSTQUOTE, OBJECTPOINT, 39), + + /* Pass a pointer to string of the output using full variable-replacement + as described elsewhere. */ + CINIT(WRITEINFO, OBJECTPOINT, 40), + + CINIT(VERBOSE, LONG, 41), /* talk a lot */ + CINIT(HEADER, LONG, 42), /* throw the header out too */ + CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */ + CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */ + CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 300 */ + CINIT(UPLOAD, LONG, 46), /* this is an upload */ + CINIT(POST, LONG, 47), /* HTTP POST method */ + CINIT(DIRLISTONLY, LONG, 48), /* return bare names when listing directories */ + + CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */ + + /* Specify whether to read the user+password from the .netrc or the URL. + * This must be one of the CURL_NETRC_* enums below. */ + CINIT(NETRC, LONG, 51), + + CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */ + + CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ + CINIT(PUT, LONG, 54), /* HTTP PUT */ + + /* 55 = OBSOLETE */ + + /* Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_progress_callback + * prototype defines. */ + CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), + + /* Data passed to the progress callback */ + CINIT(PROGRESSDATA, OBJECTPOINT, 57), + + /* We want the referrer field set automatically when following locations */ + CINIT(AUTOREFERER, LONG, 58), + + /* Port of the proxy, can be set in the proxy string as well with: + "[host]:[port]" */ + CINIT(PROXYPORT, LONG, 59), + + /* size of the POST input data, if strlen() is not good to use */ + CINIT(POSTFIELDSIZE, LONG, 60), + + /* tunnel non-http operations through a HTTP proxy */ + CINIT(HTTPPROXYTUNNEL, LONG, 61), + + /* Set the interface string to use as outgoing network interface */ + CINIT(INTERFACE, OBJECTPOINT, 62), + + /* Set the krb4/5 security level, this also enables krb4/5 awareness. This + * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string + * is set but doesn't match one of these, 'private' will be used. */ + CINIT(KRBLEVEL, OBJECTPOINT, 63), + + /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ + CINIT(SSL_VERIFYPEER, LONG, 64), + + /* The CApath or CAfile used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAINFO, OBJECTPOINT, 65), + + /* 66 = OBSOLETE */ + /* 67 = OBSOLETE */ + + /* Maximum number of http redirects to follow */ + CINIT(MAXREDIRS, LONG, 68), + + /* Pass a long set to 1 to get the date of the requested document (if + possible)! Pass a zero to shut it off. */ + CINIT(FILETIME, LONG, 69), + + /* This points to a linked list of telnet options */ + CINIT(TELNETOPTIONS, OBJECTPOINT, 70), + + /* Max amount of cached alive connections */ + CINIT(MAXCONNECTS, LONG, 71), + + /* What policy to use when closing connections when the cache is filled + up */ + CINIT(CLOSEPOLICY, LONG, 72), + + /* 73 = OBSOLETE */ + + /* Set to explicitly use a new connection for the upcoming transfer. + Do not use this unless you're absolutely sure of this, as it makes the + operation slower and is less friendly for the network. */ + CINIT(FRESH_CONNECT, LONG, 74), + + /* Set to explicitly forbid the upcoming transfer's connection to be re-used + when done. Do not use this unless you're absolutely sure of this, as it + makes the operation slower and is less friendly for the network. */ + CINIT(FORBID_REUSE, LONG, 75), + + /* Set to a file name that contains random data for libcurl to use to + seed the random engine when doing SSL connects. */ + CINIT(RANDOM_FILE, OBJECTPOINT, 76), + + /* Set to the Entropy Gathering Daemon socket pathname */ + CINIT(EGDSOCKET, OBJECTPOINT, 77), + + /* Time-out connect operations after this amount of seconds, if connects + are OK within this time, then fine... This only aborts the connect + phase. [Only works on unix-style/SIGALRM operating systems] */ + CINIT(CONNECTTIMEOUT, LONG, 78), + + /* Function that will be called to store headers (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), + + /* Set this to force the HTTP request to get back to GET. Only really usable + if POST, PUT or a custom request have been used first. + */ + CINIT(HTTPGET, LONG, 80), + + /* Set if we should verify the Common name from the peer certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches the + * provided hostname. */ + CINIT(SSL_VERIFYHOST, LONG, 81), + + /* Specify which file name to write all known cookies in after completed + operation. Set file name to "-" (dash) to make it go to stdout. */ + CINIT(COOKIEJAR, OBJECTPOINT, 82), + + /* Specify which SSL ciphers to use */ + CINIT(SSL_CIPHER_LIST, OBJECTPOINT, 83), + + /* Specify which HTTP version to use! This must be set to one of the + CURL_HTTP_VERSION* enums set below. */ + CINIT(HTTP_VERSION, LONG, 84), + + /* Specifically switch on or off the FTP engine's use of the EPSV command. By + default, that one will always be attempted before the more traditional + PASV command. */ + CINIT(FTP_USE_EPSV, LONG, 85), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ + CINIT(SSLCERTTYPE, OBJECTPOINT, 86), + + /* name of the file keeping your private SSL-key */ + CINIT(SSLKEY, OBJECTPOINT, 87), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ + CINIT(SSLKEYTYPE, OBJECTPOINT, 88), + + /* crypto engine for the SSL-sub system */ + CINIT(SSLENGINE, OBJECTPOINT, 89), + + /* set the crypto engine for the SSL-sub system as default + the param has no meaning... + */ + CINIT(SSLENGINE_DEFAULT, LONG, 90), + + /* Non-zero value means to use the global dns cache */ + CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* To become OBSOLETE soon */ + + /* DNS cache timeout */ + CINIT(DNS_CACHE_TIMEOUT, LONG, 92), + + /* send linked-list of pre-transfer QUOTE commands */ + CINIT(PREQUOTE, OBJECTPOINT, 93), + + /* set the debug function */ + CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94), + + /* set the data for the debug function */ + CINIT(DEBUGDATA, OBJECTPOINT, 95), + + /* mark this as start of a cookie session */ + CINIT(COOKIESESSION, LONG, 96), + + /* The CApath directory used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAPATH, OBJECTPOINT, 97), + + /* Instruct libcurl to use a smaller receive buffer */ + CINIT(BUFFERSIZE, LONG, 98), + + /* Instruct libcurl to not use any signal/alarm handlers, even when using + timeouts. This option is useful for multi-threaded applications. + See libcurl-the-guide for more background information. */ + CINIT(NOSIGNAL, LONG, 99), + + /* Provide a CURLShare for mutexing non-ts data */ + CINIT(SHARE, OBJECTPOINT, 100), + + /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), + CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5. */ + CINIT(PROXYTYPE, LONG, 101), + + /* Set the Accept-Encoding string. Use this to tell a server you would like + the response to be compressed. */ + CINIT(ENCODING, OBJECTPOINT, 102), + + /* Set pointer to private data */ + CINIT(PRIVATE, OBJECTPOINT, 103), + + /* Set aliases for HTTP 200 in the HTTP Response header */ + CINIT(HTTP200ALIASES, OBJECTPOINT, 104), + + /* Continue to send authentication (user+password) when following locations, + even when hostname changed. This can potentially send off the name + and password to whatever host the server decides. */ + CINIT(UNRESTRICTED_AUTH, LONG, 105), + + /* Specifically switch on or off the FTP engine's use of the EPRT command ( it + also disables the LPRT attempt). By default, those ones will always be + attempted before the good old traditional PORT command. */ + CINIT(FTP_USE_EPRT, LONG, 106), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_USERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(HTTPAUTH, LONG, 107), + + /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx + in second argument. The function must be matching the + curl_ssl_ctx_callback proto. */ + CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108), + + /* Set the userdata for the ssl context callback function's third + argument */ + CINIT(SSL_CTX_DATA, OBJECTPOINT, 109), + + /* FTP Option that causes missing dirs to be created on the remote server. + In 7.19.4 we introduced the convenience enums for this option using the + CURLFTP_CREATE_DIR prefix. + */ + CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(PROXYAUTH, LONG, 111), + + /* FTP option that changes the timeout, in seconds, associated with + getting a response. This is different from transfer timeout time and + essentially places a demand on the FTP server to acknowledge commands + in a timely manner. */ + CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112), +#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT + + /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to + tell libcurl to resolve names to those IP versions only. This only has + affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ + CINIT(IPRESOLVE, LONG, 113), + + /* Set this option to limit the size of a file that will be downloaded from + an HTTP or FTP server. + + Note there is also _LARGE version which adds large file support for + platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ + CINIT(MAXFILESIZE, LONG, 114), + + /* See the comment for INFILESIZE above, but in short, specifies + * the size of the file being uploaded. -1 means unknown. + */ + CINIT(INFILESIZE_LARGE, OFF_T, 115), + + /* Sets the continuation offset. There is also a LONG version of this; + * look above for RESUME_FROM. + */ + CINIT(RESUME_FROM_LARGE, OFF_T, 116), + + /* Sets the maximum size of data that will be downloaded from + * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. + */ + CINIT(MAXFILESIZE_LARGE, OFF_T, 117), + + /* Set this option to the file name of your .netrc file you want libcurl + to parse (using the CURLOPT_NETRC option). If not set, libcurl will do + a poor attempt to find the user's home directory and check for a .netrc + file in there. */ + CINIT(NETRC_FILE, OBJECTPOINT, 118), + + /* Enable SSL/TLS for FTP, pick one of: + CURLFTPSSL_TRY - try using SSL, proceed anyway otherwise + CURLFTPSSL_CONTROL - SSL for the control connection or fail + CURLFTPSSL_ALL - SSL for all communication or fail + */ + CINIT(USE_SSL, LONG, 119), + + /* The _LARGE version of the standard POSTFIELDSIZE option */ + CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120), + + /* Enable/disable the TCP Nagle algorithm */ + CINIT(TCP_NODELAY, LONG, 121), + + /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 123 OBSOLETE. Gone in 7.16.0 */ + /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 127 OBSOLETE. Gone in 7.16.0 */ + /* 128 OBSOLETE. Gone in 7.16.0 */ + + /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option + can be used to change libcurl's default action which is to first try + "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK + response has been received. + + Available parameters are: + CURLFTPAUTH_DEFAULT - let libcurl decide + CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS + CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL + */ + CINIT(FTPSSLAUTH, LONG, 129), + + CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130), + CINIT(IOCTLDATA, OBJECTPOINT, 131), + + /* 132 OBSOLETE. Gone in 7.16.0 */ + /* 133 OBSOLETE. Gone in 7.16.0 */ + + /* zero terminated string for pass on to the FTP server when asked for + "account" info */ + CINIT(FTP_ACCOUNT, OBJECTPOINT, 134), + + /* feed cookies into cookie engine */ + CINIT(COOKIELIST, OBJECTPOINT, 135), + + /* ignore Content-Length */ + CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), + + /* Set to non-zero to skip the IP address received in a 227 PASV FTP server + response. Typically used for FTP-SSL purposes but is not restricted to + that. libcurl will then instead use the same IP address it used for the + control connection. */ + CINIT(FTP_SKIP_PASV_IP, LONG, 137), + + /* Select "file method" to use when doing FTP, see the curl_ftpmethod + above. */ + CINIT(FTP_FILEMETHOD, LONG, 138), + + /* Local port number to bind the socket to */ + CINIT(LOCALPORT, LONG, 139), + + /* Number of ports to try, including the first one set with LOCALPORT. + Thus, setting it to 1 will make no additional attempts but the first. + */ + CINIT(LOCALPORTRANGE, LONG, 140), + + /* no transfer, set up connection and let application use the socket by + extracting it with CURLINFO_LASTSOCKET */ + CINIT(CONNECT_ONLY, LONG, 141), + + /* Function that will be called to convert from the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142), + + /* Function that will be called to convert to the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143), + + /* Function that will be called to convert from UTF8 + (instead of using the iconv calls in libcurl) + Note that this is used only for SSL certificate processing */ + CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144), + + /* if the connection proceeds too quickly then need to slow it down */ + /* limit-rate: maximum number of bytes per second to send or receive */ + CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145), + CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146), + + /* Pointer to command string to send if USER/PASS fails. */ + CINIT(FTP_ALTERNATIVE_TO_USER, OBJECTPOINT, 147), + + /* callback function for setting socket options */ + CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148), + CINIT(SOCKOPTDATA, OBJECTPOINT, 149), + + /* set to 0 to disable session ID re-use for this transfer, default is + enabled (== 1) */ + CINIT(SSL_SESSIONID_CACHE, LONG, 150), + + /* allowed SSH authentication methods */ + CINIT(SSH_AUTH_TYPES, LONG, 151), + + /* Used by scp/sftp to do public/private key authentication */ + CINIT(SSH_PUBLIC_KEYFILE, OBJECTPOINT, 152), + CINIT(SSH_PRIVATE_KEYFILE, OBJECTPOINT, 153), + + /* Send CCC (Clear Command Channel) after authentication */ + CINIT(FTP_SSL_CCC, LONG, 154), + + /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ + CINIT(TIMEOUT_MS, LONG, 155), + CINIT(CONNECTTIMEOUT_MS, LONG, 156), + + /* set to zero to disable the libcurl's decoding and thus pass the raw body + data to the application even when it is encoded/compressed */ + CINIT(HTTP_TRANSFER_DECODING, LONG, 157), + CINIT(HTTP_CONTENT_DECODING, LONG, 158), + + /* Permission used when creating new files and directories on the remote + server for protocols that support it, SFTP/SCP/FILE */ + CINIT(NEW_FILE_PERMS, LONG, 159), + CINIT(NEW_DIRECTORY_PERMS, LONG, 160), + + /* Set the behaviour of POST when redirecting. Values must be set to one + of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ + CINIT(POSTREDIR, LONG, 161), + + /* used by scp/sftp to verify the host's public key */ + CINIT(SSH_HOST_PUBLIC_KEY_MD5, OBJECTPOINT, 162), + + /* Callback function for opening socket (instead of socket(2)). Optionally, + callback is able change the address or refuse to connect returning + CURL_SOCKET_BAD. The callback should have type + curl_opensocket_callback */ + CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163), + CINIT(OPENSOCKETDATA, OBJECTPOINT, 164), + + /* POST volatile input fields. */ + CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), + + /* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy */ + CINIT(PROXY_TRANSFER_MODE, LONG, 166), + + /* Callback function for seeking in the input stream */ + CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167), + CINIT(SEEKDATA, OBJECTPOINT, 168), + + /* CRL file */ + CINIT(CRLFILE, OBJECTPOINT, 169), + + /* Issuer certificate */ + CINIT(ISSUERCERT, OBJECTPOINT, 170), + + /* (IPv6) Address scope */ + CINIT(ADDRESS_SCOPE, LONG, 171), + + /* Collect certificate chain info and allow it to get retrievable with + CURLINFO_CERTINFO after the transfer is complete. (Unfortunately) only + working with OpenSSL-powered builds. */ + CINIT(CERTINFO, LONG, 172), + + /* "name" and "pwd" to use when fetching. */ + CINIT(USERNAME, OBJECTPOINT, 173), + CINIT(PASSWORD, OBJECTPOINT, 174), + + /* "name" and "pwd" to use with Proxy when fetching. */ + CINIT(PROXYUSERNAME, OBJECTPOINT, 175), + CINIT(PROXYPASSWORD, OBJECTPOINT, 176), + + /* Comma separated list of hostnames defining no-proxy zones. These should + match both hostnames directly, and hostnames within a domain. For + example, local.com will match local.com and www.local.com, but NOT + notlocal.com or www.notlocal.com. For compatibility with other + implementations of this, .local.com will be considered to be the same as + local.com. A single * is the only valid wildcard, and effectively + disables the use of proxy. */ + CINIT(NOPROXY, OBJECTPOINT, 177), + + /* block size for TFTP transfers */ + CINIT(TFTP_BLKSIZE, LONG, 178), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_SERVICE, OBJECTPOINT, 179), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_NEC, LONG, 180), + + /* set the bitmask for the protocols that are allowed to be used for the + transfer, which thus helps the app which takes URLs from users or other + external inputs and want to restrict what protocol(s) to deal + with. Defaults to CURLPROTO_ALL. */ + CINIT(PROTOCOLS, LONG, 181), + + /* set the bitmask for the protocols that libcurl is allowed to follow to, + as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs + to be set in both bitmasks to be allowed to get redirected to. Defaults + to all protocols except FILE and SCP. */ + CINIT(REDIR_PROTOCOLS, LONG, 182), + + /* set the SSH knownhost file name to use */ + CINIT(SSH_KNOWNHOSTS, OBJECTPOINT, 183), + + /* set the SSH host key callback, must point to a curl_sshkeycallback + function */ + CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184), + + /* set the SSH host key callback custom pointer */ + CINIT(SSH_KEYDATA, OBJECTPOINT, 185), + + /* set the SMTP mail originator */ + CINIT(MAIL_FROM, OBJECTPOINT, 186), + + /* set the SMTP mail receiver(s) */ + CINIT(MAIL_RCPT, OBJECTPOINT, 187), + + /* FTP: send PRET before PASV */ + CINIT(FTP_USE_PRET, LONG, 188), + + /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ + CINIT(RTSP_REQUEST, LONG, 189), + + /* The RTSP session identifier */ + CINIT(RTSP_SESSION_ID, OBJECTPOINT, 190), + + /* The RTSP stream URI */ + CINIT(RTSP_STREAM_URI, OBJECTPOINT, 191), + + /* The Transport: header to use in RTSP requests */ + CINIT(RTSP_TRANSPORT, OBJECTPOINT, 192), + + /* Manually initialize the client RTSP CSeq for this handle */ + CINIT(RTSP_CLIENT_CSEQ, LONG, 193), + + /* Manually initialize the server RTSP CSeq for this handle */ + CINIT(RTSP_SERVER_CSEQ, LONG, 194), + + /* The stream to pass to INTERLEAVEFUNCTION. */ + CINIT(INTERLEAVEDATA, OBJECTPOINT, 195), + + /* Let the application define a custom write method for RTP data */ + CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196), + + /* Turn on wildcard matching */ + CINIT(WILDCARDMATCH, LONG, 197), + + /* Directory matching callback called before downloading of an + individual file (chunk) started */ + CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198), + + /* Directory matching callback called after the file (chunk) + was downloaded, or skipped */ + CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199), + + /* Change match (fnmatch-like) callback for wildcard matching */ + CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200), + + /* Let the application define custom chunk data pointer */ + CINIT(CHUNK_DATA, OBJECTPOINT, 201), + + /* FNMATCH_FUNCTION user pointer */ + CINIT(FNMATCH_DATA, OBJECTPOINT, 202), + + CURLOPT_LASTENTRY /* the last unused */ +} CURLoption; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2011 */ + +/* This was added in version 7.19.1 */ +#define CURLOPT_POST301 CURLOPT_POSTREDIR + +/* These are scheduled to disappear by 2009 */ + +/* The following were added in 7.17.0 */ +#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_FTPAPPEND CURLOPT_APPEND +#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY +#define CURLOPT_FTP_SSL CURLOPT_USE_SSL + +/* The following were added earlier */ + +#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL + +#else +/* This is set if CURL_NO_OLDIES is defined at compile-time */ +#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ +#endif + + + /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host + name resolves addresses using more than one IP protocol version, this + option might be handy to force libcurl to use a specific IP version. */ +#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP + versions that your system allows */ +#define CURL_IPRESOLVE_V4 1 /* resolve to ipv4 addresses */ +#define CURL_IPRESOLVE_V6 2 /* resolve to ipv6 addresses */ + + /* three convenient "aliases" that follow the name scheme better */ +#define CURLOPT_WRITEDATA CURLOPT_FILE +#define CURLOPT_READDATA CURLOPT_INFILE +#define CURLOPT_HEADERDATA CURLOPT_WRITEHEADER +#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER + + /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ +enum { + CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd + like the library to choose the best possible + for us! */ + CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ + CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ + + CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ +}; + +/* + * Public API enums for RTSP requests + */ +enum { + CURL_RTSPREQ_NONE, /* first in list */ + CURL_RTSPREQ_OPTIONS, + CURL_RTSPREQ_DESCRIBE, + CURL_RTSPREQ_ANNOUNCE, + CURL_RTSPREQ_SETUP, + CURL_RTSPREQ_PLAY, + CURL_RTSPREQ_PAUSE, + CURL_RTSPREQ_TEARDOWN, + CURL_RTSPREQ_GET_PARAMETER, + CURL_RTSPREQ_SET_PARAMETER, + CURL_RTSPREQ_RECORD, + CURL_RTSPREQ_RECEIVE, + CURL_RTSPREQ_LAST /* last in list */ +}; + + /* These enums are for use with the CURLOPT_NETRC option. */ +enum CURL_NETRC_OPTION { + CURL_NETRC_IGNORED, /* The .netrc will never be read. + * This is the default. */ + CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred + * to one in the .netrc. */ + CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. + * Unless one is set programmatically, the .netrc + * will be queried. */ + CURL_NETRC_LAST +}; + +enum { + CURL_SSLVERSION_DEFAULT, + CURL_SSLVERSION_TLSv1, + CURL_SSLVERSION_SSLv2, + CURL_SSLVERSION_SSLv3, + + CURL_SSLVERSION_LAST /* never use, keep last */ +}; + +/* symbols to use with CURLOPT_POSTREDIR. + CURL_REDIR_POST_301 and CURL_REDIR_POST_302 can be bitwise ORed so that + CURL_REDIR_POST_301 | CURL_REDIR_POST_302 == CURL_REDIR_POST_ALL */ + +#define CURL_REDIR_GET_ALL 0 +#define CURL_REDIR_POST_301 1 +#define CURL_REDIR_POST_302 2 +#define CURL_REDIR_POST_ALL (CURL_REDIR_POST_301|CURL_REDIR_POST_302) + +typedef enum { + CURL_TIMECOND_NONE, + + CURL_TIMECOND_IFMODSINCE, + CURL_TIMECOND_IFUNMODSINCE, + CURL_TIMECOND_LASTMOD, + + CURL_TIMECOND_LAST +} curl_TimeCond; + + +/* curl_strequal() and curl_strnequal() are subject for removal in a future + libcurl, see lib/README.curlx for details */ +CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2); +CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n); + +/* name is uppercase CURLFORM_<name> */ +#ifdef CFINIT +#undef CFINIT +#endif + +#ifdef CURL_ISOCPP +#define CFINIT(name) CURLFORM_ ## name +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define CFINIT(name) CURLFORM_/**/name +#endif + +typedef enum { + CFINIT(NOTHING), /********* the first one is unused ************/ + + /* */ + CFINIT(COPYNAME), + CFINIT(PTRNAME), + CFINIT(NAMELENGTH), + CFINIT(COPYCONTENTS), + CFINIT(PTRCONTENTS), + CFINIT(CONTENTSLENGTH), + CFINIT(FILECONTENT), + CFINIT(ARRAY), + CFINIT(OBSOLETE), + CFINIT(FILE), + + CFINIT(BUFFER), + CFINIT(BUFFERPTR), + CFINIT(BUFFERLENGTH), + + CFINIT(CONTENTTYPE), + CFINIT(CONTENTHEADER), + CFINIT(FILENAME), + CFINIT(END), + CFINIT(OBSOLETE2), + + CFINIT(STREAM), + + CURLFORM_LASTENTRY /* the last unused */ +} CURLformoption; + +#undef CFINIT /* done */ + +/* structure to be used as parameter for CURLFORM_ARRAY */ +struct curl_forms { + CURLformoption option; + const char *value; +}; + +/* use this for multipart formpost building */ +/* Returns code for curl_formadd() + * + * Returns: + * CURL_FORMADD_OK on success + * CURL_FORMADD_MEMORY if the FormInfo allocation fails + * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form + * CURL_FORMADD_NULL if a null pointer was given for a char + * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed + * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used + * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) + * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated + * CURL_FORMADD_MEMORY if some allocation for string copying failed. + * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array + * + ***************************************************************************/ +typedef enum { + CURL_FORMADD_OK, /* first, no error */ + + CURL_FORMADD_MEMORY, + CURL_FORMADD_OPTION_TWICE, + CURL_FORMADD_NULL, + CURL_FORMADD_UNKNOWN_OPTION, + CURL_FORMADD_INCOMPLETE, + CURL_FORMADD_ILLEGAL_ARRAY, + CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ + + CURL_FORMADD_LAST /* last */ +} CURLFORMcode; + +/* + * NAME curl_formadd() + * + * DESCRIPTION + * + * Pretty advanced function for building multi-part formposts. Each invoke + * adds one part that together construct a full post. Then use + * CURLOPT_HTTPPOST to send it off to libcurl. + */ +CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, + struct curl_httppost **last_post, + ...); + +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to + * curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on + * success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); +/* + * NAME curl_formfree() + * + * DESCRIPTION + * + * Free a multipart formpost previously built with curl_formadd(). + */ +CURL_EXTERN void curl_formfree(struct curl_httppost *form); + +/* + * NAME curl_getenv() + * + * DESCRIPTION + * + * Returns a malloc()'ed string that MUST be curl_free()ed after usage is + * complete. DEPRECATED - see lib/README.curlx + */ +CURL_EXTERN char *curl_getenv(const char *variable); + +/* + * NAME curl_version() + * + * DESCRIPTION + * + * Returns a static ascii string of the libcurl version. + */ +CURL_EXTERN char *curl_version(void); + +/* + * NAME curl_easy_escape() + * + * DESCRIPTION + * + * Escapes URL strings (converts all letters consider illegal in URLs to their + * %XX versions). This function returns a new allocated string or NULL if an + * error occurred. + */ +CURL_EXTERN char *curl_easy_escape(CURL *handle, + const char *string, + int length); + +/* the previous version: */ +CURL_EXTERN char *curl_escape(const char *string, + int length); + + +/* + * NAME curl_easy_unescape() + * + * DESCRIPTION + * + * Unescapes URL encoding in strings (converts all %XX codes to their 8bit + * versions). This function returns a new allocated string or NULL if an error + * occurred. + * Conversion Note: On non-ASCII platforms the ASCII %XX codes are + * converted into the host encoding. + */ +CURL_EXTERN char *curl_easy_unescape(CURL *handle, + const char *string, + int length, + int *outlength); + +/* the previous version */ +CURL_EXTERN char *curl_unescape(const char *string, + int length); + +/* + * NAME curl_free() + * + * DESCRIPTION + * + * Provided for de-allocation in the same translation unit that did the + * allocation. Added in libcurl 7.10 + */ +CURL_EXTERN void curl_free(void *p); + +/* + * NAME curl_global_init() + * + * DESCRIPTION + * + * curl_global_init() should be invoked exactly once for each application that + * uses libcurl and before any call of other libcurl functions. + * + * This function is not thread-safe! + */ +CURL_EXTERN CURLcode curl_global_init(long flags); + +/* + * NAME curl_global_init_mem() + * + * DESCRIPTION + * + * curl_global_init() or curl_global_init_mem() should be invoked exactly once + * for each application that uses libcurl. This function can be used to + * initialize libcurl and set user defined memory management callback + * functions. Users can implement memory management routines to check for + * memory leaks, check for mis-use of the curl library etc. User registered + * callback routines with be invoked by this library instead of the system + * memory management routines like malloc, free etc. + */ +CURL_EXTERN CURLcode curl_global_init_mem(long flags, + curl_malloc_callback m, + curl_free_callback f, + curl_realloc_callback r, + curl_strdup_callback s, + curl_calloc_callback c); + +/* + * NAME curl_global_cleanup() + * + * DESCRIPTION + * + * curl_global_cleanup() should be invoked exactly once for each application + * that uses libcurl + */ +CURL_EXTERN void curl_global_cleanup(void); + +/* linked-list structure for the CURLOPT_QUOTE option (and other) */ +struct curl_slist { + char *data; + struct curl_slist *next; +}; + +/* + * NAME curl_slist_append() + * + * DESCRIPTION + * + * Appends a string to a linked list. If no list exists, it will be created + * first. Returns the new list, after appending. + */ +CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, + const char *); + +/* + * NAME curl_slist_free_all() + * + * DESCRIPTION + * + * free a previously built curl_slist. + */ +CURL_EXTERN void curl_slist_free_all(struct curl_slist *); + +/* + * NAME curl_getdate() + * + * DESCRIPTION + * + * Returns the time, in seconds since 1 Jan 1970 of the time string given in + * the first argument. The time argument in the second parameter is unused + * and should be set to NULL. + */ +CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); + +/* info about the certificate chain, only for OpenSSL builds. Asked + for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ +struct curl_certinfo { + int num_of_certs; /* number of certificates with information */ + struct curl_slist **certinfo; /* for each index in this array, there's a + linked list with textual information in the + format "name: value" */ +}; + +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 + +typedef enum { + CURLINFO_NONE, /* first, never use this */ + CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, + CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, + CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, + CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, + CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, + CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, + CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, + CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, + CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, + CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, + CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, + CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, + CURLINFO_FILETIME = CURLINFO_LONG + 14, + CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, + CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, + CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, + CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, + CURLINFO_PRIVATE = CURLINFO_STRING + 21, + CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, + CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, + CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, + CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, + CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, + CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, + CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, + CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, + CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, + CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, + CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, + CURLINFO_CERTINFO = CURLINFO_SLIST + 34, + CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, + CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, + CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, + CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, + CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, + CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, + CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, + CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, + /* Fill in new entries below here! */ + + CURLINFO_LASTONE = 42 +} CURLINFO; + +/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as + CURLINFO_HTTP_CODE */ +#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE + +typedef enum { + CURLCLOSEPOLICY_NONE, /* first, never use this */ + + CURLCLOSEPOLICY_OLDEST, + CURLCLOSEPOLICY_LEAST_RECENTLY_USED, + CURLCLOSEPOLICY_LEAST_TRAFFIC, + CURLCLOSEPOLICY_SLOWEST, + CURLCLOSEPOLICY_CALLBACK, + + CURLCLOSEPOLICY_LAST /* last, never use this */ +} curl_closepolicy; + +#define CURL_GLOBAL_SSL (1<<0) +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURL_GLOBAL_NOTHING 0 +#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL + + +/***************************************************************************** + * Setup defines, protos etc for the sharing stuff. + */ + +/* Different data locks for a single share */ +typedef enum { + CURL_LOCK_DATA_NONE = 0, + /* CURL_LOCK_DATA_SHARE is used internally to say that + * the locking is just made to change the internal state of the share + * itself. + */ + CURL_LOCK_DATA_SHARE, + CURL_LOCK_DATA_COOKIE, + CURL_LOCK_DATA_DNS, + CURL_LOCK_DATA_SSL_SESSION, + CURL_LOCK_DATA_CONNECT, + CURL_LOCK_DATA_LAST +} curl_lock_data; + +/* Different lock access types */ +typedef enum { + CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ + CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ + CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ + CURL_LOCK_ACCESS_LAST /* never use */ +} curl_lock_access; + +typedef void (*curl_lock_function)(CURL *handle, + curl_lock_data data, + curl_lock_access locktype, + void *userptr); +typedef void (*curl_unlock_function)(CURL *handle, + curl_lock_data data, + void *userptr); + +typedef void CURLSH; + +typedef enum { + CURLSHE_OK, /* all is fine */ + CURLSHE_BAD_OPTION, /* 1 */ + CURLSHE_IN_USE, /* 2 */ + CURLSHE_INVALID, /* 3 */ + CURLSHE_NOMEM, /* out of memory */ + CURLSHE_LAST /* never use */ +} CURLSHcode; + +typedef enum { + CURLSHOPT_NONE, /* don't use */ + CURLSHOPT_SHARE, /* specify a data type to share */ + CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ + CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ + CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ + CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock + callback functions */ + CURLSHOPT_LAST /* never use */ +} CURLSHoption; + +CURL_EXTERN CURLSH *curl_share_init(void); +CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); +CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); + +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +typedef enum { + CURLVERSION_FIRST, + CURLVERSION_SECOND, + CURLVERSION_THIRD, + CURLVERSION_FOURTH, + CURLVERSION_LAST /* never actually use this */ +} CURLversion; + +/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by + basically all programs ever that want to get version information. It is + meant to be a built-in version number for what kind of struct the caller + expects. If the struct ever changes, we redefine the NOW to another enum + from above. */ +#define CURLVERSION_NOW CURLVERSION_FOURTH + +typedef struct { + CURLversion age; /* age of the returned struct */ + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + const char *host; /* OS/host/cpu/machine when configured */ + int features; /* bitmask, see defines below */ + const char *ssl_version; /* human readable string */ + long ssl_version_num; /* not used anymore, always 0 */ + const char *libz_version; /* human readable string */ + /* protocols is terminated by an entry with a NULL protoname */ + const char * const *protocols; + + /* The fields below this were added in CURLVERSION_SECOND */ + const char *ares; + int ares_num; + + /* This field was added in CURLVERSION_THIRD */ + const char *libidn; + + /* These field were added in CURLVERSION_FOURTH */ + + /* Same as '_libiconv_version' if built with HAVE_ICONV */ + int iconv_ver_num; + + const char *libssh_version; /* human readable string */ + +} curl_version_info_data; + +#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ +#define CURL_VERSION_KERBEROS4 (1<<1) /* kerberos auth is supported */ +#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ +#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ +#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ +#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth support */ +#define CURL_VERSION_DEBUG (1<<6) /* built with debug capabilities */ +#define CURL_VERSION_ASYNCHDNS (1<<7) /* asynchronous dns resolves */ +#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth */ +#define CURL_VERSION_LARGEFILE (1<<9) /* supports files bigger than 2GB */ +#define CURL_VERSION_IDN (1<<10) /* International Domain Names support */ +#define CURL_VERSION_SSPI (1<<11) /* SSPI is supported */ +#define CURL_VERSION_CONV (1<<12) /* character conversions supported */ +#define CURL_VERSION_CURLDEBUG (1<<13) /* debug memory tracking supported */ + +/* + * NAME curl_version_info() + * + * DESCRIPTION + * + * This function returns a pointer to a static copy of the version info + * struct. See above. + */ +CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); + +/* + * NAME curl_easy_strerror() + * + * DESCRIPTION + * + * The curl_easy_strerror function may be used to turn a CURLcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_easy_strerror(CURLcode); + +/* + * NAME curl_share_strerror() + * + * DESCRIPTION + * + * The curl_share_strerror function may be used to turn a CURLSHcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_share_strerror(CURLSHcode); + +/* + * NAME curl_easy_pause() + * + * DESCRIPTION + * + * The curl_easy_pause function pauses or unpauses transfers. Select the new + * state by setting the bitmask, use the convenience defines below. + * + */ +CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); + +#define CURLPAUSE_RECV (1<<0) +#define CURLPAUSE_RECV_CONT (0) + +#define CURLPAUSE_SEND (1<<2) +#define CURLPAUSE_SEND_CONT (0) + +#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) +#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) + +#ifdef __cplusplus +} +#endif + +/* unfortunately, the easy.h and multi.h include files need options and info + stuff before they can be included! */ +#include "easy.h" /* nothing in curl is fun without the easy stuff */ +#include "multi.h" + +/* the typechecker doesn't work in C++ (yet) */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ + !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) +#include "typecheck-gcc.h" +#else +#if defined(__STDC__) && (__STDC__ >= 1) +/* This preprocessor magic that replaces a call with the exact same call is + only done to make sure application authors pass exactly three arguments + to these functions. */ +#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) +#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) +#endif /* __STDC__ >= 1 */ +#endif /* gcc >= 4.3 && !__cplusplus */ + +#endif /* __CURL_CURL_H */ diff --git a/lib/mac32-gcc40/include/curl/curlbuild.h b/lib/mac32-gcc40/include/curl/curlbuild.h new file mode 100644 index 0000000000000000000000000000000000000000..81f4a285470c0e6a8bec459574d8a7e64c02e666 --- /dev/null +++ b/lib/mac32-gcc40/include/curl/curlbuild.h @@ -0,0 +1,191 @@ +/* include/curl/curlbuild.h. Generated from curlbuild.h.in by configure. */ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: http://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +/* #undef CURL_PULL_WS2TCPIP_H */ +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include <windows.h> +# include <winsock2.h> +# include <ws2tcpip.h> +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#define CURL_PULL_SYS_TYPES_H 1 +#ifdef CURL_PULL_SYS_TYPES_H +# include <sys/types.h> +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#define CURL_PULL_STDINT_H 1 +#ifdef CURL_PULL_STDINT_H +# include <stdint.h> +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#define CURL_PULL_INTTYPES_H 1 +#ifdef CURL_PULL_INTTYPES_H +# include <inttypes.h> +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#define CURL_PULL_SYS_SOCKET_H 1 +#ifdef CURL_PULL_SYS_SOCKET_H +# include <sys/socket.h> +#endif + +/* The size of `long', as computed by sizeof. */ +#define CURL_SIZEOF_LONG 4 + +/* Integral data type used for curl_socklen_t. */ +#define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#define CURL_TYPEOF_CURL_OFF_T int64_t + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_T "lld" + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_TU "llu" + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#define CURL_FORMAT_OFF_T "%lld" + +/* The size of `curl_off_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_OFF_T 8 + +/* curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_T LL + +/* unsigned curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_TU ULL + +#endif /* __CURL_CURLBUILD_H */ diff --git a/lib/mac32-gcc40/include/curl/curlrules.h b/lib/mac32-gcc40/include/curl/curlrules.h new file mode 100644 index 0000000000000000000000000000000000000000..8aad1df678c0d827ca792c16137d17d86963fc3d --- /dev/null +++ b/lib/mac32-gcc40/include/curl/curlrules.h @@ -0,0 +1,252 @@ +#ifndef __CURL_CURLRULES_H +#define __CURL_CURLRULES_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* COMPILE TIME SANITY CHECKS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * All checks done in this file are intentionally placed in a public + * header file which is pulled by curl/curl.h when an application is + * being built using an already built libcurl library. Additionally + * this file is also included and used when building the library. + * + * If compilation fails on this file it is certainly sure that the + * problem is elsewhere. It could be a problem in the curlbuild.h + * header file, or simply that you are using different compilation + * settings than those used to build the library. + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * Do not deactivate any check, these are done to make sure that the + * library is properly built and used. + * + * You can find further help on the libcurl development mailing list: + * http://cool.haxx.se/mailman/listinfo/curl-library/ + * + * NOTE 2 + * ------ + * + * Some of the following compile time checks are based on the fact + * that the dimension of a constant array can not be a negative one. + * In this way if the compile time verification fails, the compilation + * will fail issuing an error. The error description wording is compiler + * dependent but it will be quite similar to one of the following: + * + * "negative subscript or subscript is too large" + * "array must have at least one element" + * "-1 is an illegal array size" + * "size of array is negative" + * + * If you are building an application which tries to use an already + * built libcurl library and you are getting this kind of errors on + * this file, it is a clear indication that there is a mismatch between + * how the library was built and how you are trying to use it for your + * application. Your already compiled or binary library provider is the + * only one who can give you the details you need to properly use it. + */ + +/* + * Verify that some macros are actually defined. + */ + +#ifndef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing +#endif + +#ifndef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_OFF_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing +#endif + +/* + * Macros private to this header file. + */ + +#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1 + +#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 + +/* + * Verify that the size previously defined and expected for long + * is the same as the one reported by sizeof() at compile time. + */ + +typedef char + __curl_rule_01__ + [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; + +/* + * Verify that the size previously defined and expected for + * curl_off_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_02__ + [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)]; + +/* + * Verify at compile time that the size of curl_off_t as reported + * by sizeof() is greater or equal than the one reported for long + * for the current compilation. + */ + +typedef char + __curl_rule_03__ + [CurlchkszGE(curl_off_t, long)]; + +/* + * Verify that the size previously defined and expected for + * curl_socklen_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_04__ + [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)]; + +/* + * Verify at compile time that the size of curl_socklen_t as reported + * by sizeof() is greater or equal than the one reported for int for + * the current compilation. + */ + +typedef char + __curl_rule_05__ + [CurlchkszGE(curl_socklen_t, int)]; + +/* ================================================================ */ +/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ +/* ================================================================ */ + +/* + * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow + * these to be visible and exported by the external libcurl interface API, + * while also making them visible to the library internals, simply including + * setup.h, without actually needing to include curl.h internally. + * If some day this section would grow big enough, all this should be moved + * to its own header file. + */ + +/* + * Figure out if we can use the ## preprocessor operator, which is supported + * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ + * or __cplusplus so we need to carefully check for them too. + */ + +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ + defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ + defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ + defined(__ILEC400__) + /* This compiler is believed to have an ISO compatible preprocessor */ +#define CURL_ISOCPP +#else + /* This compiler is believed NOT to have an ISO compatible preprocessor */ +#undef CURL_ISOCPP +#endif + +/* + * Macros for minimum-width signed and unsigned curl_off_t integer constants. + */ + +#ifdef CURL_ISOCPP +# define __CURL_OFF_T_C_HELPER2(Val,Suffix) Val ## Suffix +#else +# define __CURL_OFF_T_C_HELPER2(Val,Suffix) Val/**/Suffix +#endif +#define __CURL_OFF_T_C_HELPER1(Val,Suffix) __CURL_OFF_T_C_HELPER2(Val,Suffix) +#define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HELPER1(Val,CURL_SUFFIX_CURL_OFF_T) +#define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HELPER1(Val,CURL_SUFFIX_CURL_OFF_TU) + +/* + * Get rid of macros private to this header file. + */ + +#undef CurlchkszEQ +#undef CurlchkszGE + +/* + * Get rid of macros not intended to exist beyond this point. + */ + +#undef CURL_PULL_WS2TCPIP_H +#undef CURL_PULL_SYS_TYPES_H +#undef CURL_PULL_SYS_SOCKET_H +#undef CURL_PULL_STDINT_H +#undef CURL_PULL_INTTYPES_H + +#undef CURL_TYPEOF_CURL_SOCKLEN_T +#undef CURL_TYPEOF_CURL_OFF_T + +#ifdef CURL_NO_OLDIES +#undef CURL_FORMAT_OFF_T /* not required since 7.19.0 - obsoleted in 7.20.0 */ +#endif + +#endif /* __CURL_CURLRULES_H */ diff --git a/lib/mac32-gcc40/include/curl/curlver.h b/lib/mac32-gcc40/include/curl/curlver.h new file mode 100644 index 0000000000000000000000000000000000000000..e345f56dfbfe13a9c9e8252ff88a2d848096e46d --- /dev/null +++ b/lib/mac32-gcc40/include/curl/curlver.h @@ -0,0 +1,69 @@ +#ifndef __CURL_CURLVER_H +#define __CURL_CURLVER_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* This header file contains nothing but libcurl version info, generated by + a script at release-time. This was made its own header file in 7.11.2 */ + +/* This is the global package copyright */ +#define LIBCURL_COPYRIGHT "1996 - 2010 Daniel Stenberg, <daniel@haxx.se>." + +/* This is the version number of the libcurl package from which this header + file origins: */ +#define LIBCURL_VERSION "7.21.2" + +/* The numeric version number is also available "in parts" by using these + defines: */ +#define LIBCURL_VERSION_MAJOR 7 +#define LIBCURL_VERSION_MINOR 21 +#define LIBCURL_VERSION_PATCH 2 + +/* This is the numeric version of the libcurl version number, meant for easier + parsing and comparions by programs. The LIBCURL_VERSION_NUM define will + always follow this syntax: + + 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal (using 8 bits each). All three numbers are always represented + using two digits. 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit (24 bits) hexadecimal number does not show pre-release number, + and it is always a greater number in a more recent release. It makes + comparisons with greater than and less than work. +*/ +#define LIBCURL_VERSION_NUM 0x071502 + +/* + * This is the date and time when the full source package was created. The + * timestamp is not stored in git, as the timestamp is properly set in the + * tarballs by the maketgz script. + * + * The format of the date should follow this template: + * + * "Mon Feb 12 11:35:33 UTC 2007" + */ +#define LIBCURL_TIMESTAMP "Tue Oct 12 22:03:31 UTC 2010" + +#endif /* __CURL_CURLVER_H */ diff --git a/lib/mac32-gcc40/include/curl/easy.h b/lib/mac32-gcc40/include/curl/easy.h new file mode 100644 index 0000000000000000000000000000000000000000..1ddb4fe5a2cb476f1a1278b83c7b576135bd5aa9 --- /dev/null +++ b/lib/mac32-gcc40/include/curl/easy.h @@ -0,0 +1,102 @@ +#ifndef __CURL_EASY_H +#define __CURL_EASY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN CURL *curl_easy_init(void); +CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); +CURL_EXTERN void curl_easy_cleanup(CURL *curl); + +/* + * NAME curl_easy_getinfo() + * + * DESCRIPTION + * + * Request internal information from the curl session with this function. The + * third argument MUST be a pointer to a long, a pointer to a char * or a + * pointer to a double (as the documentation describes elsewhere). The data + * pointed to will be filled in accordingly and can be relied upon only if the + * function returns CURLE_OK. This function is intended to get used *AFTER* a + * performed transfer, all results from this function are undefined until the + * transfer is completed. + */ +CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); + + +/* + * NAME curl_easy_duphandle() + * + * DESCRIPTION + * + * Creates a new curl session handle with the same options set for the handle + * passed in. Duplicating a handle could only be a matter of cloning data and + * options, internal state info and things like persistant connections cannot + * be transfered. It is useful in multithreaded applications when you can run + * curl_easy_duphandle() for each new thread to avoid a series of identical + * curl_easy_setopt() invokes in every thread. + */ +CURL_EXTERN CURL* curl_easy_duphandle(CURL *curl); + +/* + * NAME curl_easy_reset() + * + * DESCRIPTION + * + * Re-initializes a CURL handle to the default values. This puts back the + * handle to the same state as it was in when it was just created. + * + * It does keep: live connections, the Session ID cache, the DNS cache and the + * cookies. + */ +CURL_EXTERN void curl_easy_reset(CURL *curl); + +/* + * NAME curl_easy_recv() + * + * DESCRIPTION + * + * Receives data from the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, + size_t *n); + +/* + * NAME curl_easy_send() + * + * DESCRIPTION + * + * Sends data over the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, + size_t buflen, size_t *n); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/mac32-gcc40/include/curl/mprintf.h b/lib/mac32-gcc40/include/curl/mprintf.h new file mode 100644 index 0000000000000000000000000000000000000000..de7dd2f3c360e327e6280372e8a10f335fcf3504 --- /dev/null +++ b/lib/mac32-gcc40/include/curl/mprintf.h @@ -0,0 +1,81 @@ +#ifndef __CURL_MPRINTF_H +#define __CURL_MPRINTF_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include <stdarg.h> +#include <stdio.h> /* needed for FILE */ + +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN int curl_mprintf(const char *format, ...); +CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); +CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); +CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, + const char *format, ...); +CURL_EXTERN int curl_mvprintf(const char *format, va_list args); +CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); +CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); +CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, + const char *format, va_list args); +CURL_EXTERN char *curl_maprintf(const char *format, ...); +CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); + +#ifdef _MPRINTF_REPLACE +# undef printf +# undef fprintf +# undef sprintf +# undef vsprintf +# undef snprintf +# undef vprintf +# undef vfprintf +# undef vsnprintf +# undef aprintf +# undef vaprintf +# define printf curl_mprintf +# define fprintf curl_mfprintf +#ifdef CURLDEBUG +/* When built with CURLDEBUG we define away the sprintf() functions since we + don't want internal code to be using them */ +# define sprintf sprintf_was_used +# define vsprintf vsprintf_was_used +#else +# define sprintf curl_msprintf +# define vsprintf curl_mvsprintf +#endif +# define snprintf curl_msnprintf +# define vprintf curl_mvprintf +# define vfprintf curl_mvfprintf +# define vsnprintf curl_mvsnprintf +# define aprintf curl_maprintf +# define vaprintf curl_mvaprintf +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __CURL_MPRINTF_H */ diff --git a/lib/mac32-gcc40/include/curl/multi.h b/lib/mac32-gcc40/include/curl/multi.h new file mode 100644 index 0000000000000000000000000000000000000000..f96566669c6771fbbf2e1735f826d8cb3a1fce11 --- /dev/null +++ b/lib/mac32-gcc40/include/curl/multi.h @@ -0,0 +1,345 @@ +#ifndef __CURL_MULTI_H +#define __CURL_MULTI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + This is an "external" header file. Don't give away any internals here! + + GOALS + + o Enable a "pull" interface. The application that uses libcurl decides where + and when to ask libcurl to get/send data. + + o Enable multiple simultaneous transfers in the same thread without making it + complicated for the application. + + o Enable the application to select() on its own file descriptors and curl's + file descriptors simultaneous easily. + +*/ + +/* + * This header file should not really need to include "curl.h" since curl.h + * itself includes this file and we expect user applications to do #include + * <curl/curl.h> without the need for especially including multi.h. + * + * For some reason we added this include here at one point, and rather than to + * break existing (wrongly written) libcurl applications, we leave it as-is + * but with this warning attached. + */ +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void CURLM; + +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or + curl_multi_socket*() soon */ + CURLM_OK, + CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ + CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ + CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ + CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ + CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ + CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ + CURLM_LAST +} CURLMcode; + +/* just to make code nicer when using curl_multi_socket() you can now check + for CURLM_CALL_MULTI_SOCKET too in the same style it works for + curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ +#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM + +typedef enum { + CURLMSG_NONE, /* first, not used */ + CURLMSG_DONE, /* This easy handle has completed. 'result' contains + the CURLcode of the transfer */ + CURLMSG_LAST /* last, not used */ +} CURLMSG; + +struct CURLMsg { + CURLMSG msg; /* what this message means */ + CURL *easy_handle; /* the handle it concerns */ + union { + void *whatever; /* message-specific data */ + CURLcode result; /* return code for transfer */ + } data; +}; +typedef struct CURLMsg CURLMsg; + +/* + * Name: curl_multi_init() + * + * Desc: inititalize multi-style curl usage + * + * Returns: a new CURLM handle to use in all 'curl_multi' functions. + */ +CURL_EXTERN CURLM *curl_multi_init(void); + +/* + * Name: curl_multi_add_handle() + * + * Desc: add a standard curl handle to the multi stack + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_remove_handle() + * + * Desc: removes a curl handle from the multi stack again + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_fdset() + * + * Desc: Ask curl for its fd_set sets. The app can use these to select() or + * poll() on. We want curl_multi_perform() called as soon as one of + * them are ready. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + + /* + * Name: curl_multi_perform() + * + * Desc: When the app thinks there's data available for curl it calls this + * function to read/write whatever there is right now. This returns + * as soon as the reads and writes are done. This function does not + * require that there actually is data available for reading or that + * data can be written, it can be called just in case. It returns + * the number of handles that still transfer data in the second + * argument's integer-pointer. + * + * Returns: CURLMcode type, general multi error code. *NOTE* that this only + * returns errors etc regarding the whole multi stack. There might + * still have occurred problems on invidual transfers even when this + * returns OK. + */ +CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, + int *running_handles); + + /* + * Name: curl_multi_cleanup() + * + * Desc: Cleans up and removes a whole multi stack. It does not free or + * touch any individual easy handles in any way. We need to define + * in what state those handles will be if this function is called + * in the middle of a transfer. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); + +/* + * Name: curl_multi_info_read() + * + * Desc: Ask the multi handle if there's any messages/informationals from + * the individual transfers. Messages include informationals such as + * error code from the transfer or just the fact that a transfer is + * completed. More details on these should be written down as well. + * + * Repeated calls to this function will return a new struct each + * time, until a special "end of msgs" struct is returned as a signal + * that there is no more to get at this point. + * + * The data the returned pointer points to will not survive calling + * curl_multi_cleanup(). + * + * The 'CURLMsg' struct is meant to be very simple and only contain + * very basic informations. If more involved information is wanted, + * we will provide the particular "transfer handle" in that struct + * and that should/could/would be used in subsequent + * curl_easy_getinfo() calls (or similar). The point being that we + * must never expose complex structs to applications, as then we'll + * undoubtably get backwards compatibility problems in the future. + * + * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out + * of structs. It also writes the number of messages left in the + * queue (after this read) in the integer the second argument points + * to. + */ +CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, + int *msgs_in_queue); + +/* + * Name: curl_multi_strerror() + * + * Desc: The curl_multi_strerror function may be used to turn a CURLMcode + * value into the equivalent human readable error string. This is + * useful for printing meaningful error messages. + * + * Returns: A pointer to a zero-terminated error message. + */ +CURL_EXTERN const char *curl_multi_strerror(CURLMcode); + +/* + * Name: curl_multi_socket() and + * curl_multi_socket_all() + * + * Desc: An alternative version of curl_multi_perform() that allows the + * application to pass in one of the file descriptors that have been + * detected to have "action" on them and let libcurl perform. + * See man page for details. + */ +#define CURL_POLL_NONE 0 +#define CURL_POLL_IN 1 +#define CURL_POLL_OUT 2 +#define CURL_POLL_INOUT 3 +#define CURL_POLL_REMOVE 4 + +#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD + +#define CURL_CSELECT_IN 0x01 +#define CURL_CSELECT_OUT 0x02 +#define CURL_CSELECT_ERR 0x04 + +typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp); /* private socket + pointer */ +/* + * Name: curl_multi_timer_callback + * + * Desc: Called by libcurl whenever the library detects a change in the + * maximum number of milliseconds the app is allowed to wait before + * curl_multi_socket() or curl_multi_perform() must be called + * (to allow libcurl's timed events to take place). + * + * Returns: The callback should return zero. + */ +typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback + pointer */ + +CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, + curl_socket_t s, + int ev_bitmask, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, + int *running_handles); + +#ifndef CURL_ALLOW_OLD_MULTI_SOCKET +/* This macro below was added in 7.16.3 to push users who recompile to use + the new curl_multi_socket_action() instead of the old curl_multi_socket() +*/ +#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) +#endif + +/* + * Name: curl_multi_timeout() + * + * Desc: Returns the maximum number of milliseconds the app is allowed to + * wait before curl_multi_socket() or curl_multi_perform() must be + * called (to allow libcurl's timed events to take place). + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, + long *milliseconds); + +#undef CINIT /* re-using the same name as in curl.h */ + +#ifdef CURL_ISOCPP +#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLMOPT_/**/name = type + number +#endif + +typedef enum { + /* This is the socket callback function pointer */ + CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1), + + /* This is the argument passed to the socket callback */ + CINIT(SOCKETDATA, OBJECTPOINT, 2), + + /* set to 1 to enable pipelining for this multi handle */ + CINIT(PIPELINING, LONG, 3), + + /* This is the timer callback function pointer */ + CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4), + + /* This is the argument passed to the timer callback */ + CINIT(TIMERDATA, OBJECTPOINT, 5), + + /* maximum number of entries in the connection cache */ + CINIT(MAXCONNECTS, LONG, 6), + + CURLMOPT_LASTENTRY /* the last unused */ +} CURLMoption; + + +/* + * Name: curl_multi_setopt() + * + * Desc: Sets options for the multi handle. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, + CURLMoption option, ...); + + +/* + * Name: curl_multi_assign() + * + * Desc: This function sets an association in the multi handle between the + * given socket and a private pointer of the application. This is + * (only) useful for curl_multi_socket uses. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, + curl_socket_t sockfd, void *sockp); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/lib/mac32-gcc40/include/curl/stdcheaders.h b/lib/mac32-gcc40/include/curl/stdcheaders.h new file mode 100644 index 0000000000000000000000000000000000000000..ad82ef6335d6167aecf8b9e49d68c462ea028bfd --- /dev/null +++ b/lib/mac32-gcc40/include/curl/stdcheaders.h @@ -0,0 +1,33 @@ +#ifndef __STDC_HEADERS_H +#define __STDC_HEADERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include <sys/types.h> + +size_t fread (void *, size_t, size_t, FILE *); +size_t fwrite (const void *, size_t, size_t, FILE *); + +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + +#endif /* __STDC_HEADERS_H */ diff --git a/lib/mac32-gcc40/include/curl/typecheck-gcc.h b/lib/mac32-gcc40/include/curl/typecheck-gcc.h new file mode 100644 index 0000000000000000000000000000000000000000..e6f74a95840326a9156032507a7844cca76ad683 --- /dev/null +++ b/lib/mac32-gcc40/include/curl/typecheck-gcc.h @@ -0,0 +1,584 @@ +#ifndef __CURL_TYPECHECK_GCC_H +#define __CURL_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(_curl_is_sometype_option(_curl_opt)) + * if(!_curl_is_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define _curl_is_sometype_option, _curl_is_sometype and + * _curl_easy_setopt_err_sometype below + * + * NOTE: We use two nested 'if' statements here instead of the && operator, in + * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x + * when compiling with -Wlogical-op. + * + * To add an option that uses the same type as an existing option, you'll just + * need to extend the appropriate _curl_*_option macro + */ +#define curl_easy_setopt(handle, option, value) \ +__extension__ ({ \ + __typeof__ (option) _curl_opt = option; \ + if (__builtin_constant_p(_curl_opt)) { \ + if (_curl_is_long_option(_curl_opt)) \ + if (!_curl_is_long(value)) \ + _curl_easy_setopt_err_long(); \ + if (_curl_is_off_t_option(_curl_opt)) \ + if (!_curl_is_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if (_curl_is_string_option(_curl_opt)) \ + if (!_curl_is_string(value)) \ + _curl_easy_setopt_err_string(); \ + if (_curl_is_write_cb_option(_curl_opt)) \ + if (!_curl_is_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if ((_curl_opt) == CURLOPT_READFUNCTION) \ + if (!_curl_is_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if ((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ + if (!_curl_is_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if ((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ + if (!_curl_is_sockopt_cb(value)) \ + _curl_easy_setopt_err_sockopt_cb(); \ + if ((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ + if (!_curl_is_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if ((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ + if (!_curl_is_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if ((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ + if (!_curl_is_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if ((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ + if (!_curl_is_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if (_curl_is_conv_cb_option(_curl_opt)) \ + if (!_curl_is_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if ((_curl_opt) == CURLOPT_SEEKFUNCTION) \ + if (!_curl_is_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if (_curl_is_cb_data_option(_curl_opt)) \ + if (!_curl_is_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if ((_curl_opt) == CURLOPT_ERRORBUFFER) \ + if (!_curl_is_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if ((_curl_opt) == CURLOPT_STDERR) \ + if (!_curl_is_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if (_curl_is_postfields_option(_curl_opt)) \ + if (!_curl_is_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if ((_curl_opt) == CURLOPT_HTTPPOST) \ + if (!_curl_is_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if (_curl_is_slist_option(_curl_opt)) \ + if (!_curl_is_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if ((_curl_opt) == CURLOPT_SHARE) \ + if (!_curl_is_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + } \ + curl_easy_setopt(handle, _curl_opt, value); \ +}) + +/* wraps curl_easy_getinfo() with typechecking */ +/* FIXME: don't allow const pointers */ +#define curl_easy_getinfo(handle, info, arg) \ +__extension__ ({ \ + __typeof__ (info) _curl_info = info; \ + if (__builtin_constant_p(_curl_info)) { \ + if (_curl_is_string_info(_curl_info)) \ + if (!_curl_is_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if (_curl_is_long_info(_curl_info)) \ + if (!_curl_is_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if (_curl_is_double_info(_curl_info)) \ + if (!_curl_is_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if (_curl_is_slist_info(_curl_info)) \ + if (!_curl_is_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + } \ + curl_easy_getinfo(handle, _curl_info, arg); \ +}) + +/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(), + * for now just make sure that the functions are called with three + * arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define _CURL_WARNING(id, message) \ + static void __attribute__((warning(message))) __attribute__((unused)) \ + __attribute__((noinline)) id(void) { __asm__(""); } + +_CURL_WARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a string (char* or char[]) argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a curl_opensocket_callback argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a private data pointer as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a char buffer of CURL_ERROR_SIZE as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a FILE* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a void* or char* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a struct curl_httppost* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a struct curl_slist* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument for this option") + +_CURL_WARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to char * for this info") +_CURL_WARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long for this info") +_CURL_WARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to struct curl_slist * for this info") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* To add a new option to one of the groups, just add + * (option) == CURLOPT_SOMETHING + * to the or-expression. If the option takes a long or curl_off_t, you don't + * have to do anything + */ + +/* evaluates to true if option takes a long argument */ +#define _curl_is_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define _curl_is_off_t_option(option) \ + ((option) > CURLOPTTYPE_OFF_T) + +/* evaluates to true if option takes a char* argument */ +#define _curl_is_string_option(option) \ + ((option) == CURLOPT_URL || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_ENCODING || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_ISSUERCERT || \ + (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ + (option) == CURLOPT_SSH_KNOWNHOSTS || \ + (option) == CURLOPT_MAIL_FROM || \ + (option) == CURLOPT_RTSP_SESSION_ID || \ + (option) == CURLOPT_RTSP_STREAM_URI || \ + (option) == CURLOPT_RTSP_TRANSPORT || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define _curl_is_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define _curl_is_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define _curl_is_cb_data_option(option) \ + ((option) == CURLOPT_WRITEDATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PROGRESSDATA || \ + (option) == CURLOPT_WRITEHEADER || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_PRIVATE || \ + (option) == CURLOPT_SSH_KEYDATA || \ + (option) == CURLOPT_INTERLEAVEDATA || \ + (option) == CURLOPT_CHUNK_DATA || \ + (option) == CURLOPT_FNMATCH_DATA || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define _curl_is_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define _curl_is_slist_option(option) \ + ((option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + (option) == CURLOPT_MAIL_RCPT || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define _curl_is_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) + +/* evaluates to true if info expects a pointer to long argument */ +#define _curl_is_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define _curl_is_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define _curl_is_slist_info(info) \ + (CURLINFO_SLIST < (info)) + + +/* typecheck helpers -- check whether given expression has requested type*/ + +/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true iff expr is a pointer */ +#define _curl_is_any_ptr(expr) \ + (sizeof(expr) == sizeof(void*)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define _curl_is_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define _curl_is_ptr(expr, type) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define _curl_is_arr(expr, type) \ + (_curl_is_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define _curl_is_string(expr) \ + (_curl_is_arr((expr), char) || \ + _curl_is_arr((expr), signed char) || \ + _curl_is_arr((expr), unsigned char)) + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define _curl_is_long(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char)) + +/* evaluates to true if expr is of type curl_off_t */ +#define _curl_is_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define _curl_is_error_buffer(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define _curl_is_cb_data(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_ptr((expr), FILE)) +#else /* be less strict */ +#define _curl_is_cb_data(expr) \ + _curl_is_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define _curl_is_FILE(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *)) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define _curl_is_postfields(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_arr((expr), char)) + +/* FIXME: the whole callback checking is messy... + * The idea is to tolerate char vs. void and const vs. not const + * pointers in arguments at least + */ +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define _curl_callback_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func), type*)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define _curl_is_read_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) || \ + _curl_callback_compatible((expr), _curl_read_callback1) || \ + _curl_callback_compatible((expr), _curl_read_callback2) || \ + _curl_callback_compatible((expr), _curl_read_callback3) || \ + _curl_callback_compatible((expr), _curl_read_callback4) || \ + _curl_callback_compatible((expr), _curl_read_callback5) || \ + _curl_callback_compatible((expr), _curl_read_callback6)) +typedef size_t (_curl_read_callback1)(char *, size_t, size_t, void*); +typedef size_t (_curl_read_callback2)(char *, size_t, size_t, const void*); +typedef size_t (_curl_read_callback3)(char *, size_t, size_t, FILE*); +typedef size_t (_curl_read_callback4)(void *, size_t, size_t, void*); +typedef size_t (_curl_read_callback5)(void *, size_t, size_t, const void*); +typedef size_t (_curl_read_callback6)(void *, size_t, size_t, FILE*); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define _curl_is_write_cb(expr) \ + (_curl_is_read_cb(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) || \ + _curl_callback_compatible((expr), _curl_write_callback1) || \ + _curl_callback_compatible((expr), _curl_write_callback2) || \ + _curl_callback_compatible((expr), _curl_write_callback3) || \ + _curl_callback_compatible((expr), _curl_write_callback4) || \ + _curl_callback_compatible((expr), _curl_write_callback5) || \ + _curl_callback_compatible((expr), _curl_write_callback6)) +typedef size_t (_curl_write_callback1)(const char *, size_t, size_t, void*); +typedef size_t (_curl_write_callback2)(const char *, size_t, size_t, + const void*); +typedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE*); +typedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void*); +typedef size_t (_curl_write_callback5)(const void *, size_t, size_t, + const void*); +typedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE*); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define _curl_is_ioctl_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (_curl_ioctl_callback1)(CURL *, int, void*); +typedef curlioerr (_curl_ioctl_callback2)(CURL *, int, const void*); +typedef curlioerr (_curl_ioctl_callback3)(CURL *, curliocmd, void*); +typedef curlioerr (_curl_ioctl_callback4)(CURL *, curliocmd, const void*); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define _curl_is_sockopt_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback2)) +typedef int (_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or "similar" */ +#define _curl_is_opensocket_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\ + _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define _curl_is_progress_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) || \ + _curl_callback_compatible((expr), _curl_progress_callback1) || \ + _curl_callback_compatible((expr), _curl_progress_callback2)) +typedef int (_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define _curl_is_debug_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) || \ + _curl_callback_compatible((expr), _curl_debug_callback1) || \ + _curl_callback_compatible((expr), _curl_debug_callback2) || \ + _curl_callback_compatible((expr), _curl_debug_callback3) || \ + _curl_callback_compatible((expr), _curl_debug_callback4)) +typedef int (_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define _curl_is_ssl_ctx_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we're included before OpenSSL headers... + */ +typedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); +typedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define _curl_is_conv_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) || \ + _curl_callback_compatible((expr), _curl_conv_callback1) || \ + _curl_callback_compatible((expr), _curl_conv_callback2) || \ + _curl_callback_compatible((expr), _curl_conv_callback3) || \ + _curl_callback_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define _curl_is_seek_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) || \ + _curl_callback_compatible((expr), _curl_seek_callback1) || \ + _curl_callback_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + + +#endif /* __CURL_TYPECHECK_GCC_H */ diff --git a/lib/mac32-gcc40/include/curl/types.h b/lib/mac32-gcc40/include/curl/types.h new file mode 100644 index 0000000000000000000000000000000000000000..d37d6ae9e11e48d3f8aaba1957015a03f7f12c63 --- /dev/null +++ b/lib/mac32-gcc40/include/curl/types.h @@ -0,0 +1 @@ +/* not used */ diff --git a/lib/mac32-gcc40/include/expat.h b/lib/mac32-gcc40/include/expat.h new file mode 100644 index 0000000000000000000000000000000000000000..20a8278f78d2ab6990152da4ecd67e16e02ef00e --- /dev/null +++ b/lib/mac32-gcc40/include/expat.h @@ -0,0 +1,1014 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef Expat_INCLUDED +#define Expat_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler +#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler +#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler +#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg +#endif + +#include <stdlib.h> +#include "expat_external.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct XML_ParserStruct; +typedef struct XML_ParserStruct *XML_Parser; + +/* Should this be defined using stdbool.h when C99 is available? */ +typedef unsigned char XML_Bool; +#define XML_TRUE ((XML_Bool) 1) +#define XML_FALSE ((XML_Bool) 0) + +/* The XML_Status enum gives the possible return values for several + API functions. The preprocessor #defines are included so this + stanza can be added to code that still needs to support older + versions of Expat 1.95.x: + + #ifndef XML_STATUS_OK + #define XML_STATUS_OK 1 + #define XML_STATUS_ERROR 0 + #endif + + Otherwise, the #define hackery is quite ugly and would have been + dropped. +*/ +enum XML_Status { + XML_STATUS_ERROR = 0, +#define XML_STATUS_ERROR XML_STATUS_ERROR + XML_STATUS_OK = 1, +#define XML_STATUS_OK XML_STATUS_OK + XML_STATUS_SUSPENDED = 2 +#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED +}; + +enum XML_Error { + XML_ERROR_NONE, + XML_ERROR_NO_MEMORY, + XML_ERROR_SYNTAX, + XML_ERROR_NO_ELEMENTS, + XML_ERROR_INVALID_TOKEN, + XML_ERROR_UNCLOSED_TOKEN, + XML_ERROR_PARTIAL_CHAR, + XML_ERROR_TAG_MISMATCH, + XML_ERROR_DUPLICATE_ATTRIBUTE, + XML_ERROR_JUNK_AFTER_DOC_ELEMENT, + XML_ERROR_PARAM_ENTITY_REF, + XML_ERROR_UNDEFINED_ENTITY, + XML_ERROR_RECURSIVE_ENTITY_REF, + XML_ERROR_ASYNC_ENTITY, + XML_ERROR_BAD_CHAR_REF, + XML_ERROR_BINARY_ENTITY_REF, + XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, + XML_ERROR_MISPLACED_XML_PI, + XML_ERROR_UNKNOWN_ENCODING, + XML_ERROR_INCORRECT_ENCODING, + XML_ERROR_UNCLOSED_CDATA_SECTION, + XML_ERROR_EXTERNAL_ENTITY_HANDLING, + XML_ERROR_NOT_STANDALONE, + XML_ERROR_UNEXPECTED_STATE, + XML_ERROR_ENTITY_DECLARED_IN_PE, + XML_ERROR_FEATURE_REQUIRES_XML_DTD, + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, + /* Added in 1.95.7. */ + XML_ERROR_UNBOUND_PREFIX, + /* Added in 1.95.8. */ + XML_ERROR_UNDECLARING_PREFIX, + XML_ERROR_INCOMPLETE_PE, + XML_ERROR_XML_DECL, + XML_ERROR_TEXT_DECL, + XML_ERROR_PUBLICID, + XML_ERROR_SUSPENDED, + XML_ERROR_NOT_SUSPENDED, + XML_ERROR_ABORTED, + XML_ERROR_FINISHED, + XML_ERROR_SUSPEND_PE, + /* Added in 2.0. */ + XML_ERROR_RESERVED_PREFIX_XML, + XML_ERROR_RESERVED_PREFIX_XMLNS, + XML_ERROR_RESERVED_NAMESPACE_URI +}; + +enum XML_Content_Type { + XML_CTYPE_EMPTY = 1, + XML_CTYPE_ANY, + XML_CTYPE_MIXED, + XML_CTYPE_NAME, + XML_CTYPE_CHOICE, + XML_CTYPE_SEQ +}; + +enum XML_Content_Quant { + XML_CQUANT_NONE, + XML_CQUANT_OPT, + XML_CQUANT_REP, + XML_CQUANT_PLUS +}; + +/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be + XML_CQUANT_NONE, and the other fields will be zero or NULL. + If type == XML_CTYPE_MIXED, then quant will be NONE or REP and + numchildren will contain number of elements that may be mixed in + and children point to an array of XML_Content cells that will be + all of XML_CTYPE_NAME type with no quantification. + + If type == XML_CTYPE_NAME, then the name points to the name, and + the numchildren field will be zero and children will be NULL. The + quant fields indicates any quantifiers placed on the name. + + CHOICE and SEQ will have name NULL, the number of children in + numchildren and children will point, recursively, to an array + of XML_Content cells. + + The EMPTY, ANY, and MIXED types will only occur at top level. +*/ + +typedef struct XML_cp XML_Content; + +struct XML_cp { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + XML_Char * name; + unsigned int numchildren; + XML_Content * children; +}; + + +/* This is called for an element declaration. See above for + description of the model argument. It's the caller's responsibility + to free model when finished with it. +*/ +typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, + const XML_Char *name, + XML_Content *model); + +XMLPARSEAPI(void) +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl); + +/* The Attlist declaration handler is called for *each* attribute. So + a single Attlist declaration with multiple attributes declared will + generate multiple calls to this handler. The "default" parameter + may be NULL in the case of the "#IMPLIED" or "#REQUIRED" + keyword. The "isrequired" parameter will be true and the default + value will be NULL in the case of "#REQUIRED". If "isrequired" is + true and default is non-NULL, then this is a "#FIXED" default. +*/ +typedef void (XMLCALL *XML_AttlistDeclHandler) ( + void *userData, + const XML_Char *elname, + const XML_Char *attname, + const XML_Char *att_type, + const XML_Char *dflt, + int isrequired); + +XMLPARSEAPI(void) +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl); + +/* The XML declaration handler is called for *both* XML declarations + and text declarations. The way to distinguish is that the version + parameter will be NULL for text declarations. The encoding + parameter may be NULL for XML declarations. The standalone + parameter will be -1, 0, or 1 indicating respectively that there + was no standalone parameter in the declaration, that it was given + as no, or that it was given as yes. +*/ +typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, + const XML_Char *version, + const XML_Char *encoding, + int standalone); + +XMLPARSEAPI(void) +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler xmldecl); + + +typedef struct { + void *(*malloc_fcn)(size_t size); + void *(*realloc_fcn)(void *ptr, size_t size); + void (*free_fcn)(void *ptr); +} XML_Memory_Handling_Suite; + +/* Constructs a new parser; encoding is the encoding specified by the + external protocol or NULL if there is none specified. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate(const XML_Char *encoding); + +/* Constructs a new parser and namespace processor. Element type + names and attribute names that belong to a namespace will be + expanded; unprefixed attribute names are never expanded; unprefixed + element type names are expanded only if there is a default + namespace. The expanded name is the concatenation of the namespace + URI, the namespace separator character, and the local part of the + name. If the namespace separator is '\0' then the namespace URI + and the local part will be concatenated without any separator. + It is a programming error to use the separator '\0' with namespace + triplets (see XML_SetReturnNSTriplet). +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); + + +/* Constructs a new parser using the memory management suite referred to + by memsuite. If memsuite is NULL, then use the standard library memory + suite. If namespaceSeparator is non-NULL it creates a parser with + namespace processing as described above. The character pointed at + will serve as the namespace separator. + + All further memory operations used for the created parser will come from + the given suite. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate_MM(const XML_Char *encoding, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + +/* Prepare a parser object to be re-used. This is particularly + valuable when memory allocation overhead is disproportionatly high, + such as when a large number of small documnents need to be parsed. + All handlers are cleared from the parser, except for the + unknownEncodingHandler. The parser's external state is re-initialized + except for the values of ns and ns_triplets. + + Added in Expat 1.95.3. +*/ +XMLPARSEAPI(XML_Bool) +XML_ParserReset(XML_Parser parser, const XML_Char *encoding); + +/* atts is array of name/value pairs, terminated by 0; + names and values are 0 terminated. +*/ +typedef void (XMLCALL *XML_StartElementHandler) (void *userData, + const XML_Char *name, + const XML_Char **atts); + +typedef void (XMLCALL *XML_EndElementHandler) (void *userData, + const XML_Char *name); + + +/* s is not 0 terminated. */ +typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, + const XML_Char *s, + int len); + +/* target and data are 0 terminated */ +typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( + void *userData, + const XML_Char *target, + const XML_Char *data); + +/* data is 0 terminated */ +typedef void (XMLCALL *XML_CommentHandler) (void *userData, + const XML_Char *data); + +typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); +typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); + +/* This is called for any characters in the XML document for which + there is no applicable handler. This includes both characters that + are part of markup which is of a kind that is not reported + (comments, markup declarations), or characters that are part of a + construct which could be reported but for which no handler has been + supplied. The characters are passed exactly as they were in the XML + document except that they will be encoded in UTF-8 or UTF-16. + Line boundaries are not normalized. Note that a byte order mark + character is not passed to the default handler. There are no + guarantees about how characters are divided between calls to the + default handler: for example, a comment might be split between + multiple calls. +*/ +typedef void (XMLCALL *XML_DefaultHandler) (void *userData, + const XML_Char *s, + int len); + +/* This is called for the start of the DOCTYPE declaration, before + any DTD or internal subset is parsed. +*/ +typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( + void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset); + +/* This is called for the start of the DOCTYPE declaration when the + closing > is encountered, but after processing any external + subset. +*/ +typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); + +/* This is called for entity declarations. The is_parameter_entity + argument will be non-zero if the entity is a parameter entity, zero + otherwise. + + For internal entities (<!ENTITY foo "bar">), value will + be non-NULL and systemId, publicID, and notationName will be NULL. + The value string is NOT nul-terminated; the length is provided in + the value_length argument. Since it is legal to have zero-length + values, do not use this argument to test for internal entities. + + For external entities, value will be NULL and systemId will be + non-NULL. The publicId argument will be NULL unless a public + identifier was provided. The notationName argument will have a + non-NULL value only for unparsed entity declarations. + + Note that is_parameter_entity can't be changed to XML_Bool, since + that would break binary compatibility. +*/ +typedef void (XMLCALL *XML_EntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity, + const XML_Char *value, + int value_length, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +XMLPARSEAPI(void) +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler); + +/* OBSOLETE -- OBSOLETE -- OBSOLETE + This handler has been superceded by the EntityDeclHandler above. + It is provided here for backward compatibility. + + This is called for a declaration of an unparsed (NDATA) entity. + The base argument is whatever was set by XML_SetBase. The + entityName, systemId and notationName arguments will never be + NULL. The other arguments may be. +*/ +typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +/* This is called for a declaration of notation. The base argument is + whatever was set by XML_SetBase. The notationName will never be + NULL. The other arguments can be. +*/ +typedef void (XMLCALL *XML_NotationDeclHandler) ( + void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* When namespace processing is enabled, these are called once for + each namespace declaration. The call to the start and end element + handlers occur between the calls to the start and end namespace + declaration handlers. For an xmlns attribute, prefix will be + NULL. For an xmlns="" attribute, uri will be NULL. +*/ +typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix, + const XML_Char *uri); + +typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix); + +/* This is called if the document is not standalone, that is, it has an + external subset or a reference to a parameter entity, but does not + have standalone="yes". If this handler returns XML_STATUS_ERROR, + then processing will not continue, and the parser will return a + XML_ERROR_NOT_STANDALONE error. + If parameter entity parsing is enabled, then in addition to the + conditions above this handler will only be called if the referenced + entity was actually read. +*/ +typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); + +/* This is called for a reference to an external parsed general + entity. The referenced entity is not automatically parsed. The + application can parse it immediately or later using + XML_ExternalEntityParserCreate. + + The parser argument is the parser parsing the entity containing the + reference; it can be passed as the parser argument to + XML_ExternalEntityParserCreate. The systemId argument is the + system identifier as specified in the entity declaration; it will + not be NULL. + + The base argument is the system identifier that should be used as + the base for resolving systemId if systemId was relative; this is + set by XML_SetBase; it may be NULL. + + The publicId argument is the public identifier as specified in the + entity declaration, or NULL if none was specified; the whitespace + in the public identifier will have been normalized as required by + the XML spec. + + The context argument specifies the parsing context in the format + expected by the context argument to XML_ExternalEntityParserCreate; + context is valid only until the handler returns, so if the + referenced entity is to be parsed later, it must be copied. + context is NULL only when the entity is a parameter entity. + + The handler should return XML_STATUS_ERROR if processing should not + continue because of a fatal error in the handling of the external + entity. In this case the calling parser will return an + XML_ERROR_EXTERNAL_ENTITY_HANDLING error. + + Note that unlike other handlers the first argument is the parser, + not userData. +*/ +typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( + XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* This is called in two situations: + 1) An entity reference is encountered for which no declaration + has been read *and* this is not an error. + 2) An internal entity reference is read, but not expanded, because + XML_SetDefaultHandler has been called. + Note: skipped parameter entities in declarations and skipped general + entities in attribute values cannot be reported, because + the event would be out of sync with the reporting of the + declarations or attribute values +*/ +typedef void (XMLCALL *XML_SkippedEntityHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity); + +/* This structure is filled in by the XML_UnknownEncodingHandler to + provide information to the parser about encodings that are unknown + to the parser. + + The map[b] member gives information about byte sequences whose + first byte is b. + + If map[b] is c where c is >= 0, then b by itself encodes the + Unicode scalar value c. + + If map[b] is -1, then the byte sequence is malformed. + + If map[b] is -n, where n >= 2, then b is the first byte of an + n-byte sequence that encodes a single Unicode scalar value. + + The data member will be passed as the first argument to the convert + function. + + The convert function is used to convert multibyte sequences; s will + point to a n-byte sequence where map[(unsigned char)*s] == -n. The + convert function must return the Unicode scalar value represented + by this byte sequence or -1 if the byte sequence is malformed. + + The convert function may be NULL if the encoding is a single-byte + encoding, that is if map[b] >= -1 for all bytes b. + + When the parser is finished with the encoding, then if release is + not NULL, it will call release passing it the data member; once + release has been called, the convert function will not be called + again. + + Expat places certain restrictions on the encodings that are supported + using this mechanism. + + 1. Every ASCII character that can appear in a well-formed XML document, + other than the characters + + $@\^`{}~ + + must be represented by a single byte, and that byte must be the + same byte that represents that character in ASCII. + + 2. No character may require more than 4 bytes to encode. + + 3. All characters encoded must have Unicode scalar values <= + 0xFFFF, (i.e., characters that would be encoded by surrogates in + UTF-16 are not allowed). Note that this restriction doesn't + apply to the built-in support for UTF-8 and UTF-16. + + 4. No Unicode character may be encoded by more than one distinct + sequence of bytes. +*/ +typedef struct { + int map[256]; + void *data; + int (XMLCALL *convert)(void *data, const char *s); + void (XMLCALL *release)(void *data); +} XML_Encoding; + +/* This is called for an encoding that is unknown to the parser. + + The encodingHandlerData argument is that which was passed as the + second argument to XML_SetUnknownEncodingHandler. + + The name argument gives the name of the encoding as specified in + the encoding declaration. + + If the callback can provide information about the encoding, it must + fill in the XML_Encoding structure, and return XML_STATUS_OK. + Otherwise it must return XML_STATUS_ERROR. + + If info does not describe a suitable encoding, then the parser will + return an XML_UNKNOWN_ENCODING error. +*/ +typedef int (XMLCALL *XML_UnknownEncodingHandler) ( + void *encodingHandlerData, + const XML_Char *name, + XML_Encoding *info); + +XMLPARSEAPI(void) +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end); + +XMLPARSEAPI(void) +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler handler); + +XMLPARSEAPI(void) +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler handler); + +XMLPARSEAPI(void) +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler); + +XMLPARSEAPI(void) +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler); +XMLPARSEAPI(void) +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler); + +XMLPARSEAPI(void) +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end); + +XMLPARSEAPI(void) +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start); + +XMLPARSEAPI(void) +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end); + +/* This sets the default handler and also inhibits expansion of + internal entities. These entity references will be passed to the + default handler, or to the skipped entity handler, if one is set. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler); + +/* This sets the default handler but does not inhibit expansion of + internal entities. The entity reference will not be passed to the + default handler. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler); + +XMLPARSEAPI(void) +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler); + +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler); + +/* If a non-NULL value for arg is specified here, then it will be + passed as the first argument to the external entity ref handler + instead of the parser object. +*/ +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, + void *arg); + +XMLPARSEAPI(void) +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler); + +XMLPARSEAPI(void) +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + +/* This can be called within a handler for a start element, end + element, processing instruction or character data. It causes the + corresponding markup to be passed to the default handler. +*/ +XMLPARSEAPI(void) +XML_DefaultCurrent(XML_Parser parser); + +/* If do_nst is non-zero, and namespace processing is in effect, and + a name has a prefix (i.e. an explicit namespace qualifier) then + that name is returned as a triplet in a single string separated by + the separator character specified when the parser was created: URI + + sep + local_name + sep + prefix. + + If do_nst is zero, then namespace information is returned in the + default manner (URI + sep + local_name) whether or not the name + has a prefix. + + Note: Calling XML_SetReturnNSTriplet after XML_Parse or + XML_ParseBuffer has no effect. +*/ + +XMLPARSEAPI(void) +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); + +/* This value is passed as the userData argument to callbacks. */ +XMLPARSEAPI(void) +XML_SetUserData(XML_Parser parser, void *userData); + +/* Returns the last value set by XML_SetUserData or NULL. */ +#define XML_GetUserData(parser) (*(void **)(parser)) + +/* This is equivalent to supplying an encoding argument to + XML_ParserCreate. On success XML_SetEncoding returns non-zero, + zero otherwise. + Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer + has no effect and returns XML_STATUS_ERROR. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); + +/* If this function is called, then the parser will be passed as the + first argument to callbacks instead of userData. The userData will + still be accessible using XML_GetUserData. +*/ +XMLPARSEAPI(void) +XML_UseParserAsHandlerArg(XML_Parser parser); + +/* If useDTD == XML_TRUE is passed to this function, then the parser + will assume that there is an external subset, even if none is + specified in the document. In such a case the parser will call the + externalEntityRefHandler with a value of NULL for the systemId + argument (the publicId and context arguments will be NULL as well). + Note: For the purpose of checking WFC: Entity Declared, passing + useDTD == XML_TRUE will make the parser behave as if the document + had a DTD with an external subset. + Note: If this function is called, then this must be done before + the first call to XML_Parse or XML_ParseBuffer, since it will + have no effect after that. Returns + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. + Note: If the document does not have a DOCTYPE declaration at all, + then startDoctypeDeclHandler and endDoctypeDeclHandler will not + be called, despite an external subset being parsed. + Note: If XML_DTD is not defined when Expat is compiled, returns + XML_ERROR_FEATURE_REQUIRES_XML_DTD. +*/ +XMLPARSEAPI(enum XML_Error) +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); + + +/* Sets the base to be used for resolving relative URIs in system + identifiers in declarations. Resolving relative identifiers is + left to the application: this value will be passed through as the + base argument to the XML_ExternalEntityRefHandler, + XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base + argument will be copied. Returns XML_STATUS_ERROR if out of memory, + XML_STATUS_OK otherwise. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetBase(XML_Parser parser, const XML_Char *base); + +XMLPARSEAPI(const XML_Char *) +XML_GetBase(XML_Parser parser); + +/* Returns the number of the attribute/value pairs passed in last call + to the XML_StartElementHandler that were specified in the start-tag + rather than defaulted. Each attribute/value pair counts as 2; thus + this correspondds to an index into the atts array passed to the + XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetSpecifiedAttributeCount(XML_Parser parser); + +/* Returns the index of the ID attribute passed in the last call to + XML_StartElementHandler, or -1 if there is no ID attribute. Each + attribute/value pair counts as 2; thus this correspondds to an + index into the atts array passed to the XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetIdAttributeIndex(XML_Parser parser); + +/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is + detected. The last call to XML_Parse must have isFinal true; len + may be zero for this call (or any other). + + Though the return values for these functions has always been + described as a Boolean value, the implementation, at least for the + 1.95.x series, has always returned exactly one of the XML_Status + values. +*/ +XMLPARSEAPI(enum XML_Status) +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); + +XMLPARSEAPI(void *) +XML_GetBuffer(XML_Parser parser, int len); + +XMLPARSEAPI(enum XML_Status) +XML_ParseBuffer(XML_Parser parser, int len, int isFinal); + +/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. + Must be called from within a call-back handler, except when aborting + (resumable = 0) an already suspended parser. Some call-backs may + still follow because they would otherwise get lost. Examples: + - endElementHandler() for empty elements when stopped in + startElementHandler(), + - endNameSpaceDeclHandler() when stopped in endElementHandler(), + and possibly others. + + Can be called from most handlers, including DTD related call-backs, + except when parsing an external parameter entity and resumable != 0. + Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. + Possible error codes: + - XML_ERROR_SUSPENDED: when suspending an already suspended parser. + - XML_ERROR_FINISHED: when the parser has already finished. + - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. + + When resumable != 0 (true) then parsing is suspended, that is, + XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. + Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() + return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. + + *Note*: + This will be applied to the current parser instance only, that is, if + there is a parent parser then it will continue parsing when the + externalEntityRefHandler() returns. It is up to the implementation of + the externalEntityRefHandler() to call XML_StopParser() on the parent + parser (recursively), if one wants to stop parsing altogether. + + When suspended, parsing can be resumed by calling XML_ResumeParser(). +*/ +XMLPARSEAPI(enum XML_Status) +XML_StopParser(XML_Parser parser, XML_Bool resumable); + +/* Resumes parsing after it has been suspended with XML_StopParser(). + Must not be called from within a handler call-back. Returns same + status codes as XML_Parse() or XML_ParseBuffer(). + Additional error code XML_ERROR_NOT_SUSPENDED possible. + + *Note*: + This must be called on the most deeply nested child parser instance + first, and on its parent parser only after the child parser has finished, + to be applied recursively until the document entity's parser is restarted. + That is, the parent parser will not resume by itself and it is up to the + application to call XML_ResumeParser() on it at the appropriate moment. +*/ +XMLPARSEAPI(enum XML_Status) +XML_ResumeParser(XML_Parser parser); + +enum XML_Parsing { + XML_INITIALIZED, + XML_PARSING, + XML_FINISHED, + XML_SUSPENDED +}; + +typedef struct { + enum XML_Parsing parsing; + XML_Bool finalBuffer; +} XML_ParsingStatus; + +/* Returns status of parser with respect to being initialized, parsing, + finished, or suspended and processing the final buffer. + XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, + XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED +*/ +XMLPARSEAPI(void) +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); + +/* Creates an XML_Parser object that can parse an external general + entity; context is a '\0'-terminated string specifying the parse + context; encoding is a '\0'-terminated string giving the name of + the externally specified encoding, or NULL if there is no + externally specified encoding. The context string consists of a + sequence of tokens separated by formfeeds (\f); a token consisting + of a name specifies that the general entity of the name is open; a + token of the form prefix=uri specifies the namespace for a + particular prefix; a token of the form =uri specifies the default + namespace. This can be called at any point after the first call to + an ExternalEntityRefHandler so longer as the parser has not yet + been freed. The new parser is completely independent and may + safely be used in a separate thread. The handlers and userData are + initialized from the parser argument. Returns NULL if out of memory. + Otherwise returns a new XML_Parser object. +*/ +XMLPARSEAPI(XML_Parser) +XML_ExternalEntityParserCreate(XML_Parser parser, + const XML_Char *context, + const XML_Char *encoding); + +enum XML_ParamEntityParsing { + XML_PARAM_ENTITY_PARSING_NEVER, + XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, + XML_PARAM_ENTITY_PARSING_ALWAYS +}; + +/* Controls parsing of parameter entities (including the external DTD + subset). If parsing of parameter entities is enabled, then + references to external parameter entities (including the external + DTD subset) will be passed to the handler set with + XML_SetExternalEntityRefHandler. The context passed will be 0. + + Unlike external general entities, external parameter entities can + only be parsed synchronously. If the external parameter entity is + to be parsed, it must be parsed during the call to the external + entity ref handler: the complete sequence of + XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and + XML_ParserFree calls must be made during this call. After + XML_ExternalEntityParserCreate has been called to create the parser + for the external parameter entity (context must be 0 for this + call), it is illegal to make any calls on the old parser until + XML_ParserFree has been called on the newly created parser. + If the library has been compiled without support for parameter + entity parsing (ie without XML_DTD being defined), then + XML_SetParamEntityParsing will return 0 if parsing of parameter + entities is requested; otherwise it will return non-zero. + Note: If XML_SetParamEntityParsing is called after XML_Parse or + XML_ParseBuffer, then it has no effect and will always return 0. +*/ +XMLPARSEAPI(int) +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing parsing); + +/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then + XML_GetErrorCode returns information about the error. +*/ +XMLPARSEAPI(enum XML_Error) +XML_GetErrorCode(XML_Parser parser); + +/* These functions return information about the current parse + location. They may be called from any callback called to report + some parse event; in this case the location is the location of the + first of the sequence of characters that generated the event. When + called from callbacks generated by declarations in the document + prologue, the location identified isn't as neatly defined, but will + be within the relevant markup. When called outside of the callback + functions, the position indicated will be just past the last parse + event (regardless of whether there was an associated callback). + + They may also be called after returning from a call to XML_Parse + or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then + the location is the location of the character at which the error + was detected; otherwise the location is the location of the last + parse event, as described above. +*/ +XMLPARSEAPI(XML_Size) XML_GetCurrentLineNumber(XML_Parser parser); +XMLPARSEAPI(XML_Size) XML_GetCurrentColumnNumber(XML_Parser parser); +XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser); + +/* Return the number of bytes in the current event. + Returns 0 if the event is in an internal entity. +*/ +XMLPARSEAPI(int) +XML_GetCurrentByteCount(XML_Parser parser); + +/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets + the integer pointed to by offset to the offset within this buffer + of the current parse position, and sets the integer pointed to by size + to the size of this buffer (the number of input bytes). Otherwise + returns a NULL pointer. Also returns a NULL pointer if a parse isn't + active. + + NOTE: The character pointer returned should not be used outside + the handler that makes the call. +*/ +XMLPARSEAPI(const char *) +XML_GetInputContext(XML_Parser parser, + int *offset, + int *size); + +/* For backwards compatibility with previous versions. */ +#define XML_GetErrorLineNumber XML_GetCurrentLineNumber +#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber +#define XML_GetErrorByteIndex XML_GetCurrentByteIndex + +/* Frees the content model passed to the element declaration handler */ +XMLPARSEAPI(void) +XML_FreeContentModel(XML_Parser parser, XML_Content *model); + +/* Exposing the memory handling functions used in Expat */ +XMLPARSEAPI(void *) +XML_MemMalloc(XML_Parser parser, size_t size); + +XMLPARSEAPI(void *) +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); + +XMLPARSEAPI(void) +XML_MemFree(XML_Parser parser, void *ptr); + +/* Frees memory used by the parser. */ +XMLPARSEAPI(void) +XML_ParserFree(XML_Parser parser); + +/* Returns a string describing the error. */ +XMLPARSEAPI(const XML_LChar *) +XML_ErrorString(enum XML_Error code); + +/* Return a string containing the version number of this expat */ +XMLPARSEAPI(const XML_LChar *) +XML_ExpatVersion(void); + +typedef struct { + int major; + int minor; + int micro; +} XML_Expat_Version; + +/* Return an XML_Expat_Version structure containing numeric version + number information for this version of expat. +*/ +XMLPARSEAPI(XML_Expat_Version) +XML_ExpatVersionInfo(void); + +/* Added in Expat 1.95.5. */ +enum XML_FeatureEnum { + XML_FEATURE_END = 0, + XML_FEATURE_UNICODE, + XML_FEATURE_UNICODE_WCHAR_T, + XML_FEATURE_DTD, + XML_FEATURE_CONTEXT_BYTES, + XML_FEATURE_MIN_SIZE, + XML_FEATURE_SIZEOF_XML_CHAR, + XML_FEATURE_SIZEOF_XML_LCHAR, + XML_FEATURE_NS, + XML_FEATURE_LARGE_SIZE + /* Additional features must be added to the end of this enum. */ +}; + +typedef struct { + enum XML_FeatureEnum feature; + const XML_LChar *name; + long int value; +} XML_Feature; + +XMLPARSEAPI(const XML_Feature *) +XML_GetFeatureList(void); + + +/* Expat follows the GNU/Linux convention of odd number minor version for + beta/development releases and even number minor version for stable + releases. Micro is bumped with each release, and set to 0 with each + change to major or minor version. +*/ +#define XML_MAJOR_VERSION 2 +#define XML_MINOR_VERSION 0 +#define XML_MICRO_VERSION 1 + +#ifdef __cplusplus +} +#endif + +#endif /* not Expat_INCLUDED */ diff --git a/lib/mac32-gcc40/include/expat_external.h b/lib/mac32-gcc40/include/expat_external.h new file mode 100644 index 0000000000000000000000000000000000000000..2c03284ea265bc62bbae15e29e48f7b0df4cef0d --- /dev/null +++ b/lib/mac32-gcc40/include/expat_external.h @@ -0,0 +1,115 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef Expat_External_INCLUDED +#define Expat_External_INCLUDED 1 + +/* External API definitions */ + +#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) +#define XML_USE_MSC_EXTENSIONS 1 +#endif + +/* Expat tries very hard to make the API boundary very specifically + defined. There are two macros defined to control this boundary; + each of these can be defined before including this header to + achieve some different behavior, but doing so it not recommended or + tested frequently. + + XMLCALL - The calling convention to use for all calls across the + "library boundary." This will default to cdecl, and + try really hard to tell the compiler that's what we + want. + + XMLIMPORT - Whatever magic is needed to note that a function is + to be imported from a dynamically loaded library + (.dll, .so, or .sl, depending on your platform). + + The XMLCALL macro was added in Expat 1.95.7. The only one which is + expected to be directly useful in client code is XMLCALL. + + Note that on at least some Unix versions, the Expat library must be + compiled with the cdecl calling convention as the default since + system headers may assume the cdecl convention. +*/ +#ifndef XMLCALL +#if defined(_MSC_VER) +#define XMLCALL __cdecl +#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER) +#define XMLCALL __attribute__((cdecl)) +#else +/* For any platform which uses this definition and supports more than + one calling convention, we need to extend this definition to + declare the convention used on that platform, if it's possible to + do so. + + If this is the case for your platform, please file a bug report + with information on how to identify your platform via the C + pre-processor and how to specify the same calling convention as the + platform's malloc() implementation. +*/ +#define XMLCALL +#endif +#endif /* not defined XMLCALL */ + + +#if !defined(XML_STATIC) && !defined(XMLIMPORT) +#ifndef XML_BUILDING_EXPAT +/* using Expat from an application */ + +#ifdef XML_USE_MSC_EXTENSIONS +#define XMLIMPORT __declspec(dllimport) +#endif + +#endif +#endif /* not defined XML_STATIC */ + + +/* If we didn't define it above, define it away: */ +#ifndef XMLIMPORT +#define XMLIMPORT +#endif + + +#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef XML_UNICODE_WCHAR_T +#define XML_UNICODE +#endif + +#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ +#ifdef XML_UNICODE_WCHAR_T +typedef wchar_t XML_Char; +typedef wchar_t XML_LChar; +#else +typedef unsigned short XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE_WCHAR_T */ +#else /* Information is UTF-8 encoded. */ +typedef char XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE */ + +#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */ +#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 +typedef __int64 XML_Index; +typedef unsigned __int64 XML_Size; +#else +typedef long long XML_Index; +typedef unsigned long long XML_Size; +#endif +#else +typedef long XML_Index; +typedef unsigned long XML_Size; +#endif /* XML_LARGE_SIZE */ + +#ifdef __cplusplus +} +#endif + +#endif /* not Expat_External_INCLUDED */ diff --git a/lib/mac32-gcc40/lib/libcurl.4.dylib b/lib/mac32-gcc40/lib/libcurl.4.dylib new file mode 100755 index 0000000000000000000000000000000000000000..62381ddd4922993b0118b6caebc567ffcae6339e Binary files /dev/null and b/lib/mac32-gcc40/lib/libcurl.4.dylib differ diff --git a/lib/mac32-gcc40/lib/libcurl.a b/lib/mac32-gcc40/lib/libcurl.a new file mode 100644 index 0000000000000000000000000000000000000000..d118ed3279b72f351e2a65fa4fbf843974de1338 Binary files /dev/null and b/lib/mac32-gcc40/lib/libcurl.a differ diff --git a/lib/mac32-gcc40/lib/libcurl.dylib b/lib/mac32-gcc40/lib/libcurl.dylib new file mode 120000 index 0000000000000000000000000000000000000000..8d7cf043ebc4a9832d3a970dfd1ef377c3b08b90 --- /dev/null +++ b/lib/mac32-gcc40/lib/libcurl.dylib @@ -0,0 +1 @@ +libcurl.4.dylib \ No newline at end of file diff --git a/lib/mac32-gcc40/lib/libcurl.la b/lib/mac32-gcc40/lib/libcurl.la new file mode 100755 index 0000000000000000000000000000000000000000..d3c791b1823ef5299854990f7d797874b3f44486 --- /dev/null +++ b/lib/mac32-gcc40/lib/libcurl.la @@ -0,0 +1,41 @@ +# libcurl.la - a libtool library file +# Generated by ltmain.sh (GNU libtool) 2.2.6b Debian-2.2.6b-2 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libcurl.4.dylib' + +# Names of this library. +library_names='libcurl.4.dylib libcurl.dylib' + +# The name of the static archive. +old_library='libcurl.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags=' ' + +# Libraries that this one depends upon. +dependency_libs=' -R/opt/local/lib -L/opt/local/lib /opt/local/lib/libidn.la /opt/local/lib/libintl.la -lc /opt/local/lib/libiconv.la -lldap -lssl -lcrypto -lz' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libcurl. +current=6 +age=2 +revision=0 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/Users/user/Documents/pixhawk/curl-7.21.2/fakeinstall/lib' diff --git a/lib/mac32-gcc40/lib/libexpat.1.5.2.dylib b/lib/mac32-gcc40/lib/libexpat.1.5.2.dylib new file mode 100755 index 0000000000000000000000000000000000000000..cde150b83e43e9fa121fa7973bf819dba767b632 Binary files /dev/null and b/lib/mac32-gcc40/lib/libexpat.1.5.2.dylib differ diff --git a/lib/mac32-gcc40/lib/libexpat.1.dylib b/lib/mac32-gcc40/lib/libexpat.1.dylib new file mode 120000 index 0000000000000000000000000000000000000000..87c4b1cd75bb803e042bbd69b31a6f18dad92419 --- /dev/null +++ b/lib/mac32-gcc40/lib/libexpat.1.dylib @@ -0,0 +1 @@ +libexpat.1.5.2.dylib \ No newline at end of file diff --git a/lib/mac32-gcc40/lib/libexpat.a b/lib/mac32-gcc40/lib/libexpat.a new file mode 100644 index 0000000000000000000000000000000000000000..e00ee072b962ed543d8eca14b6e322d9db48fb5c Binary files /dev/null and b/lib/mac32-gcc40/lib/libexpat.a differ diff --git a/lib/mac32-gcc40/lib/libexpat.dylib b/lib/mac32-gcc40/lib/libexpat.dylib new file mode 120000 index 0000000000000000000000000000000000000000..87c4b1cd75bb803e042bbd69b31a6f18dad92419 --- /dev/null +++ b/lib/mac32-gcc40/lib/libexpat.dylib @@ -0,0 +1 @@ +libexpat.1.5.2.dylib \ No newline at end of file diff --git a/lib/mac32-gcc40/lib/libexpat.la b/lib/mac32-gcc40/lib/libexpat.la new file mode 100755 index 0000000000000000000000000000000000000000..68f357aed0cbbe65fded15ed1288bef7f1317e7f --- /dev/null +++ b/lib/mac32-gcc40/lib/libexpat.la @@ -0,0 +1,35 @@ +# libexpat.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.22 (1.1220.2.365 2005/12/18 22:14:06) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libexpat.1.dylib' + +# Names of this library. +library_names='libexpat.1.5.2.dylib libexpat.1.dylib libexpat.dylib' + +# The name of the static archive. +old_library='libexpat.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libexpat. +current=6 +age=5 +revision=2 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/Users/user/Documents/pixhawk/expat-2.0.1/fakeinstall/lib' diff --git a/mavground.qrc b/mavground.qrc index 6bb41cfdb8a2b2deddc1c0820342ed9244724a98..15e85568816bddcf4ae3ee54f9f3ef29a68a6854 100644 --- a/mavground.qrc +++ b/mavground.qrc @@ -82,6 +82,8 @@ <file>images/mapproviders/openstreetmap.png</file> <file>images/mapproviders/google.png</file> <file>images/mapproviders/yahoo.png</file> + <file>images/earth.html</file> + <file>images/mapproviders/googleearth.svg</file> </qresource> <qresource prefix="/general"> <file alias="vera.ttf">images/Vera.ttf</file> diff --git a/models/ascent-park-glider.skp b/models/ascent-park-glider.skp new file mode 100644 index 0000000000000000000000000000000000000000..1a791d7591c89f6c536f49bdfd651a859faf9f0f Binary files /dev/null and b/models/ascent-park-glider.skp differ diff --git a/models/multiplex-easyglider.skp b/models/multiplex-easyglider.skp new file mode 100644 index 0000000000000000000000000000000000000000..aa6d9ed8b76289ef3816931e616366bc4795f2a9 Binary files /dev/null and b/models/multiplex-easyglider.skp differ diff --git a/models/multiplex-twinstar.skp b/models/multiplex-twinstar.skp new file mode 100644 index 0000000000000000000000000000000000000000..30fd6f91775931cc2fc867dad1c416765adfdc94 Binary files /dev/null and b/models/multiplex-twinstar.skp differ diff --git a/models/walkera-4g6.skp b/models/walkera-4g6.skp new file mode 100644 index 0000000000000000000000000000000000000000..c419e93dd7c9c277d167cae87ac8fec66f32aead Binary files /dev/null and b/models/walkera-4g6.skp differ diff --git a/qgroundcontrol.pri b/qgroundcontrol.pri index 76bab17fd85c83015cf97c17161fbc3d0a6d9ff4..48f48d49ddeae9a80e0278d6fc9cbcf37271d98d 100644 --- a/qgroundcontrol.pri +++ b/qgroundcontrol.pri @@ -1,381 +1,392 @@ -#------------------------------------------------- -# -# QGroundControl - Micro Air Vehicle Groundstation -# -# Please see our website at <http://qgroundcontrol.org> -# -# Author: -# Lorenz Meier <mavteam@student.ethz.ch> -# -# (c) 2009-2010 PIXHAWK Team -# -# This file is part of the mav groundstation project -# QGroundControl 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. -# QGroundControl 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 QGroundControl. If not, see <http://www.gnu.org/licenses/>. -# -#------------------------------------------------- - -#$$BASEDIR/lib/qextserialport/include -# $$BASEDIR/lib/openjaus/libjaus/include \ -# $$BASEDIR/lib/openjaus/libopenJaus/include - -message(Qt version $$[QT_VERSION]) - -release { -# DEFINES += QT_NO_DEBUG_OUTPUT -# DEFINES += QT_NO_WARNING_OUTPUT -} - -QMAKE_PRE_LINK += echo "Copying files" - -#QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/debug/. -#QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/release/. - -# MAC OS X -macx { - - COMPILER_VERSION = $$system(gcc -v) - message(Using compiler $$COMPILER_VERSION) - - HARDWARE_PLATFORM = $$system(uname -a) - contains( HARDWARE_PLATFORM, 9.6.0 ) || contains( HARDWARE_PLATFORM, 9.7.0 ) || contains( HARDWARE_PLATFORM, 9.8.0 ) || contains( HARDWARE_PLATFORM, 9.9.0 ) { - # x86 Mac OS X Leopard 10.5 and earlier - CONFIG += x86 cocoa phonon - message(Building for Mac OS X 32bit/Leopard 10.5 and earlier) - - # Enable function-profiling with the OS X saturn tool - debug { - #QMAKE_CXXFLAGS += -finstrument-functions - #LIBS += -lSaturn - } - } else { - # x64 Mac OS X Snow Leopard 10.6 and later - CONFIG += x86_64 cocoa - CONFIG -= x86 phonon - message(Building for Mac OS X 64bit/Snow Leopard 10.6 and later) - } - - QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.5 - - DESTDIR = $$BASEDIR/bin/mac - INCLUDEPATH += -framework SDL - - LIBS += -framework IOKit \ - -framework SDL \ - -framework CoreFoundation \ - -framework ApplicationServices \ - -lm - - ICON = $$BASEDIR/images/icons/macx.icns - - # Copy audio files if needed - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$DESTDIR/qgroundcontrol.app/Contents/MacOs/. - - exists(/Library/Frameworks/osg.framework):exists(/Library/Frameworks/OpenThreads.framework) { - # No check for GLUT.framework since it's a MAC default - message("Building support for OpenSceneGraph") - DEPENDENCIES_PRESENT += osg - DEFINES += QGC_OSG_ENABLED - # Include OpenSceneGraph libraries - INCLUDEPATH += -framework GLUT \ - -framework Carbon \ - -framework OpenThreads \ - -framework osg \ - -framework osgViewer \ - -framework osgGA \ - -framework osgDB \ - -framework osgText \ - -framework osgWidget - - LIBS += -framework GLUT \ - -framework Carbon \ - -framework OpenThreads \ - -framework osg \ - -framework osgViewer \ - -framework osgGA \ - -framework osgDB \ - -framework osgText \ - -framework osgWidget - } - - exists(/usr/include/osgEarth) { - message("Building support for osgEarth") - DEPENDENCIES_PRESENT += osgearth - # Include osgEarth libraries - INCLUDEPATH += -framework GDAL \ - $$IN_PWD/lib/mac32-gcc/include \ - -framework GEOS \ - -framework SQLite3 \ - -framework osgFX \ - -framework osgTerrain - - LIBS += -framework GDAL \ - -framework GEOS \ - -framework SQLite3 \ - -framework osgFX \ - -framework osgTerrain \ - DEFINES += QGC_OSGEARTH_ENABLED - } - - exists(/opt/local/include/libfreenect) { - message("Building support for libfreenect") - DEPENDENCIES_PRESENT += libfreenect - # Include libfreenect libraries - LIBS += -lfreenect - DEFINES += QGC_LIBFREENECT_ENABLED - } - - # osg/osgEarth dynamic casts might fail without this compiler option. - # see http://osgearth.org/wiki/FAQ for details. - #QMAKE_CXXFLAGS += -Wl, -E -} - -# GNU/Linux -linux-g++ { - - debug { - DESTDIR = $$BUILDDIR/debug - CONFIG += debug - } - - release { - DESTDIR = $$BUILDDIR/release - } - - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$DESTDIR/. - - INCLUDEPATH += /usr/include \ - /usr/include/qt4/phonon - # $$BASEDIR/lib/flite/include \ - # $$BASEDIR/lib/flite/lang - - - message(Building for GNU/Linux 32bit/i386) - - LIBS += \ - -L/usr/lib \ - -lm \ - -lflite_cmu_us_kal \ - -lflite_usenglish \ - -lflite_cmulex \ - -lflite \ - -lSDL \ - -lSDLmain - - exists(/usr/include/osg) { - message("Building support for OpenSceneGraph") - DEPENDENCIES_PRESENT += osg - # Include OpenSceneGraph libraries - LIBS += -losg - DEFINES += QGC_OSG_ENABLED - } - - exists(/usr/include/osgEarth) | exists(/usr/local/include/osgEarth) { - message("Building support for osgEarth") - DEPENDENCIES_PRESENT += osgearth - # Include osgEarth libraries - LIBS += -losgViewer \ - -losgEarth \ - -losgEarthUtil - DEFINES += QGC_OSGEARTH_ENABLED - } - - exists(/usr/local/include/libfreenect) { - message("Building suplocport for libfreenect") - DEPENDENCIES_PRESENT += libfreenect - INCLUDEPATH += /usr/include/libusb-1.0 - # Include libfreenect libraries - LIBS += -lfreenect - DEFINES += QGC_LIBFREENECT_ENABLED - } - - QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/debug/. - QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/release/. - QMAKE_PRE_LINK += && cp -rf $$BASEDIR/data $$TARGETDIR/debug/. - QMAKE_PRE_LINK += && cp -rf $$BASEDIR/data $$TARGETDIR/release/. - - # osg/osgEarth dynamic casts might fail without this compiler option. - # see http://osgearth.org/wiki/FAQ for details. - QMAKE_CXXFLAGS += -Wl, -E -} - -linux-g++-64 { - - debug { - DESTDIR = $$BUILDDIR/debug - CONFIG += debug - } - - release { - DESTDIR = $$BUILDDIR/release - } - - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$DESTDIR/. - - INCLUDEPATH += /usr/include \ - /usr/include/qt4/phonon - # $$BASEDIR/lib/flite/include \ - # $$BASEDIR/lib/flite/lang - - - # 64-bit Linux - message(Building for GNU/Linux 64bit/x64 (g++-64)) - - LIBS += \ - -L/usr/lib \ - -lm \ - -lflite_cmu_us_kal \ - -lflite_usenglish \ - -lflite_cmulex \ - -lflite \ - -lSDL \ - -lSDLmain - - exists(/usr/include/osg) { - message("Building support for OpenSceneGraph") - DEPENDENCIES_PRESENT += osg - # Include OpenSceneGraph libraries - LIBS += -losg - DEFINES += QGC_OSG_ENABLED - } - - exists(/usr/include/osgEarth) { - message("Building support for osgEarth") - DEPENDENCIES_PRESENT += osgearth - # Include osgEarth libraries - LIBS += -losgViewer \ - -losgEarth \ - -losgEarthUtil - DEFINES += QGC_OSGEARTH_ENABLED - } - - exists(/usr/local/include/libfreenect) { - message("Building support for libfreenect") - DEPENDENCIES_PRESENT += libfreenect - INCLUDEPATH += /usr/include/libusb-1.0 - # Include libfreenect libraries - LIBS += -lfreenect - DEFINES += QGC_LIBFREENECT_ENABLED - } - - # osg/osgEarth dynamic casts might fail without this compiler option. - # see http://osgearth.org/wiki/FAQ for details. - QMAKE_CXXFLAGS += -Wl, -E -} - -# Windows (32bit) -win32-msvc2008 { - - message(Building for Windows Visual Studio 2008 (32bit)) - - # Special settings for debug - #CONFIG += CONSOLE - - INCLUDEPATH += $$BASEDIR/lib/sdl/msvc/include \ - $$BASEDIR/lib/opal/include \ - $$BASEDIR/lib/msinttypes - #"C:\Program Files\Microsoft SDKs\Windows\v7.0\Include" - - LIBS += -L$$BASEDIR/lib/sdl/msvc/lib \ - -lSDLmain -lSDL - - RC_FILE = $$BASEDIR/qgroundcontrol.rc - - # Copy dependencies - QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$TARGETDIR/debug/. && - QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$TARGETDIR/release/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$TARGETDIR/debug/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$TARGETDIR/release/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/models $$TARGETDIR/debug/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/models $$TARGETDIR/release/. - - # osg/osgEarth dynamic casts might fail without this compiler option. - # see http://osgearth.org/wiki/FAQ for details. - QMAKE_CXXFLAGS += /Wl /E -} - -# Windows (32bit) -win32-g++ { - - message(Building for Windows Platform (32bit)) - - # Special settings for debug - #CONFIG += CONSOLE - - INCLUDEPATH += $$BASEDIR/lib/sdl/include \ - $$BASEDIR/lib/opal/include #\ #\ - #"C:\Program Files\Microsoft SDKs\Windows\v7.0\Include" - - LIBS += -L$$BASEDIR/lib/sdl/win32 \ - -lmingw32 -lSDLmain -lSDL -mwindows - - - - debug { - DESTDIR = $$BUILDDIR/debug - } - - release { - DESTDIR = $$BUILDDIR/release - } - - RC_FILE = $$BASEDIR/qgroundcontrol.rc - - # Copy dependencies - QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$BUILDDIR/debug/. && - QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$BUILDDIR/release/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$TARGETDIR/debug/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$TARGETDIR/release/. - QMAKE_PRE_LINK += cp -rf $$BASEDIR/models $$TARGETDIR/debug/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/models $$TARGETDIR/release/. - - # osg/osgEarth dynamic casts might fail without this compiler option. - # see http://osgearth.org/wiki/FAQ for details. - QMAKE_CXXFLAGS += -Wl, -E -} - -# Windows (64bit) -win64-g++ { - - message(Building for Windows Platform (64bit)) - - # Special settings for debug - #CONFIG += CONSOLE - - INCLUDEPATH += $$BASEDIR\lib\sdl\include \ - $$BASEDIR\lib\opal\include #\ #\ - #"C:\Program Files\Microsoft SDKs\Windows\v7.0\Include" - - LIBS += -L$$BASEDIR/lib/sdl/win32 \ - -lmingw32 -lSDLmain -lSDL -mwindows - - - - debug { - DESTDIR = $$BASEDIR/bin - } - - release { - DESTDIR = $$BASEDIR/bin - } - - RC_FILE = $$BASEDIR/qgroundcontrol.rc - - # Copy dependencies - QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$BUILDDIR/debug/. && - QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$BUILDDIR/release/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$BUILDDIR/debug/. && - QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$BUILDDIR/release/. - - # osg/osgEarth dynamic casts might fail without this compiler option. - # see http://osgearth.org/wiki/FAQ for details. - QMAKE_CXXFLAGS += -Wl, -E -} +#------------------------------------------------- +# +# QGroundControl - Micro Air Vehicle Groundstation +# +# Please see our website at <http://qgroundcontrol.org> +# +# Author: +# Lorenz Meier <mavteam@student.ethz.ch> +# +# (c) 2009-2010 PIXHAWK Team +# +# This file is part of the mav groundstation project +# QGroundControl 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. +# QGroundControl 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 QGroundControl. If not, see <http://www.gnu.org/licenses/>. +# +#------------------------------------------------- + +#$$BASEDIR/lib/qextserialport/include +# $$BASEDIR/lib/openjaus/libjaus/include \ +# $$BASEDIR/lib/openjaus/libopenJaus/include + +message(Qt version $$[QT_VERSION]) + +release { +# DEFINES += QT_NO_DEBUG_OUTPUT +# DEFINES += QT_NO_WARNING_OUTPUT +} + +QMAKE_PRE_LINK += echo "Copying files" + +#QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/debug/. +#QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/release/. + +# MAC OS X +macx { + + COMPILER_VERSION = system(gcc -v) + message(Using compiler $$COMPILER_VERSION) + + HARDWARE_PLATFORM = $$system(uname -a) + contains( HARDWARE_PLATFORM, 9.6.0 ) || contains( HARDWARE_PLATFORM, 9.7.0 ) || contains( HARDWARE_PLATFORM, 9.8.0 ) || contains( HARDWARE_PLATFORM, 9.9.0 ) { + # x86 Mac OS X Leopard 10.5 and earlier + CONFIG += x86 cocoa phonon + message(Building for Mac OS X 32bit/Leopard 10.5 and earlier) + + # Enable function-profiling with the OS X saturn tool + debug { + #QMAKE_CXXFLAGS += -finstrument-functions + #LIBS += -lSaturn + } + } else { + # x64 Mac OS X Snow Leopard 10.6 and later + CONFIG += x86_64 cocoa + CONFIG -= x86 phonon + message(Building for Mac OS X 64bit/Snow Leopard 10.6 and later) + } + + QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.5 + + DESTDIR = $$BASEDIR/bin/mac + INCLUDEPATH += -framework SDL + + LIBS += -framework IOKit \ + -framework SDL \ + -framework CoreFoundation \ + -framework ApplicationServices \ + -lm + + ICON = $$BASEDIR/images/icons/macx.icns + + # Copy audio files if needed + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/audio $$DESTDIR/qgroundcontrol.app/Contents/MacOs/. + # Copy google earth starter file + QMAKE_PRE_LINK += && cp -f $$BASEDIR/images/earth.html $$DESTDIR/qgroundcontrol.app/Contents/MacOs/. + # Copy model files + QMAKE_PRE_LINK += && cp -f $$BASEDIR/models/*.skp $$DESTDIR/qgroundcontrol.app/Contents/MacOs/. + + exists(/Library/Frameworks/osg.framework):exists(/Library/Frameworks/OpenThreads.framework) { + # No check for GLUT.framework since it's a MAC default + message("Building support for OpenSceneGraph") + DEPENDENCIES_PRESENT += osg + DEFINES += QGC_OSG_ENABLED + # Include OpenSceneGraph libraries + INCLUDEPATH += -framework GLUT \ + -framework Carbon \ + -framework OpenThreads \ + -framework osg \ + -framework osgViewer \ + -framework osgGA \ + -framework osgDB \ + -framework osgText \ + -framework osgWidget + + LIBS += -framework GLUT \ + -framework Carbon \ + -framework OpenThreads \ + -framework osg \ + -framework osgViewer \ + -framework osgGA \ + -framework osgDB \ + -framework osgText \ + -framework osgWidget + } + + exists(/usr/include/osgEarth) { + message("Building support for osgEarth") + DEPENDENCIES_PRESENT += osgearth + # Include osgEarth libraries + INCLUDEPATH += -framework GDAL \ + $$IN_PWD/lib/mac32-gcc/include \ + -framework GEOS \ + -framework SQLite3 \ + -framework osgFX \ + -framework osgTerrain + + LIBS += -framework GDAL \ + -framework GEOS \ + -framework SQLite3 \ + -framework osgFX \ + -framework osgTerrain \ + DEFINES += QGC_OSGEARTH_ENABLED + } + + exists(/opt/local/include/libfreenect) { + message("Building support for libfreenect") + DEPENDENCIES_PRESENT += libfreenect + # Include libfreenect libraries + LIBS += -lfreenect + DEFINES += QGC_LIBFREENECT_ENABLED + } + + # osg/osgEarth dynamic casts might fail without this compiler option. + # see http://osgearth.org/wiki/FAQ for details. + #QMAKE_CXXFLAGS += -Wl,-E +} + +# GNU/Linux +linux-g++ { + + debug { + DESTDIR = $$BUILDDIR/debug + CONFIG += debug + } + + release { + DESTDIR = $$BUILDDIR/release + } + + QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$DESTDIR/. + + INCLUDEPATH += /usr/include \ + /usr/include/qt4/phonon + # $$BASEDIR/lib/flite/include \ + # $$BASEDIR/lib/flite/lang + + + message(Building for GNU/Linux 32bit/i386) + + LIBS += \ + -L/usr/lib \ + -lm \ + -lflite_cmu_us_kal \ + -lflite_usenglish \ + -lflite_cmulex \ + -lflite \ + -lSDL \ + -lSDLmain + + exists(/usr/include/osg) { + message("Building support for OpenSceneGraph") + DEPENDENCIES_PRESENT += osg + # Include OpenSceneGraph libraries + LIBS += -losg + DEFINES += QGC_OSG_ENABLED + } + + exists(/usr/include/osgEarth) | exists(/usr/local/include/osgEarth) { + message("Building support for osgEarth") + DEPENDENCIES_PRESENT += osgearth + # Include osgEarth libraries + LIBS += -losgViewer \ + -losgEarth \ + -losgEarthUtil + DEFINES += QGC_OSGEARTH_ENABLED + } + + exists(/usr/local/include/libfreenect/libfreenect.h) { + message("Building support for libfreenect") + DEPENDENCIES_PRESENT += libfreenect + INCLUDEPATH += /usr/include/libusb-1.0 + # Include libfreenect libraries + LIBS += -lfreenect + DEFINES += QGC_LIBFREENECT_ENABLED + } + + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/debug/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/release/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/data $$TARGETDIR/debug/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/data $$TARGETDIR/release/. + + # osg/osgEarth dynamic casts might fail without this compiler option. + # see http://osgearth.org/wiki/FAQ for details. + QMAKE_CXXFLAGS += -Wl,-E +} + +linux-g++-64 { + + debug { + DESTDIR = $$BUILDDIR/debug + CONFIG += debug + } + + release { + DESTDIR = $$BUILDDIR/release + } + + QMAKE_PRE_LINK += cp -rf $$BASEDIR/audio $$DESTDIR/. + + INCLUDEPATH += /usr/include \ + /usr/include/qt4/phonon + # $$BASEDIR/lib/flite/include \ + # $$BASEDIR/lib/flite/lang + + + # 64-bit Linux + message(Building for GNU/Linux 64bit/x64 (g++-64)) + + LIBS += \ + -L/usr/lib \ + -lm \ + -lflite_cmu_us_kal \ + -lflite_usenglish \ + -lflite_cmulex \ + -lflite \ + -lSDL \ + -lSDLmain + + exists(/usr/include/osg) { + message("Building support for OpenSceneGraph") + DEPENDENCIES_PRESENT += osg + # Include OpenSceneGraph libraries + LIBS += -losg + DEFINES += QGC_OSG_ENABLED + } + + exists(/usr/include/osgEarth) { + message("Building support for osgEarth") + DEPENDENCIES_PRESENT += osgearth + # Include osgEarth libraries + LIBS += -losgViewer \ + -losgEarth \ + -losgEarthUtil + DEFINES += QGC_OSGEARTH_ENABLED + } + + exists(/usr/local/include/libfreenect) { + message("Building support for libfreenect") + DEPENDENCIES_PRESENT += libfreenect + INCLUDEPATH += /usr/include/libusb-1.0 + # Include libfreenect libraries + LIBS += -lfreenect + DEFINES += QGC_LIBFREENECT_ENABLED + } + + # osg/osgEarth dynamic casts might fail without this compiler option. + # see http://osgearth.org/wiki/FAQ for details. + QMAKE_CXXFLAGS += -Wl,-E +} + +# Windows (32bit) +win32-msvc2008 { + + message(Building for Windows Visual Studio 2008 (32bit)) + + CONFIG += qaxcontainer + + # Special settings for debug + #CONFIG += CONSOLE + + INCLUDEPATH += $$BASEDIR/lib/sdl/msvc/include \ + $$BASEDIR/lib/opal/include \ + $$BASEDIR/lib/msinttypes + #"C:\Program Files\Microsoft SDKs\Windows\v7.0\Include" + + LIBS += -L$$BASEDIR/lib/sdl/msvc/lib \ + -lSDLmain -lSDL + +exists($$BASEDIR/lib/osg123) { +message("Building support for OSG") +DEPENDENCIES_PRESENT += osg + +# Include OpenSceneGraph and osgEarth libraries +INCLUDEPATH += $$BASEDIR/lib/osgEarth/win32/include \ + $$BASEDIR/lib/osgEarth_3rdparty/win32/OpenSceneGraph-2.8.2/include +LIBS += -L$$BASEDIR/lib/osgEarth_3rdparty/win32/OpenSceneGraph-2.8.2/lib \ + -losg \ + -losgViewer \ + -losgGA \ + -losgDB \ + -losgText \ + -lOpenThreads +DEFINES += QGC_OSG_ENABLED +exists($$BASEDIR/lib/osgEarth123) { + DEPENDENCIES_PRESENT += osgearth + message("Building support for osgEarth") + DEFINES += QGC_OSGEARTH_ENABLED + LIBS += -L$$BASEDIR/lib/osgEarth/win32/lib \ + -losgEarth \ + -losgEarthUtil +} +} + + RC_FILE = $$BASEDIR/qgroundcontrol.rc + + # Copy dependencies + QMAKE_PRE_LINK += && cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$TARGETDIR/debug/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/audio $$TARGETDIR/debug/. + + + #QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/osgEarth_3rdparty/win32/OpenSceneGraph-2.8.2/bin/osg55-osg.dll $$TARGETDIR/release/. && + #QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/osgEarth_3rdparty/win32/OpenSceneGraph-2.8.2/bin/osg55-osgViewer.dll $$TARGETDIR/release/. && + #QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/osgEarth_3rdparty/win32/OpenSceneGraph-2.8.2/bin/osg55-osgGA.dll $$TARGETDIR/release/. && + #QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/osgEarth_3rdparty/win32/OpenSceneGraph-2.8.2/bin/osg55-osgDB.dll $$TARGETDIR/release/. && + #QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/osgEarth_3rdparty/win32/OpenSceneGraph-2.8.2/bin/osg55-osgText.dll $$TARGETDIR/release/. && + #QMAKE_PRE_LINK += cp -f $$BASEDIR/lib/osgEarth_3rdparty/win32/OpenSceneGraph-2.8.2/bin/OpenThreads.dll $$TARGETDIR/release/. && + + QMAKE_PRE_LINK += && cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$TARGETDIR/release/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/audio $$TARGETDIR/release/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/debug/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/release/. + + # osg/osgEarth dynamic casts might fail without this compiler option. + # see http://osgearth.org/wiki/FAQ for details. + + # Copy google earth starter file + QMAKE_PRE_LINK += && cp -f $$BASEDIR/images/earth.html $$TARGETDIR/release/ + QMAKE_PRE_LINK += && cp -f $$BASEDIR/images/earth.html $$TARGETDIR/debug/ + +} + +# Windows (32bit) +win32-g++ { + + message(Building for Windows Platform (32bit)) + + # Special settings for debug + #CONFIG += CONSOLE + + INCLUDEPATH += $$BASEDIR/lib/sdl/include \ + $$BASEDIR/lib/opal/include #\ #\ + #"C:\Program Files\Microsoft SDKs\Windows\v7.0\Include" + + LIBS += -L$$BASEDIR/lib/sdl/win32 \ + -lmingw32 -lSDLmain -lSDL -mwindows + + + + debug { + DESTDIR = $$BUILDDIR/debug + } + + release { + DESTDIR = $$BUILDDIR/release + } + + RC_FILE = $$BASEDIR/qgroundcontrol.rc + + # Copy dependencies + debug { + QMAKE_PRE_LINK += && cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$BUILDDIR/debug/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/audio $$TARGETDIR/debug/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/debug/. + } + + release { + QMAKE_PRE_LINK += && cp -f $$BASEDIR/lib/sdl/win32/SDL.dll $$BUILDDIR/release/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/audio $$TARGETDIR/release/. + QMAKE_PRE_LINK += && cp -rf $$BASEDIR/models $$TARGETDIR/release/. + } + + # osg/osgEarth dynamic casts might fail without this compiler option. + # see http://osgearth.org/wiki/FAQ for details. + QMAKE_CXXFLAGS += -Wl,-E +} diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index d4dfc12a7f5934ec26f7b4d5ca0939343a304543..e52ae29a5752bb812912af14770b6bec863cf02f 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -30,7 +30,8 @@ QT += network \ opengl \ svg \ xml \ - phonon + phonon \ + webkit TEMPLATE = app TARGET = qgroundcontrol BASEDIR = $$IN_PWD @@ -138,7 +139,11 @@ FORMS += src/ui/MainWindow.ui \ src/ui/QGCPxImuFirmwareUpdate.ui \ src/ui/QGCDataPlot2D.ui \ src/ui/QGCRemoteControlView.ui \ - src/ui/QMap3D.ui + src/ui/QMap3D.ui \ + src/ui/QGCWebView.ui \ + src/ui/map3D/QGCGoogleEarthView.ui \ + src/ui/map3D/QGCGoogleEarthViewWin.ui \ + src/ui/map3D/QGCGoogleEarthControls.ui # src/ui/WaypointGlobalView.ui INCLUDEPATH += src \ @@ -222,16 +227,17 @@ HEADERS += src/MG.h \ src/ui/linechart/IncrementalPlot.h \ src/ui/map/Waypoint2DIcon.h \ src/ui/map/MAV2DIcon.h \ - src/ui/QGCRemoteControlView.h \ # src/ui/WaypointGlobalView.h \ + src/ui/QGCRemoteControlView.h \ src/ui/RadioCalibration/RadioCalibrationData.h \ src/ui/RadioCalibration/RadioCalibrationWindow.h \ src/ui/RadioCalibration/AirfoilServoCalibrator.h \ src/ui/RadioCalibration/SwitchCalibrator.h \ src/ui/RadioCalibration/CurveCalibrator.h \ src/ui/RadioCalibration/AbstractCalibrator.h \ - src/comm/QGCMAVLink.h - - + src/comm/QGCMAVLink.h \ + src/ui/QGCWebView.h \ + src/ui/map3D/QGCGoogleEarthView.h \ + src/ui/map3D/QGCWebPage.h contains(DEPENDENCIES_PRESENT, osg) { message("Including headers for OpenSceneGraph") @@ -242,23 +248,27 @@ contains(DEPENDENCIES_PRESENT, osg) { src/ui/map3D/QOSGWidget.h \ src/ui/map3D/PixhawkCheetahGeode.h \ src/ui/map3D/Pixhawk3DWidget.h \ - src/ui/map3D/Q3DWidgetFactory.h - -contains(DEPENDENCIES_PRESENT, osgearth) { - message("Including headers for OSGEARTH") - - # Enable only if OpenSceneGraph is available - HEADERS += src/ui/map3D/QMap3D.h -} + src/ui/map3D/Q3DWidgetFactory.h \ + src/ui/map3D/WebImageCache.h \ + src/ui/map3D/WebImage.h \ + src/ui/map3D/TextureCache.h \ + src/ui/map3D/Texture.h \ + src/ui/map3D/Imagery.h \ + src/ui/map3D/HUDScaleGeode.h \ + src/ui/map3D/WaypointGroupNode.h + contains(DEPENDENCIES_PRESENT, osgearth) { + message("Including headers for OSGEARTH") + + # Enable only if OpenSceneGraph is available + HEADERS += src/ui/map3D/QMap3D.h + } } - contains(DEPENDENCIES_PRESENT, libfreenect) { message("Including headers for libfreenect") # Enable only if libfreenect is available HEADERS += src/input/Freenect.h } - SOURCES += src/main.cc \ src/Core.cc \ src/uas/UASManager.cc \ @@ -327,39 +337,41 @@ SOURCES += src/main.cc \ src/ui/RadioCalibration/SwitchCalibrator.cc \ src/ui/RadioCalibration/CurveCalibrator.cc \ src/ui/RadioCalibration/AbstractCalibrator.cc \ - src/ui/RadioCalibration/RadioCalibrationData.cc - + src/ui/RadioCalibration/RadioCalibrationData.cc \ + src/ui/QGCWebView.cc \ + src/ui/map3D/QGCGoogleEarthView.cc \ + src/ui/map3D/QGCWebPage.cc contains(DEPENDENCIES_PRESENT, osg) { message("Including sources for OpenSceneGraph") # Enable only if OpenSceneGraph is available SOURCES += src/ui/map3D/Q3DWidget.cc \ - src/ui/map3D/ImageWindowGeode.cc \ - src/ui/map3D/GCManipulator.cc \ - src/ui/map3D/QOSGWidget.cc \ + src/ui/map3D/ImageWindowGeode.cc \ + src/ui/map3D/GCManipulator.cc \ + src/ui/map3D/QOSGWidget.cc \ src/ui/map3D/PixhawkCheetahGeode.cc \ src/ui/map3D/Pixhawk3DWidget.cc \ - src/ui/map3D/Q3DWidgetFactory.cc - - - -contains(DEPENDENCIES_PRESENT, osgearth) { - message("Including sources for osgEarth") - - # Enable only if OpenSceneGraph is available - SOURCES += src/ui/map3D/QMap3D.cc - -} + src/ui/map3D/Q3DWidgetFactory.cc \ + src/ui/map3D/WebImageCache.cc \ + src/ui/map3D/WebImage.cc \ + src/ui/map3D/TextureCache.cc \ + src/ui/map3D/Texture.cc \ + src/ui/map3D/Imagery.cc \ + src/ui/map3D/HUDScaleGeode.cc \ + src/ui/map3D/WaypointGroupNode.cc + contains(DEPENDENCIES_PRESENT, osgearth) { + message("Including sources for osgEarth") + + # Enable only if OpenSceneGraph is available + SOURCES += src/ui/map3D/QMap3D.cc + } } - -contains(DEPENDENCIES_PRESENT, libfreenect) { +contains(DEPENDENCIES_PRESENT, libfreenect) { message("Including sources for libfreenect") - + # Enable only if libfreenect is available SOURCES += src/input/Freenect.cc } - - RESOURCES += mavground.qrc # Include RT-LAB Library diff --git a/src/GAudioOutput.cc b/src/GAudioOutput.cc index b2c3858da4996b4b640f055f7910202fe7971a99..2bdf16ab834b9bcde71f85724278b6440b76bfaf 100644 --- a/src/GAudioOutput.cc +++ b/src/GAudioOutput.cc @@ -41,7 +41,7 @@ This file is part of the QGROUNDCONTROL project #endif // Speech synthesis is only supported with MSVC compiler -#if _MSC_VER +#if _MSC_VER2 // Documentation: http://msdn.microsoft.com/en-us/library/ee125082%28v=VS.85%29.aspx #define _ATL_APARTMENT_THREADED @@ -93,7 +93,7 @@ emergency(false) flite_init(); #endif - #if _MSC_VER + #if _MSC_VER2 ISpVoice * pVoice = NULL; if (FAILED(::CoInitialize(NULL))) @@ -134,7 +134,7 @@ emergency(false) GAudioOutput::~GAudioOutput() { -#ifdef _MSC_VER +#ifdef _MSC_VER2 ::CoUninitialize(); #endif } diff --git a/src/Waypoint.cc b/src/Waypoint.cc index d84b76ecfa7636af9fc63acb6408ace5094a2d91..7a1c295b977927584620afac41c69a680da57aa7 100644 --- a/src/Waypoint.cc +++ b/src/Waypoint.cc @@ -40,12 +40,12 @@ Waypoint::Waypoint(quint16 _id, float _x, float _y, float _z, float _yaw, bool _ y(_y), z(_z), yaw(_yaw), + frame(_frame), + action(_action), autocontinue(_autocontinue), current(_current), orbit(_orbit), - holdTime(_holdTime), - frame(_frame), - action(_action) + holdTime(_holdTime) { } diff --git a/src/comm/MAVLinkProtocol.cc b/src/comm/MAVLinkProtocol.cc index 741c2bb7b51dcecef51fc82663e29aa3f365fe61..ef2e0d790619a34ba4e1491c1a1123a4ef84e518 100644 --- a/src/comm/MAVLinkProtocol.cc +++ b/src/comm/MAVLinkProtocol.cc @@ -258,7 +258,7 @@ void MAVLinkProtocol::receiveBytes(LinkInterface* link, QByteArray b) //if () // If a new loss was detected or we just hit one 128th packet step - if (lastLoss != totalLossCounter || (totalReceiveCounter == 128)) + if (lastLoss != totalLossCounter || (totalReceiveCounter % 64 == 0)) { // Calculate new loss ratio // Receive loss @@ -325,6 +325,8 @@ void MAVLinkProtocol::sendMessage(LinkInterface* link, mavlink_message_t message { // Create buffer uint8_t buffer[MAVLINK_MAX_PACKET_LEN]; + // Rewriting header to ensure correct link ID is set + if (link->getId() != 0) mavlink_finalize_message_chan(&message, this->getSystemId(), this->getComponentId(), link->getId(), message.len); // Write message into buffer, prepending start sign int len = mavlink_msg_to_send_buffer(buffer, &message); // If link is connected diff --git a/src/comm/MAVLinkSimulationLink.cc b/src/comm/MAVLinkSimulationLink.cc index 56337c48a7f64a48a16750e311597d68ad23ea8f..6d6ecf93579c3a6044ddc80ea6b8787850df0033 100644 --- a/src/comm/MAVLinkSimulationLink.cc +++ b/src/comm/MAVLinkSimulationLink.cc @@ -99,12 +99,6 @@ MAVLinkSimulationLink::MAVLinkSimulationLink(QString readFile, QString writeFile // Open packet log mavlinkLogFile = new QFile(MAVLinkProtocol::getLogfileName()); mavlinkLogFile->open(QIODevice::ReadOnly); - - // position at Pixhawk lab @ ETHZ - x = 5247273.0f; - y = 465955.0f; - z = -0.2f; - yaw = 0; } MAVLinkSimulationLink::~MAVLinkSimulationLink() @@ -383,15 +377,14 @@ void MAVLinkSimulationLink::mainloop() x = x*0.93f + 0.07f*(x+sin(static_cast<float>(QGC::groundTimeUsecs()) * 0.08f)); y = y*0.93f + 0.07f*(y+sin(static_cast<float>(QGC::groundTimeUsecs()) * 0.5f)); z = z*0.93f + 0.07f*(z+sin(static_cast<float>(QGC::groundTimeUsecs()*0.001f)) * 0.1f); - x = 5247273.0f; - y = 465955.0f; -// x = (x > 5.0f) ? 5.0f : x; -// y = (y > 5.0f) ? 5.0f : y; -// z = (z > 3.0f) ? 3.0f : z; -// -// x = (x < -5.0f) ? -5.0f : x; -// y = (y < -5.0f) ? -5.0f : y; -// z = (z < -3.0f) ? -3.0f : z; + + x = (x > 5.0f) ? 5.0f : x; + y = (y > 5.0f) ? 5.0f : y; + z = (z > 3.0f) ? 3.0f : z; + + x = (x < -5.0f) ? -5.0f : x; + y = (y < -5.0f) ? -5.0f : y; + z = (z < -3.0f) ? -3.0f : z; // Send back new setpoint mavlink_message_t ret; @@ -409,14 +402,14 @@ void MAVLinkSimulationLink::mainloop() streampointer += bufferlength; // GPS RAW - mavlink_msg_gps_raw_pack(systemId, componentId, &ret, 0, 3, 47.376417+(x*0.001), 8.548103+(y*0.001), z, 0, 0, 2.5f, 0.1f); + mavlink_msg_gps_raw_pack(systemId, componentId, &ret, 0, 3, 47.376417+(x*0.00001), 8.548103+(y*0.00001), z, 0, 0, 2.5f, 0.1f); bufferlength = mavlink_msg_to_send_buffer(buffer, &ret); //add data into datastream memcpy(stream+streampointer,buffer, bufferlength); streampointer += bufferlength; // GLOBAL POSITION - mavlink_msg_global_position_pack(systemId, componentId, &ret, 0, 3, 47.376417+(x*0.001), 8.548103+(y*0.001), z, 0, 0); + mavlink_msg_global_position_pack(systemId, componentId, &ret, 0, 47.378028137103+(x*0.00001), 8.54899892510421+(y*0.00001), z, 0, 0, 0); bufferlength = mavlink_msg_to_send_buffer(buffer, &ret); //add data into datastream memcpy(stream+streampointer,buffer, bufferlength); diff --git a/src/comm/MAVLinkXMLParser.cc b/src/comm/MAVLinkXMLParser.cc index 3d7068a261753bd68c0c2f670b5dc6551c008d2a..8c2e6df1efc04f89a322b488c6134c3702b62dac 100644 --- a/src/comm/MAVLinkXMLParser.cc +++ b/src/comm/MAVLinkXMLParser.cc @@ -341,7 +341,8 @@ bool MAVLinkXMLParser::generate() QString decode("static inline void mavlink_msg_%1_decode(const mavlink_message_t* msg, %2* %1)\n{\n%3}\n"); QString pack("static inline uint16_t mavlink_msg_%1_pack(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg%2)\n{\n\tuint16_t i = 0;\n\tmsg->msgid = MAVLINK_MSG_ID_%3;\n\n%4\n\treturn mavlink_finalize_message(msg, system_id, component_id, i);\n}\n\n"); - QString compactSend("#ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS\n\nstatic inline void mavlink_msg_%3_send(%1 chan%5)\n{\n\t%2 msg;\n\tmavlink_msg_%3_pack(mavlink_system.sysid, mavlink_system.compid, &msg%4);\n\tmavlink_send_uart(chan, &msg);\n}\n\n#endif"); + QString packChan("static inline uint16_t mavlink_msg_%1_pack_chan(uint8_t system_id, uint8_t component_id, uint8_t chan, mavlink_message_t* msg%2)\n{\n\tuint16_t i = 0;\n\tmsg->msgid = MAVLINK_MSG_ID_%3;\n\n%4\n\treturn mavlink_finalize_message_chan(msg, system_id, component_id, chan, i);\n}\n\n"); + QString compactSend("#ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS\n\nstatic inline void mavlink_msg_%3_send(%1 chan%5)\n{\n\t%2 msg;\n\tmavlink_msg_%3_pack_chan(mavlink_system.sysid, mavlink_system.compid, chan, &msg%4);\n\tmavlink_send_uart(chan, &msg);\n}\n\n#endif"); //QString compactStructSend = "#ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS\n\nstatic inline void mavlink_msg_%3_struct_send(%1 chan%5)\n{\n\t%2 msg;\n\tmavlink_msg_%3_encode(mavlink_system.sysid, mavlink_system.compid, &msg%4);\n\tmavlink_send_uart(chan, &msg);\n}\n\n#endif"; QString unpacking; QString prepends; @@ -506,10 +507,11 @@ bool MAVLinkXMLParser::generate() cStruct = cStruct.arg(cStructName, cStructLines); lcmStructDefs.append("\n").append(cStruct).append("\n"); pack = pack.arg(messageName, packParameters, messageName.toUpper(), packLines); + packChan = packChan.arg(messageName, packParameters, messageName.toUpper(), packLines); encode = encode.arg(messageName).arg(cStructName).arg(packArguments); decode = decode.arg(messageName).arg(cStructName).arg(decodeLines); compactSend = compactSend.arg(channelType, messageType, messageName, sendArguments, packParameters); - QString cFile = "// MESSAGE " + messageName.toUpper() + " PACKING\n\n" + idDefine + "\n\n" + cStruct + "\n\n" + arrayDefines + "\n\n" + commentContainer.arg(messageName.toLower(), commentLines) + pack + encode + "\n" + compactSend + "\n" + "// MESSAGE " + messageName.toUpper() + " UNPACKING\n\n" + unpacking + decode; + QString cFile = "// MESSAGE " + messageName.toUpper() + " PACKING\n\n" + idDefine + "\n\n" + cStruct + "\n\n" + arrayDefines + "\n\n" + commentContainer.arg(messageName.toLower(), commentLines) + pack + packChan + encode + "\n" + compactSend + "\n" + "// MESSAGE " + messageName.toUpper() + " UNPACKING\n\n" + unpacking + decode; cFiles.append(qMakePair(QString("mavlink_msg_%1.h").arg(messageName), cFile)); } // Check if tag = message } // Check if e = NULL diff --git a/src/input/Freenect.cc b/src/input/Freenect.cc index a60f094f8600eb7f53eacdb6d13c002338a71132..90cb5e06bd4b5fc05d2724c8138ab3dcfaa14eed 100644 --- a/src/input/Freenect.cc +++ b/src/input/Freenect.cc @@ -1,20 +1,104 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL 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. + + QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. + +======================================================================*/ + +/** + * @file + * @brief Definition of the class Freenect. + * + * @author Lionel Heng <hengli@student.ethz.ch> + * + */ + #include "Freenect.h" #include <cmath> #include <string.h> -#include <QDebug> Freenect::Freenect() : context(NULL) , device(NULL) , tiltAngle(0) { + // default rgb camera parameters + rgbCameraParameters.cx = 3.2894272028759258e+02; + rgbCameraParameters.cy = 2.6748068171871557e+02; + rgbCameraParameters.fx = 5.2921508098293293e+02; + rgbCameraParameters.fy = 5.2556393630057437e+02; + rgbCameraParameters.k[0] = 2.6451622333009589e-01; + rgbCameraParameters.k[1] = -8.3990749424620825e-01; + rgbCameraParameters.k[2] = -1.9922302173693159e-03; + rgbCameraParameters.k[3] = 1.4371995932897616e-03; + rgbCameraParameters.k[4] = 9.1192465078713847e-01; + + // default depth camera parameters + depthCameraParameters.cx = 3.3930780975300314e+02; + depthCameraParameters.cy = 2.4273913761751615e+02; + depthCameraParameters.fx = 5.9421434211923247e+02; + depthCameraParameters.fy = 5.9104053696870778e+02; + depthCameraParameters.k[0] = -2.6386489753128833e-01; + depthCameraParameters.k[1] = 9.9966832163729757e-01; + depthCameraParameters.k[2] = -7.6275862143610667e-04; + depthCameraParameters.k[3] = 5.0350940090814270e-03; + depthCameraParameters.k[4] = -1.3053628089976321e+00; + + // relative rotation/translation between cameras with depth camera as reference + transformMatrix = QMatrix4x4(9.9984628826577793e-01, 1.2635359098409581e-03, + -1.7487233004436643e-02, 1.9985242312092553e-02, + -1.4779096108364480e-03, 9.9992385683542895e-01, + -1.2251380107679535e-02, -7.4423738761617583e-04, + 1.7470421412464927e-02, 1.2275341476520762e-02, + 9.9977202419716948e-01, -1.0916736334336222e-02, + 0.0, 0.0, 0.0, 1.0); + + // relative rotation/translation between cameras with rgb camera as reference + transformMatrix = transformMatrix.transposed(); + + // populate gamma lookup table for (int i = 0; i < 2048; ++i) { float v = static_cast<float>(i) / 2048.0f; v = powf(v, 3.0f) * 6.0f; gammaTable[i] = static_cast<unsigned short>(v * 6.0f * 256.0f); } + + // populate depth projection matrix + for (int i = 0; i < FREENECT_FRAME_H; ++i) + { + for (int j = 0; j < FREENECT_FRAME_W; ++j) + { + QVector2D originalPoint(j, i); + QVector2D rectifiedPoint; + rectifyPoint(originalPoint, rectifiedPoint, depthCameraParameters); + + QVector3D rectifiedRay; + projectPixelTo3DRay(rectifiedPoint, rectifiedRay, depthCameraParameters); + + depthProjectionMatrix[i * FREENECT_FRAME_W + j] = rectifiedRay; + + rectifyPoint(originalPoint, rectifiedPoint, rgbCameraParameters); + rgbRectificationMap[i * FREENECT_FRAME_W + j] = rectifiedPoint; + } + } } Freenect::~Freenect() @@ -22,7 +106,7 @@ Freenect::~Freenect() if (device != NULL) { freenect_stop_depth(device); - freenect_stop_rgb(device); + freenect_stop_video(device); } freenect_close_device(device); @@ -52,8 +136,8 @@ Freenect::init(int userDeviceNumber) freenect_set_user(device, this); - memset(rgb, 0, FREENECT_RGB_SIZE); - memset(depth, 0, FREENECT_DEPTH_SIZE); + memset(rgb, 0, FREENECT_VIDEO_RGB_SIZE); + memset(depth, 0, FREENECT_DEPTH_11BIT_SIZE); // set Kinect parameters if (freenect_set_tilt_degs(device, tiltAngle) != 0) @@ -64,22 +148,22 @@ Freenect::init(int userDeviceNumber) { return false; } - if (freenect_set_rgb_format(device, FREENECT_FORMAT_RGB) != 0) + if (freenect_set_video_format(device, FREENECT_VIDEO_RGB) != 0) { return false; } - if (freenect_set_depth_format(device, FREENECT_FORMAT_11_BIT) != 0) + if (freenect_set_depth_format(device, FREENECT_DEPTH_11BIT) != 0) { return false; } - freenect_set_rgb_callback(device, rgbCallback); + freenect_set_video_callback(device, videoCallback); freenect_set_depth_callback(device, depthCallback); - if (freenect_start_rgb(device) != 0) + if (freenect_start_depth(device) != 0) { return false; } - if (freenect_start_depth(device) != 0) + if (freenect_start_video(device) != 0) { return false; } @@ -98,8 +182,10 @@ Freenect::process(void) return false; } - freenect_get_raw_accel(device, &ax, &ay, &az); - freenect_get_mks_accel(device, &dx, &dy, &dz); + freenect_raw_tilt_state* state; + freenect_update_tilt_state(device); + state = freenect_get_tilt_state(device); + freenect_get_mks_accel(state, &ax, &ay, &az); return true; } @@ -109,7 +195,7 @@ Freenect::getRgbData(void) { QMutexLocker locker(&rgbMutex); return QSharedPointer<QByteArray>( - new QByteArray(rgb, FREENECT_RGB_SIZE)); + new QByteArray(rgb, FREENECT_VIDEO_RGB_SIZE)); } QSharedPointer<QByteArray> @@ -117,24 +203,86 @@ Freenect::getRawDepthData(void) { QMutexLocker locker(&depthMutex); return QSharedPointer<QByteArray>( - new QByteArray(depth, FREENECT_DEPTH_SIZE)); + new QByteArray(depth, FREENECT_DEPTH_11BIT_SIZE)); } QSharedPointer<QByteArray> -Freenect::getDistanceData(void) +Freenect::getColoredDepthData(void) { - QMutexLocker locker(&distanceMutex); + QMutexLocker locker(&coloredDepthMutex); return QSharedPointer<QByteArray>( - new QByteArray(reinterpret_cast<char *>(distance), - FREENECT_FRAME_PIX * sizeof(float))); + new QByteArray(coloredDepth, FREENECT_VIDEO_RGB_SIZE)); } -QSharedPointer<QByteArray> -Freenect::getColoredDepthData(void) +QVector<QVector3D> +Freenect::get3DPointCloudData(void) { - QMutexLocker locker(&coloredDepthMutex); - return QSharedPointer<QByteArray>( - new QByteArray(coloredDepth, FREENECT_RGB_SIZE)); + QMutexLocker locker(&depthMutex); + + QVector<QVector3D> pointCloud; + + unsigned short* data = reinterpret_cast<unsigned short*>(depth); + for (int i = 0; i < FREENECT_FRAME_PIX; ++i) + { + if (data[i] > 0 && data[i] <= 2048) + { + // see www.ros.org/wiki/kinect_node for details + double range = 1.0f / (-0.00307f * static_cast<float>(data[i]) + 3.33f); + + if (range > 0.0f) + { + QVector3D ray = depthProjectionMatrix[i]; + ray *= range; + + pointCloud.push_back(QVector3D(ray.x(), ray.y(), ray.z())); + } + } + } + + return pointCloud; +} + +QVector<Freenect::Vector6D> +Freenect::get6DPointCloudData(void) +{ + QVector<QVector3D> rawPointCloud = get3DPointCloudData(); + + QVector<Freenect::Vector6D> pointCloud; + + for (int i = 0; i < rawPointCloud.size(); ++i) + { + Vector6D point; + + point.x = rawPointCloud.at(i).x(); + point.y = rawPointCloud.at(i).y(); + point.z = rawPointCloud.at(i).z(); + + QVector4D transformedPoint = transformMatrix * QVector4D(point.x, point.y, point.z, 1.0); + + float iz = 1.0 / transformedPoint.z(); + QVector2D rectifiedPoint(transformedPoint.x() * iz * rgbCameraParameters.fx + rgbCameraParameters.cx, + transformedPoint.y() * iz * rgbCameraParameters.fy + rgbCameraParameters.cy); + + QVector2D originalPoint; + unrectifyPoint(rectifiedPoint, originalPoint, rgbCameraParameters); + + if (originalPoint.x() >= 0.0 && originalPoint.x() < FREENECT_FRAME_W && + originalPoint.y() >= 0.0 && originalPoint.y() < FREENECT_FRAME_H) + { + int x = static_cast<int>(originalPoint.x()); + int y = static_cast<int>(originalPoint.y()); + unsigned char* pixel = reinterpret_cast<unsigned char*>(rgb) + + (y * FREENECT_FRAME_W + x) * 3; + + point.r = pixel[0]; + point.g = pixel[1]; + point.b = pixel[2]; + + pointCloud.push_back(point); + } + } + + return pointCloud; } int @@ -174,29 +322,82 @@ Freenect::FreenectThread::run(void) } void -Freenect::rgbCallback(freenect_device* device, freenect_pixel* rgb, uint32_t timestamp) +Freenect::rectifyPoint(const QVector2D& originalPoint, + QVector2D& rectifiedPoint, + const IntrinsicCameraParameters& params) +{ + double x = (originalPoint.x() - params.cx) / params.fx; + double y = (originalPoint.y() - params.cy) / params.fy; + + double x0 = x; + double y0 = y; + + // eliminate lens distortion iteratively + for (int i = 0; i < 4; ++i) + { + double r2 = x * x + y * y; + + // tangential distortion vector [dx dy] + double dx = 2 * params.k[2] * x * y + params.k[3] * (r2 + 2 * x * x); + double dy = params.k[2] * (r2 + 2 * y * y) + 2 * params.k[3] * x * y; + + double icdist = 1.0 / (1.0 + r2 * (params.k[0] + r2 * (params.k[1] + r2 * params.k[4]))); + x = (x0 - dx) * icdist; + y = (y0 - dy) * icdist; + } + + rectifiedPoint.setX(x * params.fx + params.cx); + rectifiedPoint.setY(y * params.fy + params.cy); +} + +void +Freenect::unrectifyPoint(const QVector2D& rectifiedPoint, + QVector2D& originalPoint, + const IntrinsicCameraParameters& params) +{ + double x = (rectifiedPoint.x() - params.cx) / params.fx; + double y = (rectifiedPoint.y() - params.cy) / params.fy; + + double r2 = x * x + y * y; + + // tangential distortion vector [dx dy] + double dx = 2 * params.k[2] * x * y + params.k[3] * (r2 + 2 * x * x); + double dy = params.k[2] * (r2 + 2 * y * y) + 2 * params.k[3] * x * y; + + double cdist = 1.0 + r2 * (params.k[0] + r2 * (params.k[1] + r2 * params.k[4])); + x = x * cdist + dx; + y = y * cdist + dy; + + originalPoint.setX(x * params.fx + params.cx); + originalPoint.setY(y * params.fy + params.cy); +} + +void +Freenect::projectPixelTo3DRay(const QVector2D& pixel, QVector3D& ray, + const IntrinsicCameraParameters& params) +{ + ray.setX((pixel.x() - params.cx) / params.fx); + ray.setY((pixel.y() - params.cy) / params.fy); + ray.setZ(1.0); +} + +void +Freenect::videoCallback(freenect_device* device, void* video, uint32_t timestamp) { Freenect* freenect = static_cast<Freenect *>(freenect_get_user(device)); QMutexLocker locker(&freenect->rgbMutex); - memcpy(freenect->rgb, rgb, FREENECT_RGB_SIZE); + memcpy(freenect->rgb, video, FREENECT_VIDEO_RGB_SIZE); } void -Freenect::depthCallback(freenect_device* device, freenect_depth* depth, uint32_t timestamp) +Freenect::depthCallback(freenect_device* device, void* depth, uint32_t timestamp) { Freenect* freenect = static_cast<Freenect *>(freenect_get_user(device)); - freenect_depth* data = reinterpret_cast<freenect_depth *>(depth); + uint16_t* data = reinterpret_cast<uint16_t *>(depth); QMutexLocker depthLocker(&freenect->depthMutex); - memcpy(freenect->depth, data, FREENECT_DEPTH_SIZE); - - QMutexLocker distanceLocker(&freenect->distanceMutex); - for (int i = 0; i < FREENECT_FRAME_PIX; ++i) - { - freenect->distance[i] = - 100.f / (-0.00307f * static_cast<float>(data[i]) + 3.33f); - } + memcpy(freenect->depth, data, FREENECT_DEPTH_11BIT_SIZE); QMutexLocker coloredDepthLocker(&freenect->coloredDepthMutex); unsigned short* src = reinterpret_cast<unsigned short *>(data); diff --git a/src/input/Freenect.h b/src/input/Freenect.h index e3e3925c5cfd732419f606343fae38bf6378010c..88b91550253f1f5edbaf017d0f38c876229e689b 100644 --- a/src/input/Freenect.h +++ b/src/input/Freenect.h @@ -1,11 +1,46 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL 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. + + QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. + +======================================================================*/ + +/** + * @file + * @brief Definition of the class Freenect. + * + * @author Lionel Heng <hengli@student.ethz.ch> + * + */ + #ifndef FREENECT_H #define FREENECT_H -#include <libfreenect.h> +#include <libfreenect/libfreenect.h> +#include <QMatrix4x4> #include <QMutex> #include <QScopedPointer> #include <QSharedPointer> #include <QThread> +#include <QVector> +#include <QVector2D> +#include <QVector3D> class Freenect { @@ -18,15 +53,50 @@ public: QSharedPointer<QByteArray> getRgbData(void); QSharedPointer<QByteArray> getRawDepthData(void); - QSharedPointer<QByteArray> getDistanceData(void); QSharedPointer<QByteArray> getColoredDepthData(void); + QVector<QVector3D> get3DPointCloudData(void); + + typedef struct + { + double x; + double y; + double z; + unsigned char r; + unsigned char g; + unsigned char b; + } Vector6D; + QVector<Vector6D> get6DPointCloudData(void); int getTiltAngle(void) const; void setTiltAngle(int angle); private: - static void rgbCallback(freenect_device* device, freenect_pixel* rgb, uint32_t timestamp); - static void depthCallback(freenect_device* device, freenect_depth* depth, uint32_t timestamp); + typedef struct + { + // coordinates of principal point + double cx; + double cy; + + // focal length in pixels + double fx; + double fy; + + // distortion parameters + double k[5]; + + } IntrinsicCameraParameters; + + void rectifyPoint(const QVector2D& originalPoint, + QVector2D& rectifiedPoint, + const IntrinsicCameraParameters& params); + void unrectifyPoint(const QVector2D& rectifiedPoint, + QVector2D& originalPoint, + const IntrinsicCameraParameters& params); + void projectPixelTo3DRay(const QVector2D& pixel, QVector3D& ray, + const IntrinsicCameraParameters& params); + + static void videoCallback(freenect_device* device, void* video, uint32_t timestamp); + static void depthCallback(freenect_device* device, void* depth, uint32_t timestamp); freenect_context* context; freenect_device* device; @@ -43,28 +113,33 @@ private: }; QScopedPointer<FreenectThread> thread; + IntrinsicCameraParameters rgbCameraParameters; + IntrinsicCameraParameters depthCameraParameters; + + QMatrix4x4 transformMatrix; + // tilt angle of Kinect camera int tiltAngle; // rgbd data - char rgb[FREENECT_RGB_SIZE]; + char rgb[FREENECT_VIDEO_RGB_SIZE]; QMutex rgbMutex; - char depth[FREENECT_DEPTH_SIZE]; + char depth[FREENECT_DEPTH_11BIT_SIZE]; QMutex depthMutex; - float distance[FREENECT_FRAME_PIX]; - QMutex distanceMutex; - - char coloredDepth[FREENECT_RGB_SIZE]; + char coloredDepth[FREENECT_VIDEO_RGB_SIZE]; QMutex coloredDepthMutex; // accelerometer data - short ax, ay, az; + double ax, ay, az; double dx, dy, dz; // gamma map unsigned short gammaTable[2048]; + + QVector3D depthProjectionMatrix[FREENECT_FRAME_PIX]; + QVector2D rgbRectificationMap[FREENECT_FRAME_PIX]; }; #endif // FREENECT_H diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index 30ce495af6d0a4789524eca8e1677197d69fd0bb..5b9366cd38a448780bfd28b797c4db5dfac8c883 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -73,12 +73,15 @@ UAS::UAS(MAVLinkProtocol* protocol, int id) : UASInterface(), sendDropRate(0), lowBattAlarm(false), positionLock(false), - localX(0), - localY(0), - localZ(0), - roll(0), - pitch(0), - yaw(0), + localX(0.0), + localY(0.0), + localZ(0.0), + latitude(0.0), + longitude(0.0), + altitude(0.0), + roll(0.0), + pitch(0.0), + yaw(0.0), statusTimeout(new QTimer(this)) { color = UASInterface::getNextColor(); @@ -243,7 +246,7 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) } // COMMUNICATIONS DROP RATE - emit dropRateChanged(this->getUASID(), state.packet_drop); + emit dropRateChanged(this->getUASID(), state.packet_drop/1000.0f); //qDebug() << __FILE__ << __LINE__ << "RCV LOSS: " << state.packet_drop; // AUDIO @@ -342,6 +345,9 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) mavlink_global_position_t pos; mavlink_msg_global_position_decode(&message, &pos); quint64 time = getUnixTime(pos.usec); + latitude = pos.lat; + longitude = pos.lon; + altitude = pos.alt; emit valueChanged(uasId, "lat", pos.lat, time); emit valueChanged(uasId, "lon", pos.lon, time); emit valueChanged(uasId, "alt", pos.alt, time); @@ -559,22 +565,22 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) emit textMessageReceived(uasId, message.compid, severity, text); } break; -#ifdef MAVLINK_ENABLED_PIXHAWK - case MAVLINK_MSG_ID_POINT_OF_INTEREST: - { - mavlink_point_of_interest_t poi; - mavlink_msg_point_of_interest_decode(&message, &poi); - emit poiFound(this, poi.type, poi.color, QString((QChar*)poi.name, MAVLINK_MSG_POINT_OF_INTEREST_FIELD_NAME_LEN), poi.x, poi.y, poi.z); - } - break; - case MAVLINK_MSG_ID_POINT_OF_INTEREST_CONNECTION: - { - mavlink_point_of_interest_connection_t poi; - mavlink_msg_point_of_interest_connection_decode(&message, &poi); - emit poiConnectionFound(this, poi.type, poi.color, QString((QChar*)poi.name, MAVLINK_MSG_POINT_OF_INTEREST_CONNECTION_FIELD_NAME_LEN), poi.x1, poi.y1, poi.z1, poi.x2, poi.y2, poi.z2); - } - break; -#endif +//#ifdef MAVLINK_ENABLED_PIXHAWK +// case MAVLINK_MSG_ID_POINT_OF_INTEREST: +// { +// mavlink_point_of_interest_t poi; +// mavlink_msg_point_of_interest_decode(&message, &poi); +// emit poiFound(this, poi.type, poi.color, QString((QChar*)poi.name, MAVLINK_MSG_POINT_OF_INTEREST_FIELD_NAME_LEN), poi.x, poi.y, poi.z); +// } +// break; +// case MAVLINK_MSG_ID_POINT_OF_INTEREST_CONNECTION: +// { +// mavlink_point_of_interest_connection_t poi; +// mavlink_msg_point_of_interest_connection_decode(&message, &poi); +// emit poiConnectionFound(this, poi.type, poi.color, QString((QChar*)poi.name, MAVLINK_MSG_POINT_OF_INTEREST_CONNECTION_FIELD_NAME_LEN), poi.x1, poi.y1, poi.z1, poi.x2, poi.y2, poi.z2); +// } +// break; +//#endif #ifdef MAVLINK_ENABLED_UALBERTA case MAVLINK_MSG_ID_NAV_FILTER_BIAS: { @@ -776,6 +782,7 @@ void UAS::sendMessage(LinkInterface* link, mavlink_message_t message) uint8_t buffer[MAVLINK_MAX_PACKET_LEN]; // Write message into buffer, prepending start sign int len = mavlink_msg_to_send_buffer(buffer, &message); + mavlink_finalize_message_chan(&message, mavlink->getSystemId(), mavlink->getComponentId(), link->getId(), message.len); // If link is connected if (link->isConnected()) { diff --git a/src/uas/UAS.h b/src/uas/UAS.h index da8c44c0e8a4645a19e1e6f84139f5676a5fa64b..c30c85b2756ba10a6f9d42ffb5ad3dd3ccd20add 100644 --- a/src/uas/UAS.h +++ b/src/uas/UAS.h @@ -82,6 +82,9 @@ public: double getLocalX() const { return localX; }; double getLocalY() const { return localY; }; double getLocalZ() const { return localZ; }; + double getLatitude() const { return latitude; }; + double getLongitude() const { return longitude; }; + double getAltitude() const { return altitude; }; double getRoll() const { return roll; }; double getPitch() const { return pitch; }; @@ -139,6 +142,9 @@ protected: double localX; double localY; double localZ; + double latitude; + double longitude; + double altitude; double roll; double pitch; double yaw; diff --git a/src/uas/UASInterface.h b/src/uas/UASInterface.h index b4b348d9591c9ebb69cea986b8ce3694d4948ec4..32825bc5b49f1504ed07b3a8f34de460634e35bb 100644 --- a/src/uas/UASInterface.h +++ b/src/uas/UASInterface.h @@ -70,6 +70,10 @@ public: virtual double getLocalY() const = 0; virtual double getLocalZ() const = 0; + virtual double getLatitude() const = 0; + virtual double getLongitude() const = 0; + virtual double getAltitude() const = 0; + virtual double getRoll() const = 0; virtual double getPitch() const = 0; virtual double getYaw() const = 0; diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 87f7b5a987d5827dbc268f6d1decf4c4fa523ea8..b053b35c4b00f17401ef424023b95615d7ae0246 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -1,24 +1,4 @@ -/*===================================================================== - -QGroundControl Open Source Ground Control Station - -(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> - -This file is part of the QGROUNDCONTROL project - - QGROUNDCONTROL 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. - - QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. - +/*=================================================================== ======================================================================*/ /** @@ -135,13 +115,16 @@ void MainWindow::buildWidgets() mapWidget = new MapWidget(this); protocolWidget = new XMLCommProtocolWidget(this); dataplotWidget = new QGCDataPlot2D(this); - #ifdef QGC_OSG_ENABLED +#ifdef QGC_OSG_ENABLED _3DWidget = Q3DWidgetFactory::get("PIXHAWK"); - #endif +#endif #ifdef QGC_OSGEARTH_ENABLED _3DMapWidget = Q3DWidgetFactory::get("MAP3D"); #endif +#if (defined Q_OS_WIN) | (defined Q_OS_MAC) + gEarthWidget = new QGCGoogleEarthView(this); +#endif // Dock widgets controlDockWidget = new QDockWidget(tr("Control"), this); @@ -233,12 +216,15 @@ void MainWindow::arrangeCenterStack() if (linechartWidget) centerStack->addWidget(linechartWidget); if (protocolWidget) centerStack->addWidget(protocolWidget); if (mapWidget) centerStack->addWidget(mapWidget); - #ifdef QGC_OSG_ENABLED +#ifdef QGC_OSG_ENABLED if (_3DWidget) centerStack->addWidget(_3DWidget); #endif - #ifdef QGC_OSGEARTH_ENABLED +#ifdef QGC_OSGEARTH_ENABLED if (_3DMapWidget) centerStack->addWidget(_3DMapWidget); - #endif +#endif +#if (defined Q_OS_WIN) | (defined Q_OS_MAC) + if (gEarthWidget) centerStack->addWidget(gEarthWidget); +#endif if (hudWidget) centerStack->addWidget(hudWidget); if (dataplotWidget) centerStack->addWidget(dataplotWidget); @@ -378,8 +364,17 @@ void MainWindow::connectActions() connect(ui.actionPilotView, SIGNAL(triggered()), this, SLOT(loadPilotView())); connect(ui.actionEngineerView, SIGNAL(triggered()), this, SLOT(loadEngineerView())); connect(ui.actionOperatorView, SIGNAL(triggered()), this, SLOT(loadOperatorView())); +#ifdef QGC_OSG_ENABLED connect(ui.action3DView, SIGNAL(triggered()), this, SLOT(load3DView())); +#else + ui.menuWindow->removeAction(ui.action3DView); +#endif + +#ifdef QGC_OSGEARTH_ENABLED connect(ui.action3DMapView, SIGNAL(triggered()), this, SLOT(load3DMapView())); +#else + ui.menuWindow->removeAction(ui.action3DMapView); +#endif connect(ui.actionShow_full_view, SIGNAL(triggered()), this, SLOT(loadAllView())); connect(ui.actionShow_MAVLink_view, SIGNAL(triggered()), this, SLOT(loadMAVLinkView())); connect(ui.actionShow_data_analysis_view, SIGNAL(triggered()), this, SLOT(loadDataView())); @@ -388,6 +383,11 @@ void MainWindow::connectActions() connect(ui.actionOnline_documentation, SIGNAL(triggered()), this, SLOT(showHelp())); connect(ui.actionCredits_Developers, SIGNAL(triggered()), this, SLOT(showCredits())); connect(ui.actionProject_Roadmap, SIGNAL(triggered()), this, SLOT(showRoadMap())); +#if (defined Q_OS_WIN) | (defined Q_OS_MAC) + connect(ui.actionGoogleEarthView, SIGNAL(triggered()), this, SLOT(loadGoogleEarthView())); +#else + ui.menuWindow->removeAction(ui.actionGoogleEarthView); +#endif // Joystick configuration connect(ui.actionJoystickSettings, SIGNAL(triggered()), this, SLOT(configure())); @@ -932,17 +932,17 @@ void MainWindow::loadGlobalOperatorView() waypointsDockWidget->show(); } -// // HORIZONTAL SITUATION INDICATOR -// if (hsiDockWidget) -// { -// HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); -// if (hsi) -// { -// addDockWidget(Qt::BottomDockWidgetArea, hsiDockWidget); -// hsiDockWidget->show(); -// hsi->start(); -// } -// } + // // HORIZONTAL SITUATION INDICATOR + // if (hsiDockWidget) + // { + // HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); + // if (hsi) + // { + // addDockWidget(Qt::BottomDockWidgetArea, hsiDockWidget); + // hsiDockWidget->show(); + // hsi->start(); + // } + // } // PROCESS CONTROL if (watchdogControlDockWidget) @@ -969,110 +969,161 @@ void MainWindow::loadGlobalOperatorView() void MainWindow::load3DMapView() { - #ifdef QGC_OSGEARTH_ENABLED - clearView(); +#ifdef QGC_OSGEARTH_ENABLED + clearView(); - // 3D map - if (_3DMapWidget) - { - QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); - if (centerStack) - { - //map3DWidget->setActive(true); - centerStack->setCurrentWidget(_3DMapWidget); - } - } + // 3D map + if (_3DMapWidget) + { + QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); + if (centerStack) + { + //map3DWidget->setActive(true); + centerStack->setCurrentWidget(_3DMapWidget); + } + } - // UAS CONTROL - if (controlDockWidget) - { - addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); - controlDockWidget->show(); - } + // UAS CONTROL + if (controlDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->show(); + } - // UAS LIST - if (listDockWidget) - { - addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); - listDockWidget->show(); - } + // UAS LIST + if (listDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->show(); + } - // WAYPOINT LIST - if (waypointsDockWidget) - { - addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); - waypointsDockWidget->show(); - } + // WAYPOINT LIST + if (waypointsDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->show(); + } - // HORIZONTAL SITUATION INDICATOR - if (hsiDockWidget) - { - HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); - if (hsi) - { - hsi->start(); - addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); - hsiDockWidget->show(); - } - } + // HORIZONTAL SITUATION INDICATOR + if (hsiDockWidget) + { + HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); + if (hsi) + { + hsi->start(); + addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); + hsiDockWidget->show(); + } + } #endif - this->show(); + this->show(); +} +void MainWindow::loadGoogleEarthView() +{ + #if (defined Q_OS_WIN) | (defined Q_OS_MAC) + clearView(); + + // 3D map + if (gEarthWidget) + { + QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); + if (centerStack) + { + centerStack->setCurrentWidget(gEarthWidget); } + } + + // UAS CONTROL + if (controlDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->show(); + } + + // UAS LIST + if (listDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->show(); + } + + // WAYPOINT LIST + if (waypointsDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->show(); + } + + // HORIZONTAL SITUATION INDICATOR + if (hsiDockWidget) + { + HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); + if (hsi) + { + hsi->start(); + addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); + hsiDockWidget->show(); + } + } + this->show(); +#endif + +} void MainWindow::load3DView() { - #ifdef QGC_OSG_ENABLED - clearView(); +#ifdef QGC_OSG_ENABLED + clearView(); - // 3D map - if (_3DWidget) - { - QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); - if (centerStack) - { - //map3DWidget->setActive(true); - centerStack->setCurrentWidget(_3DWidget); - } - } + // 3D map + if (_3DWidget) + { + QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); + if (centerStack) + { + //map3DWidget->setActive(true); + centerStack->setCurrentWidget(_3DWidget); + } + } - // UAS CONTROL - if (controlDockWidget) - { - addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); - controlDockWidget->show(); - } + // UAS CONTROL + if (controlDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->show(); + } - // UAS LIST - if (listDockWidget) - { - addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); - listDockWidget->show(); - } + // UAS LIST + if (listDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->show(); + } - // WAYPOINT LIST - if (waypointsDockWidget) - { - addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); - waypointsDockWidget->show(); - } + // WAYPOINT LIST + if (waypointsDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->show(); + } - // HORIZONTAL SITUATION INDICATOR - if (hsiDockWidget) - { - HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); - if (hsi) - { - hsi->start(); - addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); - hsiDockWidget->show(); - } - } + // HORIZONTAL SITUATION INDICATOR + if (hsiDockWidget) + { + HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); + if (hsi) + { + hsi->start(); + addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); + hsiDockWidget->show(); + } + } #endif - this->show(); + this->show(); - } +} void MainWindow::loadEngineerView() { diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 31bb449b21f77e3e77731aba72aa6c5acca68eb3..38db7929181b952c0693c75267a607b5b92c3c4d 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -63,7 +63,7 @@ This file is part of the QGROUNDCONTROL project #include "HSIDisplay.h" #include "QGCDataPlot2D.h" #include "QGCRemoteControlView.h" - +#include "QGCGoogleEarthView.h" #include "LogCompressor.h" @@ -113,6 +113,8 @@ public slots: void loadOperatorView(); /** @brief Load 3D view */ void load3DView(); + /** @brief Load 3D Google Earth view */ + void loadGoogleEarthView(); /** @brief Load 3D map view */ void load3DMapView(); /** @brief Load view with all widgets */ @@ -170,6 +172,7 @@ protected: #ifdef QGC_OSGEARTH_ENABLED QPointer<QWidget> _3DMapWidget; #endif + QPointer<QGCGoogleEarthView> gEarthWidget; // Dock widgets QPointer<QDockWidget> controlDockWidget; QPointer<QDockWidget> infoDockWidget; diff --git a/src/ui/MainWindow.ui b/src/ui/MainWindow.ui index ed91679edcafa0bf811a97f6a1e6cc2509a5b520..03960b620625a5611e3e29092ae425e1b8f2fd0a 100644 --- a/src/ui/MainWindow.ui +++ b/src/ui/MainWindow.ui @@ -38,7 +38,7 @@ <x>0</x> <y>0</y> <width>1000</width> - <height>25</height> + <height>22</height> </rect> </property> <widget class="QMenu" name="menuMGround"> @@ -77,6 +77,7 @@ <addaction name="actionOperatorView"/> <addaction name="action3DMapView"/> <addaction name="action3DView"/> + <addaction name="actionGoogleEarthView"/> <addaction name="actionGlobalOperatorView"/> <addaction name="separator"/> <addaction name="actionShow_MAVLink_view"/> @@ -235,7 +236,7 @@ <normaloff>:/images/categories/preferences-system.svg</normaloff>:/images/categories/preferences-system.svg</iconset> </property> <property name="text"> - <string>Show 3D local view</string> + <string>Show 3D Local View</string> </property> <property name="toolTip"> <string>Show 3D view</string> @@ -316,7 +317,7 @@ <normaloff>:/images/categories/applications-internet.svg</normaloff>:/images/categories/applications-internet.svg</iconset> </property> <property name="text"> - <string>Show Global operator view</string> + <string>Show 2D Map View</string> </property> </action> <action name="action3DMapView"> @@ -325,7 +326,16 @@ <normaloff>:/images/categories/applications-internet.svg</normaloff>:/images/categories/applications-internet.svg</iconset> </property> <property name="text"> - <string>Show 3D Globe view</string> + <string>Show 3D Global View</string> + </property> + </action> + <action name="actionGoogleEarthView"> + <property name="icon"> + <iconset resource="../../mavground.qrc"> + <normaloff>:/images/mapproviders/googleearth.svg</normaloff>:/images/mapproviders/googleearth.svg</iconset> + </property> + <property name="text"> + <string>Google Earth View</string> </property> </action> </widget> diff --git a/src/ui/QGCWebView.cc b/src/ui/QGCWebView.cc new file mode 100644 index 0000000000000000000000000000000000000000..7de964b90022f7e51bd191e1ec2b0d72dfa035f6 --- /dev/null +++ b/src/ui/QGCWebView.cc @@ -0,0 +1,28 @@ +#include "QGCWebView.h" +#include "ui_QGCWebView.h" + +QGCWebView::QGCWebView(QWidget *parent) : + QWidget(parent), + ui(new Ui::QGCWebView) +{ + ui->setupUi(this); + ui->webView->settings()->setAttribute(QWebSettings::PluginsEnabled, true); + ui->webView->load(QUrl("http://qgroundcontrol.org")); +} + +QGCWebView::~QGCWebView() +{ + delete ui; +} + +void QGCWebView::changeEvent(QEvent *e) +{ + QWidget::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} diff --git a/src/ui/QGCWebView.h b/src/ui/QGCWebView.h new file mode 100644 index 0000000000000000000000000000000000000000..9c85ff08f16f5325b242738db4bc78e6e3f1af97 --- /dev/null +++ b/src/ui/QGCWebView.h @@ -0,0 +1,25 @@ +#ifndef QGCWEBVIEW_H +#define QGCWEBVIEW_H + +#include <QWidget> + +namespace Ui { + class QGCWebView; +} + +class QGCWebView : public QWidget +{ + Q_OBJECT + +public: + explicit QGCWebView(QWidget *parent = 0); + ~QGCWebView(); + +protected: + void changeEvent(QEvent *e); + +private: + Ui::QGCWebView *ui; +}; + +#endif // QGCWEBVIEW_H diff --git a/src/ui/QGCWebView.ui b/src/ui/QGCWebView.ui new file mode 100644 index 0000000000000000000000000000000000000000..d7f8a87a33dcb1767e00004ff8790d2f6e8f49f6 --- /dev/null +++ b/src/ui/QGCWebView.ui @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>QGCWebView</class> + <widget class="QWidget" name="QGCWebView"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QWebView" name="webView"> + <property name="url"> + <url> + <string>about:blank</string> + </url> + </property> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>QWebView</class> + <extends>QWidget</extends> + <header>QtWebKit/QWebView</header> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/ui/WaypointList.cc b/src/ui/WaypointList.cc index 5478e2a4e43c8e591f560f2bc4105120810dc1d3..358668733e520872c54c7f14054bcd81f0559bc5 100644 --- a/src/ui/WaypointList.cc +++ b/src/ui/WaypointList.cc @@ -199,10 +199,9 @@ void WaypointList::add() } else { - - //isLocalWP = true; - Waypoint *wp = new Waypoint(0, 1.1, 1.1, -0.8, 0.0, true, true, 0.15, 2000); + Waypoint *wp = new Waypoint(0, uas->getLongitude(), uas->getLatitude(), uas->getAltitude(), + 0.0, true, true, 0.15, 2000); uas->getWaypointManager().addWaypoint(wp); diff --git a/src/ui/WaypointView.cc b/src/ui/WaypointView.cc index 6732b0b79e175b5dfd1c3cdbbd73587b8b66ca8c..5d1804741e02f7c534e6c7e04c4937c664f93742 100644 --- a/src/ui/WaypointView.cc +++ b/src/ui/WaypointView.cc @@ -49,7 +49,6 @@ WaypointView::WaypointView(Waypoint* wp, QWidget* parent) : m_ui->setupUi(this); this->wp = wp; - wp->setFrame(MAV_FRAME_LOCAL); // add actions m_ui->comboBox_action->addItem("Navigate",MAV_ACTION_NAVIGATE); @@ -63,7 +62,7 @@ WaypointView::WaypointView(Waypoint* wp, QWidget* parent) : // defaults changedAction(0); - changedFrame(0); + changedFrame(wp->getFrame()); // Read values and set user interface updateValues(); diff --git a/src/ui/map3D/GCManipulator.cc b/src/ui/map3D/GCManipulator.cc index 83b0b61684a99cecb1e8e9a8b787e2742304263a..6f2fb0e7f80bf0496ccf72707de2c132f7793bf4 100644 --- a/src/ui/map3D/GCManipulator.cc +++ b/src/ui/map3D/GCManipulator.cc @@ -33,21 +33,21 @@ This file is part of the QGROUNDCONTROL project GCManipulator::GCManipulator() { - _moveSensitivity = 0.05f; - _zoomSensitivity = 1.0f; - _minZoomRange = 2.0f; + _moveSensitivity = 0.05; + _zoomSensitivity = 1.0; + _minZoomRange = 2.0; } void -GCManipulator::setMinZoomRange(float minZoomRange) +GCManipulator::setMinZoomRange(double minZoomRange) { _minZoomRange = minZoomRange; } void -GCManipulator::move(float dx, float dy, float dz) +GCManipulator::move(double dx, double dy, double dz) { - _center += osg::Vec3(dx, dy, dz); + _center += osg::Vec3d(dx, dy, dz); } bool @@ -126,15 +126,15 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, case GUIEventAdapter::SCROLL: { // zoom model - float scale = 1.0f; + double scale = 1.0; if (ea.getScrollingMotion() == GUIEventAdapter::SCROLL_UP) { - scale -= _zoomSensitivity * 0.1f; + scale -= _zoomSensitivity * 0.1; } else { - scale += _zoomSensitivity * 0.1f; + scale += _zoomSensitivity * 0.1; } if (_distance * scale > _minZoomRange) { @@ -161,12 +161,12 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, } case GUIEventAdapter::KEY_Left: { - float scale = -_moveSensitivity * _distance; + double scale = -_moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(scale, 0.0f, 0.0f); + osg::Vec3d dv(scale, 0.0, 0.0); _center += dv * rotation_matrix; @@ -174,12 +174,12 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, } case GUIEventAdapter::KEY_Right: { - float scale = _moveSensitivity * _distance; + double scale = _moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(scale, 0.0f, 0.0f); + osg::Vec3d dv(scale, 0.0, 0.0); _center += dv * rotation_matrix; @@ -187,12 +187,12 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, } case GUIEventAdapter::KEY_Up: { - float scale = _moveSensitivity * _distance; + double scale = _moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(0.0f, scale, 0.0f); + osg::Vec3d dv(0.0, scale, 0.0); _center += dv * rotation_matrix; @@ -200,12 +200,12 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, } case GUIEventAdapter::KEY_Down: { - float scale = -_moveSensitivity * _distance; + double scale = -_moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(0.0f, scale, 0.0f); + osg::Vec3d dv(0.0, scale, 0.0); _center += dv * rotation_matrix; @@ -231,7 +231,7 @@ GCManipulator::handle(const osgGA::GUIEventAdapter& ea, bool -GCManipulator::calcMovement() +GCManipulator::calcMovement(void) { using namespace osgGA; @@ -241,11 +241,11 @@ GCManipulator::calcMovement() return false; } - float dx = _ga_t0->getXnormalized() - _ga_t1->getXnormalized(); - float dy = _ga_t0->getYnormalized() - _ga_t1->getYnormalized(); + double dx = _ga_t0->getXnormalized() - _ga_t1->getXnormalized(); + double dy = _ga_t0->getYnormalized() - _ga_t1->getYnormalized(); // return if there is no movement. - if (dx == 0.0f && dy == 0.0f) + if (dx == 0.0 && dy == 0.0) { return false; } @@ -254,7 +254,11 @@ GCManipulator::calcMovement() if (buttonMask == GUIEventAdapter::LEFT_MOUSE_BUTTON) { // rotate camera +#ifdef __APPLE__ osg::Vec3d axis; +#else + osg::Vec3 axis; +#endif float angle; float px0 = _ga_t0->getXnormalized(); @@ -278,12 +282,12 @@ GCManipulator::calcMovement() GUIEventAdapter::RIGHT_MOUSE_BUTTON)) { // pan model - float scale = -_moveSensitivity * _distance; + double scale = -_moveSensitivity * _distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); - osg::Vec3 dv(dx * scale, dy * scale, 0.0f); + osg::Vec3d dv(dx * scale, dy * scale, 0.0); _center += dv * rotation_matrix; @@ -293,7 +297,7 @@ GCManipulator::calcMovement() else if (buttonMask == GUIEventAdapter::RIGHT_MOUSE_BUTTON) { // zoom model - float scale = 1.0f + dy * _zoomSensitivity; + double scale = 1.0 + dy * _zoomSensitivity; if (_distance * scale > _minZoomRange) { diff --git a/src/ui/map3D/GCManipulator.h b/src/ui/map3D/GCManipulator.h index 87477813a8ecdbf301f9f8fe3fa75fcc8ec38056..e8291abfd85cfdb34c647170cc3843d0876872f9 100644 --- a/src/ui/map3D/GCManipulator.h +++ b/src/ui/map3D/GCManipulator.h @@ -39,9 +39,9 @@ class GCManipulator : public osgGA::TrackballManipulator public: GCManipulator(); - void setMinZoomRange(float minZoomRange); + void setMinZoomRange(double minZoomRange); - virtual void move(float dx, float dy, float dz); + virtual void move(double dx, double dy, double dz); /** * @brief Handle events. @@ -51,11 +51,11 @@ public: osgGA::GUIActionAdapter& us); protected: - bool calcMovement(); + bool calcMovement(void); - float _moveSensitivity; - float _zoomSensitivity; - float _minZoomRange; + double _moveSensitivity; + double _zoomSensitivity; + double _minZoomRange; }; #endif // GCMANIPULATOR_H diff --git a/src/ui/map3D/HUDScaleGeode.cc b/src/ui/map3D/HUDScaleGeode.cc new file mode 100644 index 0000000000000000000000000000000000000000..bb113610d4971c1963d38d11ef38a8817759d08b --- /dev/null +++ b/src/ui/map3D/HUDScaleGeode.cc @@ -0,0 +1,125 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL 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. + + QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. + +======================================================================*/ + +/** + * @file + * @brief Definition of the class HUDScaleGeode. + * + * @author Lionel Heng <hengli@student.ethz.ch> + * + */ + +#include "HUDScaleGeode.h" + +#include <osg/Geometry> +#include <osg/LineWidth> + +HUDScaleGeode::HUDScaleGeode() +{ + +} + +void +HUDScaleGeode::init(void) +{ + osg::ref_ptr<osg::Vec2Array> outlineVertices(new osg::Vec2Array); + outlineVertices->push_back(osg::Vec2(20.0f, 50.0f)); + outlineVertices->push_back(osg::Vec2(20.0f, 70.0f)); + outlineVertices->push_back(osg::Vec2(20.0f, 60.0f)); + outlineVertices->push_back(osg::Vec2(100.0f, 60.0f)); + outlineVertices->push_back(osg::Vec2(100.0f, 50.0f)); + outlineVertices->push_back(osg::Vec2(100.0f, 70.0f)); + + osg::ref_ptr<osg::Geometry> outlineGeometry(new osg::Geometry); + outlineGeometry->setVertexArray(outlineVertices); + + osg::ref_ptr<osg::Vec4Array> outlineColor(new osg::Vec4Array); + outlineColor->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); + outlineGeometry->setColorArray(outlineColor); + outlineGeometry->setColorBinding(osg::Geometry::BIND_OVERALL); + + outlineGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, + 0, 6)); + + osg::ref_ptr<osg::LineWidth> outlineWidth(new osg::LineWidth()); + outlineWidth->setWidth(4.0f); + outlineGeometry->getOrCreateStateSet()-> + setAttributeAndModes(outlineWidth, osg::StateAttribute::ON); + + addDrawable(outlineGeometry); + + osg::ref_ptr<osg::Vec2Array> markerVertices(new osg::Vec2Array); + markerVertices->push_back(osg::Vec2(20.0f, 50.0f)); + markerVertices->push_back(osg::Vec2(20.0f, 70.0f)); + markerVertices->push_back(osg::Vec2(20.0f, 60.0f)); + markerVertices->push_back(osg::Vec2(100.0f, 60.0f)); + markerVertices->push_back(osg::Vec2(100.0f, 50.0f)); + markerVertices->push_back(osg::Vec2(100.0f, 70.0f)); + + osg::ref_ptr<osg::Geometry> markerGeometry(new osg::Geometry); + markerGeometry->setVertexArray(markerVertices); + + osg::ref_ptr<osg::Vec4Array> markerColor(new osg::Vec4Array); + markerColor->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); + markerGeometry->setColorArray(markerColor); + markerGeometry->setColorBinding(osg::Geometry::BIND_OVERALL); + + markerGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, + 0, 6)); + + osg::ref_ptr<osg::LineWidth> markerWidth(new osg::LineWidth()); + markerWidth->setWidth(1.5f); + markerGeometry->getOrCreateStateSet()-> + setAttributeAndModes(markerWidth, osg::StateAttribute::ON); + + addDrawable(markerGeometry); + + text = new osgText::Text; + text->setCharacterSize(11); + text->setFont("images/Vera.ttf"); + text->setAxisAlignment(osgText::Text::SCREEN); + text->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); + text->setPosition(osg::Vec3(40.0f, 45.0f, -1.5f)); + + addDrawable(text); +} + +void +HUDScaleGeode::update(int windowHeight, float cameraFov, float cameraDistance, + bool darkBackground) +{ + float f = static_cast<float>(windowHeight) / 2.0f + / tanf(cameraFov / 180.0f * M_PI / 2.0f); + float dist = cameraDistance / f * 80.0f; + + if (darkBackground) + { + text->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); + } + else + { + text->setColor(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); + } + + text->setText(QString("%1 m").arg(dist, 0, 'f', 2).toStdString()); +} diff --git a/src/ui/map3D/HUDScaleGeode.h b/src/ui/map3D/HUDScaleGeode.h new file mode 100644 index 0000000000000000000000000000000000000000..7f2a370887fcc6ccffcfef97ab9c1caf1fc754b5 --- /dev/null +++ b/src/ui/map3D/HUDScaleGeode.h @@ -0,0 +1,52 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL 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. + + QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. + +======================================================================*/ + +/** + * @file + * @brief Definition of the class HUDScaleGeode. + * + * @author Lionel Heng <hengli@student.ethz.ch> + * + */ + +#ifndef HUDSCALEGEODE_H +#define HUDSCALEGEODE_H + +#include <osg/Geode> +#include <osgText/Text> +#include <QString> + +class HUDScaleGeode : public osg::Geode +{ +public: + HUDScaleGeode(); + + void init(void); + void update(int windowHeight, float cameraFov, float cameraDistance, + bool darkBackground); + +private: + osg::ref_ptr<osgText::Text> text; +}; + +#endif // HUDSCALEGEODE_H diff --git a/src/ui/map3D/Imagery.cc b/src/ui/map3D/Imagery.cc index 7e972b5cf83833437305cb3b314cad45b03842fa..084e0892c071173e5ed195cd9e75919608dfaecd 100644 --- a/src/ui/map3D/Imagery.cc +++ b/src/ui/map3D/Imagery.cc @@ -46,6 +46,12 @@ Imagery::Imagery() } +Imagery::ImageryType +Imagery::getImageryType(void) const +{ + return currentImageryType; +} + void Imagery::setImageryType(ImageryType type) { @@ -62,9 +68,13 @@ Imagery::setOffset(double xOffset, double yOffset) void Imagery::prefetch2D(double windowWidth, double windowHeight, double zoom, double xOrigin, double yOrigin, - double viewXOffset, double viewYOffset, const QString& utmZone) { + if (currentImageryType == BLANK_MAP) + { + return; + } + double tileResolution; if (currentImageryType == GOOGLE_SATELLITE || currentImageryType == GOOGLE_MAP) @@ -88,10 +98,10 @@ Imagery::prefetch2D(double windowWidth, double windowHeight, int zoomLevel; tileBounds(tileResolution, - xOrigin + viewXOffset - windowWidth / 2.0 / zoom, - yOrigin + viewYOffset - windowHeight / 2.0 / zoom, - xOrigin + viewXOffset + windowWidth / 2.0 / zoom, - yOrigin + viewYOffset + windowHeight / 2.0 / zoom, utmZone, + xOrigin - windowWidth / 2.0 / zoom * 1.5, + yOrigin - windowHeight / 2.0 / zoom * 1.5, + xOrigin + windowWidth / 2.0 / zoom * 1.5, + yOrigin + windowHeight / 2.0 / zoom * 1.5, utmZone, minTileX, minTileY, maxTileX, maxTileY, zoomLevel); for (int r = minTileY; r <= maxTileY; ++r) @@ -108,9 +118,19 @@ Imagery::prefetch2D(double windowWidth, double windowHeight, void Imagery::draw2D(double windowWidth, double windowHeight, double zoom, double xOrigin, double yOrigin, - double viewXOffset, double viewYOffset, + double xOffset, double yOffset, double zOffset, const QString& utmZone) { + if (getNumDrawables() > 0) + { + removeDrawables(0, getNumDrawables()); + } + + if (currentImageryType == BLANK_MAP) + { + return; + } + double tileResolution; if (currentImageryType == GOOGLE_SATELLITE || currentImageryType == GOOGLE_MAP) @@ -134,10 +154,10 @@ Imagery::draw2D(double windowWidth, double windowHeight, int zoomLevel; tileBounds(tileResolution, - xOrigin + viewXOffset - windowWidth / 2.0 / zoom * 1.5, - yOrigin + viewYOffset - windowHeight / 2.0 / zoom * 1.5, - xOrigin + viewXOffset + windowWidth / 2.0 / zoom * 1.5, - yOrigin + viewYOffset + windowHeight / 2.0 / zoom * 1.5, utmZone, + xOrigin - windowWidth / 2.0 / zoom * 1.5, + yOrigin - windowHeight / 2.0 / zoom * 1.5, + xOrigin + windowWidth / 2.0 / zoom * 1.5, + yOrigin + windowHeight / 2.0 / zoom * 1.5, utmZone, minTileX, minTileY, maxTileX, maxTileY, zoomLevel); for (int r = minTileY; r <= maxTileY; ++r) @@ -152,10 +172,12 @@ Imagery::draw2D(double windowWidth, double windowHeight, TexturePtr t = textureCache->get(tileURL); if (!t.isNull()) { - t->draw(x1 - xOrigin, y1 - yOrigin, - x2 - xOrigin, y2 - yOrigin, - x3 - xOrigin, y3 - yOrigin, - x4 - xOrigin, y4 - yOrigin, true); + addDrawable(t->draw(y1 - yOffset, x1 - xOffset, + y2 - yOffset, x2 - xOffset, + y3 - yOffset, x3 - xOffset, + y4 - yOffset, x4 - xOffset, + zOffset, + true)); } } } @@ -164,17 +186,19 @@ Imagery::draw2D(double windowWidth, double windowHeight, void Imagery::prefetch3D(double radius, double tileResolution, double xOrigin, double yOrigin, - double viewXOffset, double viewYOffset, - const QString& utmZone, bool useHeightModel) + const QString& utmZone) { + if (currentImageryType == BLANK_MAP) + { + return; + } + int minTileX, minTileY, maxTileX, maxTileY; int zoomLevel; tileBounds(tileResolution, - xOrigin + viewXOffset - radius, - yOrigin + viewYOffset - radius, - xOrigin + viewXOffset + radius, - yOrigin + viewYOffset + radius, utmZone, + xOrigin - radius, yOrigin - radius, + xOrigin + radius, yOrigin + radius, utmZone, minTileX, minTileY, maxTileX, maxTileY, zoomLevel); for (int r = minTileY; r <= maxTileY; ++r) @@ -183,7 +207,7 @@ Imagery::prefetch3D(double radius, double tileResolution, { QString url = getTileLocation(c, r, zoomLevel, tileResolution); - TexturePtr t = textureCache->get(url, useHeightModel); + TexturePtr t = textureCache->get(url); } } } @@ -191,17 +215,25 @@ Imagery::prefetch3D(double radius, double tileResolution, void Imagery::draw3D(double radius, double tileResolution, double xOrigin, double yOrigin, - double viewXOffset, double viewYOffset, - const QString& utmZone, bool useHeightModel) + double xOffset, double yOffset, double zOffset, + const QString& utmZone) { + if (getNumDrawables() > 0) + { + removeDrawables(0, getNumDrawables()); + } + + if (currentImageryType == BLANK_MAP) + { + return; + } + int minTileX, minTileY, maxTileX, maxTileY; int zoomLevel; tileBounds(tileResolution, - xOrigin + viewXOffset - radius, - yOrigin + viewYOffset - radius, - xOrigin + viewXOffset + radius, - yOrigin + viewYOffset + radius, utmZone, + xOrigin - radius, yOrigin - radius, + xOrigin + radius, yOrigin + radius, utmZone, minTileX, minTileY, maxTileX, maxTileY, zoomLevel); for (int r = minTileY; r <= maxTileY; ++r) @@ -213,14 +245,16 @@ Imagery::draw3D(double radius, double tileResolution, double x1, y1, x2, y2, x3, y3, x4, y4; imageBounds(c, r, tileResolution, x1, y1, x2, y2, x3, y3, x4, y4); - TexturePtr t = textureCache->get(tileURL, useHeightModel); + TexturePtr t = textureCache->get(tileURL); if (!t.isNull()) { - t->draw(x1 - xOrigin, y1 - yOrigin, - x2 - xOrigin, y2 - yOrigin, - x3 - xOrigin, y3 - yOrigin, - x4 - xOrigin, y4 - yOrigin, true); + addDrawable(t->draw(y1 - yOffset, x1 - xOffset, + y2 - yOffset, x2 - xOffset, + y3 - yOffset, x3 - xOffset, + y4 - yOffset, x4 - xOffset, + zOffset, + true)); } } } @@ -257,8 +291,7 @@ Imagery::imageBounds(int tileX, int tileY, double tileResolution, LLtoUTM(lat2, lon2, x3, y3, utmZone); LLtoUTM(lat2, lon1, x4, y4, utmZone); } - else if (currentImageryType == SWISSTOPO_SATELLITE || - currentImageryType == SWISSTOPO_SATELLITE_3D) + else if (currentImageryType == SWISSTOPO_SATELLITE) { double utmMultiplier = tileResolution * 200.0; double minX = tileX * utmMultiplier; @@ -295,8 +328,7 @@ Imagery::tileBounds(double tileResolution, UTMtoTile(maxUtmX, maxUtmY, utmZone, tileResolution, maxTileX, minTileY, zoomLevel); } - else if (currentImageryType == SWISSTOPO_SATELLITE || - currentImageryType == SWISSTOPO_SATELLITE_3D) + else if (currentImageryType == SWISSTOPO_SATELLITE) { double utmMultiplier = tileResolution * 200; @@ -369,7 +401,7 @@ Imagery::UTMtoTile(double northing, double easting, const QString& utmZone, } QChar -Imagery::UTMLetterDesignator(double latitude) const +Imagery::UTMLetterDesignator(double latitude) { // This routine determines the correct UTM letter designator for the given latitude // returns 'Z' if latitude is outside the UTM limits of 84N to 80S @@ -404,7 +436,7 @@ Imagery::UTMLetterDesignator(double latitude) const void Imagery::LLtoUTM(double latitude, double longitude, double& utmNorthing, double& utmEasting, - QString& utmZone) const + QString& utmZone) { // converts lat/long to UTM coords. Equations from USGS Bulletin 1532 // East Longitudes are positive, West longitudes are negative. @@ -485,7 +517,7 @@ Imagery::LLtoUTM(double latitude, double longitude, void Imagery::UTMtoLL(double utmNorthing, double utmEasting, const QString& utmZone, - double& latitude, double& longitude) const + double& latitude, double& longitude) { // converts UTM coords to lat/long. Equations from USGS Bulletin 1532 // East Longitudes are positive, West longitudes are negative. @@ -572,7 +604,7 @@ Imagery::getTileLocation(int tileX, int tileY, int zoomLevel, oss << "http://khm.google.com/vt/lbw/lyrs=y&x=" << tileX << "&y=" << tileY << "&z=" << zoomLevel; break; - case SWISSTOPO_SATELLITE: case SWISSTOPO_SATELLITE_3D: + case SWISSTOPO_SATELLITE: oss << "../map/eth_zurich_swissimage_025/200/color/" << tileY << "/tile-"; if (tileResolution < 1.0) diff --git a/src/ui/map3D/Imagery.h b/src/ui/map3D/Imagery.h index 157bd5479b430296d868130bfbdb0a56383cf412..381231235659179adaefe9a38b886ecd6ce5a723 100644 --- a/src/ui/map3D/Imagery.h +++ b/src/ui/map3D/Imagery.h @@ -32,47 +32,53 @@ This file is part of the QGROUNDCONTROL project #ifndef IMAGERY_H #define IMAGERY_H +#include <osg/Geode> #include <QScopedPointer> #include <QString> #include "TextureCache.h" -class Imagery +class Imagery : public osg::Geode { public: enum ImageryType { - GOOGLE_MAP = 0, - GOOGLE_SATELLITE = 1, - SWISSTOPO_SATELLITE = 2, - SWISSTOPO_SATELLITE_3D = 3 + BLANK_MAP = 0, + GOOGLE_MAP = 1, + GOOGLE_SATELLITE = 2, + SWISSTOPO_SATELLITE = 3 }; Imagery(); + ImageryType getImageryType(void) const; void setImageryType(ImageryType type); void setOffset(double xOffset, double yOffset); void prefetch2D(double windowWidth, double windowHeight, double zoom, double xOrigin, double yOrigin, - double viewXOffset, double viewYOffset, const QString& utmZone); void draw2D(double windowWidth, double windowHeight, double zoom, double xOrigin, double yOrigin, - double viewXOffset, double viewYOffset, + double xOffset, double yOffset, double zOffset, const QString& utmZone); void prefetch3D(double radius, double tileResolution, double xOrigin, double yOrigin, - double viewXOffset, double viewYOffset, - const QString& utmZone, bool useHeightModel); + const QString& utmZone); void draw3D(double radius, double tileResolution, double xOrigin, double yOrigin, - double viewXOffset, double viewYOffset, - const QString& utmZone, bool useHeightModel); + double xOffset, double yOffset, double zOffset, + const QString& utmZone); bool update(void); + static void LLtoUTM(double latitude, double longitude, + double& utmNorthing, double& utmEasting, + QString& utmZone); + static void UTMtoLL(double utmNorthing, double utmEasting, const QString& utmZone, + double& latitude, double& longitude); + private: void imageBounds(int tileX, int tileY, double tileResolution, double& x1, double& y1, double& x2, double& y2, @@ -92,13 +98,7 @@ private: void UTMtoTile(double northing, double easting, const QString& utmZone, double tileResolution, int& tileX, int& tileY, int& zoomLevel) const; - QChar UTMLetterDesignator(double latitude) const; - - void LLtoUTM(double latitude, double longitude, - double& utmNorthing, double& utmEasting, - QString& utmZone) const; - void UTMtoLL(double utmNorthing, double utmEasting, const QString& utmZone, - double& latitude, double& longitude) const; + static QChar UTMLetterDesignator(double latitude); QString getTileLocation(int tileX, int tileY, int zoomLevel, double tileResolution) const; diff --git a/src/ui/map3D/Pixhawk3DWidget.cc b/src/ui/map3D/Pixhawk3DWidget.cc index af91684a11ea712a2092fe50bc4657b9539495f7..afda24aca4c407c61a02be57fde1a6e0429b11c9 100644 --- a/src/ui/map3D/Pixhawk3DWidget.cc +++ b/src/ui/map3D/Pixhawk3DWidget.cc @@ -41,19 +41,24 @@ #include "PixhawkCheetahGeode.h" #include "UASManager.h" -#include "UASInterface.h" + #include "QGC.h" Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent) : Q3DWidget(parent) , uas(NULL) + , mode(DEFAULT_MODE) + , selectedWpIndex(-1) , displayGrid(true) , displayTrail(false) - , displayTarget(false) + , displayImagery(true) , displayWaypoints(true) , displayRGBD2D(false) , displayRGBD3D(false) + , enableRGBDColor(true) , followCamera(true) + , enableFreenect(false) + , frame(MAV_FRAME_GLOBAL) , lastRobotX(0.0f) , lastRobotY(0.0f) , lastRobotZ(0.0f) @@ -73,27 +78,26 @@ Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent) trailNode = createTrail(); rollingMap->addChild(trailNode); -#ifdef QGC_OSGEARTH_ENABLED // generate map model mapNode = createMap(); - root->addChild(mapNode); -#endif - - // generate target model - allocentricMap->addChild(createTarget()); + rollingMap->addChild(mapNode); // generate waypoint model - waypointsNode = createWaypoints(); - rollingMap->addChild(waypointsNode); + waypointGroupNode = new WaypointGroupNode; + waypointGroupNode->init(); + rollingMap->addChild(waypointGroupNode); #ifdef QGC_LIBFREENECT_ENABLED freenect.reset(new Freenect()); - freenect->init(); + enableFreenect = freenect->init(); #endif // generate RGBD model - rgbd3DNode = createRGBD3D(); - egocentricMap->addChild(rgbd3DNode); + if (enableFreenect) + { + rgbd3DNode = createRGBD3D(); + egocentricMap->addChild(rgbd3DNode); + } setupHUD(); @@ -126,6 +130,23 @@ void Pixhawk3DWidget::setActiveUAS(UASInterface* uas) this->uas = uas; } +void +Pixhawk3DWidget::selectFrame(QString text) +{ + if (text.compare("Global") == 0) + { + frame = MAV_FRAME_GLOBAL; + } + else if (text.compare("Local") == 0) + { + frame = MAV_FRAME_LOCAL; + } + + getPosition(lastRobotX, lastRobotY, lastRobotZ); + + recenter(); +} + void Pixhawk3DWidget::showGrid(int32_t state) { @@ -170,6 +191,21 @@ Pixhawk3DWidget::showWaypoints(int state) } } +void +Pixhawk3DWidget::selectMapSource(int index) +{ + mapNode->setImageryType(static_cast<Imagery::ImageryType>(index)); + + if (mapNode->getImageryType() == Imagery::BLANK_MAP) + { + displayImagery = false; + } + else + { + displayImagery = true; + } +} + void Pixhawk3DWidget::selectVehicleModel(int index) { @@ -181,13 +217,8 @@ Pixhawk3DWidget::selectVehicleModel(int index) void Pixhawk3DWidget::recenter(void) { - float robotX = 0.0f, robotY = 0.0f, robotZ = 0.0f; - if (uas != NULL) - { - robotX = uas->getLocalX(); - robotY = uas->getLocalY(); - robotZ = uas->getLocalZ(); - } + double robotX = 0.0f, robotY = 0.0f, robotZ = 0.0f; + getPosition(robotX, robotY, robotZ); recenterCamera(robotY, robotX, -robotZ); } @@ -204,7 +235,153 @@ Pixhawk3DWidget::toggleFollowCamera(int32_t state) followCamera = false; } } -#include <osgDB/WriteFile> + +void +Pixhawk3DWidget::insertWaypoint(void) +{ + if (uas) + { + Waypoint* wp; + if (frame == MAV_FRAME_GLOBAL) + { + double latitude = uas->getLatitude(); + double longitude = uas->getLongitude(); + double altitude = uas->getAltitude(); + double x, y; + QString utmZone; + Imagery::LLtoUTM(latitude, longitude, x, y, utmZone); + + std::pair<double,double> cursorWorldCoords = + getGlobalCursorPosition(getMouseX(), getMouseY(), altitude); + + Imagery::UTMtoLL(cursorWorldCoords.first, cursorWorldCoords.second, utmZone, + latitude, longitude); + + wp = new Waypoint(0, longitude, latitude, altitude); + } + else if (frame == MAV_FRAME_LOCAL) + { + double z = uas->getLocalZ(); + + std::pair<double,double> cursorWorldCoords = + getGlobalCursorPosition(getMouseX(), getMouseY(), -z); + + wp = new Waypoint(0, cursorWorldCoords.first, + cursorWorldCoords.second, z); + } + + if (wp) + { + wp->setFrame(frame); + uas->getWaypointManager().addWaypoint(wp); + } + } +} + +void +Pixhawk3DWidget::moveWaypoint(void) +{ + mode = MOVE_WAYPOINT_MODE; +} + +void +Pixhawk3DWidget::setWaypoint(void) +{ + if (uas) + { + const QVector<Waypoint *> waypoints = + uas->getWaypointManager().getWaypointList(); + Waypoint* waypoint = waypoints.at(selectedWpIndex); + + if (frame == MAV_FRAME_GLOBAL) + { + double latitude = uas->getLatitude(); + double longitude = uas->getLongitude(); + double altitude = uas->getAltitude(); + double x, y; + QString utmZone; + Imagery::LLtoUTM(latitude, longitude, x, y, utmZone); + + std::pair<double,double> cursorWorldCoords = + getGlobalCursorPosition(getMouseX(), getMouseY(), altitude); + + Imagery::UTMtoLL(cursorWorldCoords.first, cursorWorldCoords.second, utmZone, + latitude, longitude); + + waypoint->setX(longitude); + waypoint->setY(latitude); + waypoint->setZ(altitude); + } + else if (frame == MAV_FRAME_LOCAL) + { + double z = uas->getLocalZ(); + + std::pair<double,double> cursorWorldCoords = + getGlobalCursorPosition(getMouseX(), getMouseY(), -z); + + waypoint->setX(cursorWorldCoords.first); + waypoint->setY(cursorWorldCoords.second); + waypoint->setZ(z); + } + } +} + +void +Pixhawk3DWidget::deleteWaypoint(void) +{ + if (uas) + { + uas->getWaypointManager().removeWaypoint(selectedWpIndex); + } +} + +void +Pixhawk3DWidget::setWaypointAltitude(void) +{ + if (uas) + { + bool ok; + const QVector<Waypoint *> waypoints = + uas->getWaypointManager().getWaypointList(); + Waypoint* waypoint = waypoints.at(selectedWpIndex); + + double altitude = waypoint->getZ(); + if (frame == MAV_FRAME_LOCAL) + { + altitude = -altitude; + } + + double newAltitude = + QInputDialog::getDouble(this, tr("Set altitude of waypoint %1").arg(selectedWpIndex), + tr("Altitude (m):"), waypoint->getZ(), -1000.0, 1000.0, 1, &ok); + if (ok) + { + if (frame == MAV_FRAME_GLOBAL) + { + waypoint->setZ(newAltitude); + } + else if (frame == MAV_FRAME_LOCAL) + { + waypoint->setZ(-newAltitude); + } + } + } +} + +void +Pixhawk3DWidget::clearAllWaypoints(void) +{ + if (uas) + { + const QVector<Waypoint *> waypoints = + uas->getWaypointManager().getWaypointList(); + for (int i = waypoints.size() - 1; i >= 0; --i) + { + uas->getWaypointManager().removeWaypoint(i); + } + } +} + QVector< osg::ref_ptr<osg::Node> > Pixhawk3DWidget::findVehicleModels(void) { @@ -224,12 +401,11 @@ Pixhawk3DWidget::findVehicleModels(void) if (node) { - - nodes.push_back(node); + nodes.push_back(node); } else { - printf(QString("ERROR: Could not load file " + directory.absoluteFilePath(files[i]) + "\n").toStdString().c_str()); + printf("%s\n", QString("ERROR: Could not load file " + directory.absoluteFilePath(files[i]) + "\n").toStdString().c_str()); } } @@ -261,6 +437,11 @@ Pixhawk3DWidget::findVehicleModels(void) void Pixhawk3DWidget::buildLayout(void) { + QComboBox* frameComboBox = new QComboBox(this); + frameComboBox->addItem("Global"); + frameComboBox->addItem("Local"); + frameComboBox->setFixedWidth(70); + QCheckBox* gridCheckBox = new QCheckBox(this); gridCheckBox->setText("Grid"); gridCheckBox->setChecked(displayGrid); @@ -273,18 +454,19 @@ Pixhawk3DWidget::buildLayout(void) waypointsCheckBox->setText("Waypoints"); waypointsCheckBox->setChecked(displayWaypoints); - QLabel* modelLabel = new QLabel("Vehicle Model", this); + QLabel* mapLabel = new QLabel("Map", this); + QComboBox* mapComboBox = new QComboBox(this); + mapComboBox->addItem("None"); + mapComboBox->addItem("Map (Google)"); + mapComboBox->addItem("Satellite (Google)"); + + QLabel* modelLabel = new QLabel("Vehicle", this); QComboBox* modelComboBox = new QComboBox(this); for (int i = 0; i < vehicleModels.size(); ++i) { modelComboBox->addItem(vehicleModels[i]->getName().c_str()); } - targetButton = new QPushButton(this); - targetButton->setCheckable(true); - targetButton->setChecked(false); - targetButton->setIcon(QIcon(QString::fromUtf8(":/images/status/weather-clear.svg"))); - QPushButton* recenterButton = new QPushButton(this); recenterButton->setText("Recenter Camera"); @@ -295,26 +477,33 @@ Pixhawk3DWidget::buildLayout(void) QGridLayout* layout = new QGridLayout(this); layout->setMargin(0); layout->setSpacing(2); - layout->addWidget(gridCheckBox, 1, 0); - layout->addWidget(trailCheckBox, 1, 1); - layout->addWidget(waypointsCheckBox, 1, 2); - layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 1, 3); - layout->addWidget(modelLabel, 1, 4); - layout->addWidget(modelComboBox, 1, 5); - layout->addWidget(targetButton, 1, 6); - layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 1, 7); - layout->addWidget(recenterButton, 1, 8); - layout->addWidget(followCameraCheckBox, 1, 9); - layout->setRowStretch(0, 100); - layout->setRowStretch(1, 1); + layout->addWidget(frameComboBox, 0, 10); + layout->addWidget(gridCheckBox, 2, 0); + layout->addWidget(trailCheckBox, 2, 1); + layout->addWidget(waypointsCheckBox, 2, 2); + layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 2, 3); + layout->addWidget(mapLabel, 2, 4); + layout->addWidget(mapComboBox, 2, 5); + layout->addWidget(modelLabel, 2, 6); + layout->addWidget(modelComboBox, 2, 7); + layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 2, 8); + layout->addWidget(recenterButton, 2, 9); + layout->addWidget(followCameraCheckBox, 2, 10); + layout->setRowStretch(0, 1); + layout->setRowStretch(1, 100); + layout->setRowStretch(2, 1); setLayout(layout); + connect(frameComboBox, SIGNAL(currentIndexChanged(QString)), + this, SLOT(selectFrame(QString))); connect(gridCheckBox, SIGNAL(stateChanged(int)), this, SLOT(showGrid(int))); connect(trailCheckBox, SIGNAL(stateChanged(int)), this, SLOT(showTrail(int))); connect(waypointsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(showWaypoints(int))); + connect(mapComboBox, SIGNAL(currentIndexChanged(int)), + this, SLOT(selectMapSource(int))); connect(modelComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectVehicleModel(int))); connect(recenterButton, SIGNAL(clicked()), this, SLOT(recenter())); @@ -330,12 +519,9 @@ Pixhawk3DWidget::display(void) return; } - float robotX = uas->getLocalX(); - float robotY = uas->getLocalY(); - float robotZ = uas->getLocalZ(); - float robotRoll = uas->getRoll(); - float robotPitch = uas->getPitch(); - float robotYaw = uas->getYaw(); + double robotX, robotY, robotZ, robotRoll, robotPitch, robotYaw; + QString utmZone; + getPose(robotX, robotY, robotZ, robotRoll, robotPitch, robotYaw, utmZone); if (lastRobotX == 0.0f && lastRobotY == 0.0f && lastRobotZ == 0.0f) { @@ -350,32 +536,51 @@ Pixhawk3DWidget::display(void) if (followCamera) { - float dx = robotY - lastRobotY; - float dy = robotX - lastRobotX; - float dz = lastRobotZ - robotZ; + double dx = robotY - lastRobotY; + double dy = robotX - lastRobotX; + double dz = lastRobotZ - robotZ; moveCamera(dx, dy, dz); } - robotPosition->setPosition(osg::Vec3(robotY, robotX, -robotZ)); - robotAttitude->setAttitude(osg::Quat(-robotYaw, osg::Vec3f(0.0f, 0.0f, 1.0f), - robotPitch, osg::Vec3f(1.0f, 0.0f, 0.0f), - robotRoll, osg::Vec3f(0.0f, 1.0f, 0.0f))); + robotPosition->setPosition(osg::Vec3d(robotY, robotX, -robotZ)); + robotAttitude->setAttitude(osg::Quat(-robotYaw, osg::Vec3d(0.0f, 0.0f, 1.0f), + robotPitch, osg::Vec3d(1.0f, 0.0f, 0.0f), + robotRoll, osg::Vec3d(0.0f, 1.0f, 0.0f))); + + if (displayTrail) + { + updateTrail(robotX, robotY, robotZ); + } + + if (frame == MAV_FRAME_GLOBAL && displayImagery) + { + updateImagery(robotX, robotY, robotZ, utmZone); + } + + if (displayWaypoints) + { + updateWaypoints(); + } - updateTrail(robotX, robotY, robotZ); - updateTarget(); - updateWaypoints(); #ifdef QGC_LIBFREENECT_ENABLED - updateRGBD(); + if (enableFreenect && (displayRGBD2D || displayRGBD3D)) + { + updateRGBD(); + } #endif - updateHUD(robotX, robotY, robotZ, robotRoll, robotPitch, robotYaw); + updateHUD(robotX, robotY, robotZ, robotRoll, robotPitch, robotYaw, utmZone); // set node visibility + rollingMap->setChildValue(gridNode, displayGrid); rollingMap->setChildValue(trailNode, displayTrail); - rollingMap->setChildValue(targetNode, displayTarget); - rollingMap->setChildValue(waypointsNode, displayWaypoints); - egocentricMap->setChildValue(rgbd3DNode, displayRGBD3D); + rollingMap->setChildValue(mapNode, displayImagery); + rollingMap->setChildValue(waypointGroupNode, displayWaypoints); + if (enableFreenect) + { + egocentricMap->setChildValue(rgbd3DNode, displayRGBD3D); + } hudGroup->setChildValue(rgb2DGeode, displayRGBD2D); hudGroup->setChildValue(depth2DGeode, displayRGBD2D); @@ -397,6 +602,9 @@ Pixhawk3DWidget::keyPressEvent(QKeyEvent* event) case '2': displayRGBD3D = !displayRGBD3D; break; + case 'c': case 'C': + enableRGBDColor = !enableRGBDColor; + break; } } @@ -406,14 +614,104 @@ Pixhawk3DWidget::keyPressEvent(QKeyEvent* event) void Pixhawk3DWidget::mousePressEvent(QMouseEvent* event) { - if (event->button() == Qt::LeftButton && targetButton->isChecked()) + if (event->button() == Qt::LeftButton) { - markTarget(); + if (mode == MOVE_WAYPOINT_MODE) + { + setWaypoint(); + mode = DEFAULT_MODE; + + return; + } + + if (event->modifiers() == Qt::ShiftModifier) + { + selectedWpIndex = findWaypoint(event->x(), event->y()); + if (selectedWpIndex == -1) + { + showInsertWaypointMenu(event->globalPos()); + } + else + { + showEditWaypointMenu(event->globalPos()); + } + + return; + } } Q3DWidget::mousePressEvent(event); } +void +Pixhawk3DWidget::getPose(double& x, double& y, double& z, + double& roll, double& pitch, double& yaw, + QString& utmZone) +{ + if (uas) + { + if (frame == MAV_FRAME_GLOBAL) + { + double latitude = uas->getLatitude(); + double longitude = uas->getLongitude(); + double altitude = uas->getAltitude(); + + Imagery::LLtoUTM(latitude, longitude, x, y, utmZone); + z = -altitude; + } + else if (frame == MAV_FRAME_LOCAL) + { + x = uas->getLocalX(); + y = uas->getLocalY(); + z = uas->getLocalZ(); + } + + + roll = uas->getRoll(); + pitch = uas->getPitch(); + yaw = uas->getYaw(); + } +} + +void +Pixhawk3DWidget::getPose(double& x, double& y, double& z, + double& roll, double& pitch, double& yaw) +{ + QString utmZone; + getPose(x, y, z, roll, pitch, yaw); +} + +void +Pixhawk3DWidget::getPosition(double& x, double& y, double& z, + QString& utmZone) +{ + if (uas) + { + if (frame == MAV_FRAME_GLOBAL) + { + double latitude = uas->getLatitude(); + double longitude = uas->getLongitude(); + double altitude = uas->getAltitude(); + + Imagery::LLtoUTM(latitude, longitude, x, y, utmZone); + z = -altitude; + } + else if (frame == MAV_FRAME_LOCAL) + { + x = uas->getLocalX(); + y = uas->getLocalY(); + z = uas->getLocalZ(); + } + } +} + +void +Pixhawk3DWidget::getPosition(double& x, double& y, double& z) +{ + QString utmZone; + getPosition(x, y, z, utmZone); +} + osg::ref_ptr<osg::Geode> Pixhawk3DWidget::createGrid(void) { @@ -432,7 +730,7 @@ Pixhawk3DWidget::createGrid(void) // draw a 20m x 20m grid with 0.25m resolution for (float i = -radius; i <= radius; i += resolution) { - if (fabsf(i - roundf(i)) < 0.01f) + if (fabsf(i - floor(i + 0.5f)) < 0.01f) { coarseCoords->push_back(osg::Vec3(i, -radius, 0.0f)); coarseCoords->push_back(osg::Vec3(i, radius, 0.0f)); @@ -488,7 +786,7 @@ Pixhawk3DWidget::createTrail(void) trailGeometry->setUseDisplayList(false); geode->addDrawable(trailGeometry.get()); - trailVertices = new osg::Vec3Array; + trailVertices = new osg::Vec3dArray; trailGeometry->setVertexArray(trailVertices); trailDrawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP); @@ -509,34 +807,10 @@ Pixhawk3DWidget::createTrail(void) return geode; } -#ifdef QGC_OSGEARTH_ENABLED -osg::ref_ptr<osgEarth::MapNode> +osg::ref_ptr<Imagery> Pixhawk3DWidget::createMap(void) { - osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("map.earth"); - osg::ref_ptr<osgEarth::MapNode> node = osgEarth::MapNode::findMapNode(model); - - return node; -} -#endif - -osg::ref_ptr<osg::Node> -Pixhawk3DWidget::createTarget(void) -{ - targetPosition = new osg::PositionAttitudeTransform; - - targetNode = new osg::Geode; - targetPosition->addChild(targetNode); - - return targetPosition; -} - -osg::ref_ptr<osg::Group> -Pixhawk3DWidget::createWaypoints(void) -{ - osg::ref_ptr<osg::Group> group(new osg::Group()); - - return group; + return osg::ref_ptr<Imagery>(new Imagery()); } osg::ref_ptr<osg::Geode> @@ -564,7 +838,8 @@ void Pixhawk3DWidget::setupHUD(void) { osg::ref_ptr<osg::Vec4Array> hudColors(new osg::Vec4Array); - hudColors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 0.2f)); + hudColors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 0.5f)); + hudColors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); hudBackgroundGeometry = new osg::Geometry; hudBackgroundGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON, @@ -572,7 +847,7 @@ Pixhawk3DWidget::setupHUD(void) hudBackgroundGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON, 4, 4)); hudBackgroundGeometry->setColorArray(hudColors); - hudBackgroundGeometry->setColorBinding(osg::Geometry::BIND_OVERALL); + hudBackgroundGeometry->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET); hudBackgroundGeometry->setUseDisplayList(false); statusText = new osgText::Text; @@ -599,12 +874,16 @@ Pixhawk3DWidget::setupHUD(void) osg::Vec4(0.0f, 0.0f, 0.1f, 1.0f), depthImage); hudGroup->addChild(depth2DGeode); + + scaleGeode = new HUDScaleGeode; + scaleGeode->init(); + hudGroup->addChild(scaleGeode); } void Pixhawk3DWidget::resizeHUD(void) { - int topHUDHeight = 30; + int topHUDHeight = 25; int bottomHUDHeight = 25; osg::Vec3Array* vertices = static_cast<osg::Vec3Array*>(hudBackgroundGeometry->getVertexArray()); @@ -625,7 +904,7 @@ Pixhawk3DWidget::resizeHUD(void) (*vertices)[6] = osg::Vec3(width(), bottomHUDHeight, -1); (*vertices)[7] = osg::Vec3(0, bottomHUDHeight, -1); - statusText->setPosition(osg::Vec3(10, height() - 20, -1.5)); + statusText->setPosition(osg::Vec3(10, height() - 15, -1.5)); if (rgb2DGeode.valid() && depth2DGeode.valid()) { @@ -639,8 +918,9 @@ Pixhawk3DWidget::resizeHUD(void) } void -Pixhawk3DWidget::updateHUD(float robotX, float robotY, float robotZ, - float robotRoll, float robotPitch, float robotYaw) +Pixhawk3DWidget::updateHUD(double robotX, double robotY, double robotZ, + double robotRoll, double robotPitch, double robotYaw, + const QString& utmZone) { resizeHUD(); @@ -650,16 +930,52 @@ Pixhawk3DWidget::updateHUD(float robotX, float robotY, float robotZ, std::ostringstream oss; oss.setf(std::ios::fixed, std::ios::floatfield); oss.precision(2); - oss << " x = " << robotX << - " y = " << robotY << - " z = " << robotZ << - " r = " << robotRoll << - " p = " << robotPitch << - " y = " << robotYaw << - " Cursor [" << cursorPosition.first << - " " << cursorPosition.second << "]"; + if (frame == MAV_FRAME_GLOBAL) + { + double latitude, longitude; + Imagery::UTMtoLL(robotX, robotY, utmZone, latitude, longitude); + + double cursorLatitude, cursorLongitude; + Imagery::UTMtoLL(cursorPosition.first, cursorPosition.second, + utmZone, cursorLatitude, cursorLongitude); + + oss.precision(6); + oss << " Lat = " << latitude << + " Lon = " << longitude; + + oss.precision(2); + oss << " Altitude = " << -robotZ << + " r = " << robotRoll << + " p = " << robotPitch << + " y = " << robotYaw; + + oss.precision(6); + oss << " Cursor [" << cursorLatitude << + " " << cursorLongitude << "]"; + } + else if (frame == MAV_FRAME_LOCAL) + { + oss << " x = " << robotX << + " y = " << robotY << + " z = " << robotZ << + " r = " << robotRoll << + " p = " << robotPitch << + " y = " << robotYaw << + " Cursor [" << cursorPosition.first << + " " << cursorPosition.second << "]"; + } + statusText->setText(oss.str()); + bool darkBackground = true; + if (mapNode->getImageryType() == Imagery::GOOGLE_MAP) + { + darkBackground = false; + } + + scaleGeode->update(height(), cameraParams.cameraFov, + cameraManipulator->getDistance(), darkBackground); + if (!rgb.isNull()) { rgbImage->setImage(640, 480, 1, @@ -677,7 +993,7 @@ Pixhawk3DWidget::updateHUD(float robotX, float robotY, float robotZ, } void -Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) +Pixhawk3DWidget::updateTrail(double robotX, double robotY, double robotZ) { if (robotX == 0.0f || robotY == 0.0f || robotZ == 0.0f) { @@ -687,9 +1003,9 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) bool addToTrail = false; if (trail.size() > 0) { - if (fabsf(robotX - trail[trail.size() - 1].x()) > 0.01f || - fabsf(robotY - trail[trail.size() - 1].y()) > 0.01f || - fabsf(robotZ - trail[trail.size() - 1].z()) > 0.01f) + if (fabs(robotX - trail[trail.size() - 1].x()) > 0.01f || + fabs(robotY - trail[trail.size() - 1].y()) > 0.01f || + fabs(robotZ - trail[trail.size() - 1].z()) > 0.01f) { addToTrail = true; } @@ -701,11 +1017,11 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) if (addToTrail) { - osg::Vec3 p(robotX, robotY, robotZ); + osg::Vec3d p(robotX, robotY, robotZ); if (trail.size() == trail.capacity()) { memcpy(trail.data(), trail.data() + 1, - (trail.size() - 1) * sizeof(osg::Vec3)); + (trail.size() - 1) * sizeof(osg::Vec3d)); trail[trail.size() - 1] = p; } else @@ -717,9 +1033,9 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) trailVertices->clear(); for (int i = 0; i < trail.size(); ++i) { - trailVertices->push_back(osg::Vec3(trail[i].y() - robotY, - trail[i].x() - robotX, - -(trail[i].z() - robotZ))); + trailVertices->push_back(osg::Vec3d(trail[i].y() - robotY, + trail[i].x() - robotX, + -(trail[i].z() - robotZ))); } trailDrawArrays->setFirst(0); @@ -728,120 +1044,320 @@ Pixhawk3DWidget::updateTrail(float robotX, float robotY, float robotZ) } void -Pixhawk3DWidget::updateTarget(void) +Pixhawk3DWidget::updateImagery(double originX, double originY, double originZ, + const QString& zone) { - static double radius = 0.2; - static bool expand = true; - - if (radius < 0.1) + if (mapNode->getImageryType() == Imagery::BLANK_MAP) { - expand = true; + return; } - else if (radius > 0.25) + + double viewingRadius = cameraManipulator->getDistance() * 10.0; + if (viewingRadius < 100.0) { - expand = false; + viewingRadius = 100.0; } - if (targetNode->getNumDrawables() > 0) + double minResolution = 0.25; + double centerResolution = cameraManipulator->getDistance() / 50.0; + double maxResolution = 1048576.0; + + Imagery::ImageryType imageryType = mapNode->getImageryType(); + switch (imageryType) { - targetNode->removeDrawables(0, targetNode->getNumDrawables()); + case Imagery::GOOGLE_MAP: + minResolution = 0.25; + break; + case Imagery::GOOGLE_SATELLITE: + minResolution = 0.5; + break; + case Imagery::SWISSTOPO_SATELLITE: + minResolution = 0.25; + maxResolution = 0.25; + break; + default: {} } - osg::ref_ptr<osg::ShapeDrawable> sd = new osg::ShapeDrawable; - osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere; - sphere->setRadius(radius); - sd->setShape(sphere); - sd->setColor(osg::Vec4(0.0f, 0.7f, 1.0f, 1.0f)); - - targetNode->addDrawable(sd); + double resolution = minResolution; + while (resolution * 2.0 < centerResolution) + { + resolution *= 2.0; + } + if (resolution > maxResolution) + { + resolution = maxResolution; + } - if (expand) + mapNode->draw3D(viewingRadius, + resolution, + cameraManipulator->getCenter().y(), + cameraManipulator->getCenter().x(), + originX, + originY, + originZ, + zone); + + // prefetch map tiles + if (resolution / 2.0 >= minResolution) { - radius += 0.02; + mapNode->prefetch3D(viewingRadius / 2.0, + resolution / 2.0, + cameraManipulator->getCenter().y(), + cameraManipulator->getCenter().x(), + zone); } - else + if (resolution * 2.0 <= maxResolution) { - radius -= 0.02; + mapNode->prefetch3D(viewingRadius * 2.0, + resolution * 2.0, + cameraManipulator->getCenter().y(), + cameraManipulator->getCenter().x(), + zone); } + + mapNode->update(); } void Pixhawk3DWidget::updateWaypoints(void) { - if (uas) + waypointGroupNode->update(frame, uas); +} + +float colormap_jet[128][3] = +{ + {0.0f,0.0f,0.53125f}, + {0.0f,0.0f,0.5625f}, + {0.0f,0.0f,0.59375f}, + {0.0f,0.0f,0.625f}, + {0.0f,0.0f,0.65625f}, + {0.0f,0.0f,0.6875f}, + {0.0f,0.0f,0.71875f}, + {0.0f,0.0f,0.75f}, + {0.0f,0.0f,0.78125f}, + {0.0f,0.0f,0.8125f}, + {0.0f,0.0f,0.84375f}, + {0.0f,0.0f,0.875f}, + {0.0f,0.0f,0.90625f}, + {0.0f,0.0f,0.9375f}, + {0.0f,0.0f,0.96875f}, + {0.0f,0.0f,1.0f}, + {0.0f,0.03125f,1.0f}, + {0.0f,0.0625f,1.0f}, + {0.0f,0.09375f,1.0f}, + {0.0f,0.125f,1.0f}, + {0.0f,0.15625f,1.0f}, + {0.0f,0.1875f,1.0f}, + {0.0f,0.21875f,1.0f}, + {0.0f,0.25f,1.0f}, + {0.0f,0.28125f,1.0f}, + {0.0f,0.3125f,1.0f}, + {0.0f,0.34375f,1.0f}, + {0.0f,0.375f,1.0f}, + {0.0f,0.40625f,1.0f}, + {0.0f,0.4375f,1.0f}, + {0.0f,0.46875f,1.0f}, + {0.0f,0.5f,1.0f}, + {0.0f,0.53125f,1.0f}, + {0.0f,0.5625f,1.0f}, + {0.0f,0.59375f,1.0f}, + {0.0f,0.625f,1.0f}, + {0.0f,0.65625f,1.0f}, + {0.0f,0.6875f,1.0f}, + {0.0f,0.71875f,1.0f}, + {0.0f,0.75f,1.0f}, + {0.0f,0.78125f,1.0f}, + {0.0f,0.8125f,1.0f}, + {0.0f,0.84375f,1.0f}, + {0.0f,0.875f,1.0f}, + {0.0f,0.90625f,1.0f}, + {0.0f,0.9375f,1.0f}, + {0.0f,0.96875f,1.0f}, + {0.0f,1.0f,1.0f}, + {0.03125f,1.0f,0.96875f}, + {0.0625f,1.0f,0.9375f}, + {0.09375f,1.0f,0.90625f}, + {0.125f,1.0f,0.875f}, + {0.15625f,1.0f,0.84375f}, + {0.1875f,1.0f,0.8125f}, + {0.21875f,1.0f,0.78125f}, + {0.25f,1.0f,0.75f}, + {0.28125f,1.0f,0.71875f}, + {0.3125f,1.0f,0.6875f}, + {0.34375f,1.0f,0.65625f}, + {0.375f,1.0f,0.625f}, + {0.40625f,1.0f,0.59375f}, + {0.4375f,1.0f,0.5625f}, + {0.46875f,1.0f,0.53125f}, + {0.5f,1.0f,0.5f}, + {0.53125f,1.0f,0.46875f}, + {0.5625f,1.0f,0.4375f}, + {0.59375f,1.0f,0.40625f}, + {0.625f,1.0f,0.375f}, + {0.65625f,1.0f,0.34375f}, + {0.6875f,1.0f,0.3125f}, + {0.71875f,1.0f,0.28125f}, + {0.75f,1.0f,0.25f}, + {0.78125f,1.0f,0.21875f}, + {0.8125f,1.0f,0.1875f}, + {0.84375f,1.0f,0.15625f}, + {0.875f,1.0f,0.125f}, + {0.90625f,1.0f,0.09375f}, + {0.9375f,1.0f,0.0625f}, + {0.96875f,1.0f,0.03125f}, + {1.0f,1.0f,0.0f}, + {1.0f,0.96875f,0.0f}, + {1.0f,0.9375f,0.0f}, + {1.0f,0.90625f,0.0f}, + {1.0f,0.875f,0.0f}, + {1.0f,0.84375f,0.0f}, + {1.0f,0.8125f,0.0f}, + {1.0f,0.78125f,0.0f}, + {1.0f,0.75f,0.0f}, + {1.0f,0.71875f,0.0f}, + {1.0f,0.6875f,0.0f}, + {1.0f,0.65625f,0.0f}, + {1.0f,0.625f,0.0f}, + {1.0f,0.59375f,0.0f}, + {1.0f,0.5625f,0.0f}, + {1.0f,0.53125f,0.0f}, + {1.0f,0.5f,0.0f}, + {1.0f,0.46875f,0.0f}, + {1.0f,0.4375f,0.0f}, + {1.0f,0.40625f,0.0f}, + {1.0f,0.375f,0.0f}, + {1.0f,0.34375f,0.0f}, + {1.0f,0.3125f,0.0f}, + {1.0f,0.28125f,0.0f}, + {1.0f,0.25f,0.0f}, + {1.0f,0.21875f,0.0f}, + {1.0f,0.1875f,0.0f}, + {1.0f,0.15625f,0.0f}, + {1.0f,0.125f,0.0f}, + {1.0f,0.09375f,0.0f}, + {1.0f,0.0625f,0.0f}, + {1.0f,0.03125f,0.0f}, + {1.0f,0.0f,0.0f}, + {0.96875f,0.0f,0.0f}, + {0.9375f,0.0f,0.0f}, + {0.90625f,0.0f,0.0f}, + {0.875f,0.0f,0.0f}, + {0.84375f,0.0f,0.0f}, + {0.8125f,0.0f,0.0f}, + {0.78125f,0.0f,0.0f}, + {0.75f,0.0f,0.0f}, + {0.71875f,0.0f,0.0f}, + {0.6875f,0.0f,0.0f}, + {0.65625f,0.0f,0.0f}, + {0.625f,0.0f,0.0f}, + {0.59375f,0.0f,0.0f}, + {0.5625f,0.0f,0.0f}, + {0.53125f,0.0f,0.0f}, + {0.5f,0.0f,0.0f} +}; + +#ifdef QGC_LIBFREENECT_ENABLED +void +Pixhawk3DWidget::updateRGBD(void) +{ + rgb = freenect->getRgbData(); + coloredDepth = freenect->getColoredDepthData(); + pointCloud = freenect->get6DPointCloudData(); + + osg::Geometry* geometry = rgbd3DNode->getDrawable(0)->asGeometry(); + + osg::Vec3Array* vertices = static_cast<osg::Vec3Array*>(geometry->getVertexArray()); + osg::Vec4Array* colors = static_cast<osg::Vec4Array*>(geometry->getColorArray()); + for (int i = 0; i < pointCloud.size(); ++i) { - if (waypointsNode->getNumChildren() > 0) + double x = pointCloud[i].x; + double y = pointCloud[i].y; + double z = pointCloud[i].z; + (*vertices)[i].set(x, z, -y); + + if (enableRGBDColor) + { + (*colors)[i].set(pointCloud[i].r / 255.0f, + pointCloud[i].g / 255.0f, + pointCloud[i].b / 255.0f, + 1.0f); + } + else { - waypointsNode->removeChild(0, waypointsNode->getNumChildren()); + double dist = sqrt(x * x + y * y + z * z); + int colorIndex = static_cast<int>(fmin(dist / 7.0 * 127.0, 127.0)); + (*colors)[i].set(colormap_jet[colorIndex][0], + colormap_jet[colorIndex][1], + colormap_jet[colorIndex][2], + 1.0f); } + } - const QVector<Waypoint *>& list = uas->getWaypointManager().getWaypointList(); + if (geometry->getNumPrimitiveSets() == 0) + { + geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, + 0, pointCloud.size())); + } + else + { + osg::DrawArrays* drawarrays = static_cast<osg::DrawArrays*>(geometry->getPrimitiveSet(0)); + drawarrays->setCount(pointCloud.size()); + } +} +#endif - for (int i = 0; i < list.size(); i++) - { - osg::ref_ptr<osg::ShapeDrawable> sd = new osg::ShapeDrawable; - osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere; - sphere->setRadius(0.2); - sd->setShape(sphere); +int +Pixhawk3DWidget::findWaypoint(int mouseX, int mouseY) +{ + if (getSceneData() != NULL) + { + osgUtil::LineSegmentIntersector::Intersections intersections; - if (list.at(i)->getCurrent()) - { - sd->setColor(osg::Vec4(1.0f, 0.3f, 0.3f, 1.0f)); - } - else + if (computeIntersections(mouseX, height() - mouseY, intersections)) + { + for (osgUtil::LineSegmentIntersector::Intersections::iterator + it = intersections.begin(); it != intersections.end(); it++) { - sd->setColor(osg::Vec4(0.0f, 1.0f, 1.0f, 1.0f)); + for (uint i = 0 ; i < it->nodePath.size(); ++i) + { + std::string nodeName = it->nodePath[i]->getName(); + if (nodeName.substr(0, 2).compare("wp") == 0) + { + qDebug() << nodeName.c_str() << "Got!!"; + return atoi(nodeName.substr(2).c_str()); + } + } } - - osg::ref_ptr<osg::Geode> geode = new osg::Geode; - geode->addDrawable(sd); - - osg::ref_ptr<osg::PositionAttitudeTransform> pat = - new osg::PositionAttitudeTransform; - - pat->setPosition(osg::Vec3d(list.at(i)->getY() - uas->getLocalY(), - list.at(i)->getX() - uas->getLocalX(), - 0.0)); - - waypointsNode->addChild(pat); - pat->addChild(geode); } } + + return -1; } -#ifdef QGC_LIBFREENECT_ENABLED void -Pixhawk3DWidget::updateRGBD(void) +Pixhawk3DWidget::showInsertWaypointMenu(const QPoint &cursorPos) { - rgb = freenect->getRgbData(); - coloredDepth = freenect->getColoredDepthData(); + QMenu menu; + menu.addAction("Insert new waypoint", this, SLOT(insertWaypoint())); + menu.addAction("Clear all waypoints", this, SLOT(clearAllWaypoints())); + menu.exec(cursorPos); } -#endif void -Pixhawk3DWidget::markTarget(void) +Pixhawk3DWidget::showEditWaypointMenu(const QPoint &cursorPos) { - float robotZ = 0.0f; - if (uas != NULL) - { - robotZ = uas->getLocalZ(); - } - - std::pair<double,double> cursorWorldCoords = - getGlobalCursorPosition(getMouseX(), getMouseY(), -robotZ); - - double targetX = cursorWorldCoords.first; - double targetY = cursorWorldCoords.second; - double targetZ = robotZ; + QMenu menu; - targetPosition->setPosition(osg::Vec3d(targetY, targetX, -targetZ)); + QString text; + text = QString("Move waypoint %1").arg(QString::number(selectedWpIndex)); + menu.addAction(text, this, SLOT(moveWaypoint())); - displayTarget = true; + text = QString("Change altitude of waypoint %1").arg(QString::number(selectedWpIndex)); + menu.addAction(text, this, SLOT(setWaypointAltitude())); - if (uas) - { - uas->setTargetPosition(targetX, targetY, targetZ, 0.0f); - } + text = QString("Delete waypoint %1").arg(QString::number(selectedWpIndex)); + menu.addAction(text, this, SLOT(deleteWaypoint())); - targetButton->setChecked(false); + menu.addAction("Clear all waypoints", this, SLOT(clearAllWaypoints())); + menu.exec(cursorPos); } diff --git a/src/ui/map3D/Pixhawk3DWidget.h b/src/ui/map3D/Pixhawk3DWidget.h index be4e66d298d3464716e42654da545fa7797ef652..0cc499a131fa4e99c1a93be150ea6a63243115f9 100644 --- a/src/ui/map3D/Pixhawk3DWidget.h +++ b/src/ui/map3D/Pixhawk3DWidget.h @@ -33,11 +33,11 @@ #define PIXHAWK3DWIDGET_H #include <osgText/Text> -#ifdef QGC_OSGEARTH_ENABLED -#include <osgEarth/MapNode> -#endif +#include "HUDScaleGeode.h" +#include "Imagery.h" #include "ImageWindowGeode.h" +#include "WaypointGroupNode.h" #ifdef QGC_LIBFREENECT_ENABLED #include "Freenect.h" @@ -62,13 +62,22 @@ public slots: void setActiveUAS(UASInterface* uas); private slots: + void selectFrame(QString text); void showGrid(int state); void showTrail(int state); void showWaypoints(int state); + void selectMapSource(int index); void selectVehicleModel(int index); void recenter(void); void toggleFollowCamera(int state); + void insertWaypoint(void); + void moveWaypoint(void); + void setWaypoint(void); + void deleteWaypoint(void); + void setWaypointAltitude(void); + void clearAllWaypoints(void); + protected: QVector< osg::ref_ptr<osg::Node> > findVehicleModels(void); void buildLayout(void); @@ -79,46 +88,62 @@ protected: UASInterface* uas; private: + void getPose(double& x, double& y, double& z, + double& roll, double& pitch, double& yaw, + QString& utmZone); + void getPose(double& x, double& y, double& z, + double& roll, double& pitch, double& yaw); + void getPosition(double& x, double& y, double& z, + QString& utmZone); + void getPosition(double& x, double& y, double& z); + osg::ref_ptr<osg::Geode> createGrid(void); osg::ref_ptr<osg::Geode> createTrail(void); - -#ifdef QGC_OSGEARTH_ENABLED - osg::ref_ptr<osgEarth::MapNode> createMap(void); -#endif - - osg::ref_ptr<osg::Node> createTarget(void); - osg::ref_ptr<osg::Group> createWaypoints(void); + osg::ref_ptr<Imagery> createMap(void); osg::ref_ptr<osg::Geode> createRGBD3D(void); void setupHUD(void); void resizeHUD(void); - void updateHUD(float robotX, float robotY, float robotZ, - float robotRoll, float robotPitch, float robotYaw); - void updateTrail(float robotX, float robotY, float robotZ); - void updateTarget(void); + void updateHUD(double robotX, double robotY, double robotZ, + double robotRoll, double robotPitch, double robotYaw, + const QString& utmZone); + void updateTrail(double robotX, double robotY, double robotZ); + void updateImagery(double originX, double originY, double originZ, + const QString& zone); void updateWaypoints(void); #ifdef QGC_LIBFREENECT_ENABLED void updateRGBD(void); #endif - void markTarget(void); + int findWaypoint(int mouseX, int mouseY); + void showInsertWaypointMenu(const QPoint& cursorPos); + void showEditWaypointMenu(const QPoint& cursorPos); + + enum Mode { + DEFAULT_MODE, + MOVE_WAYPOINT_MODE + }; + Mode mode; + int selectedWpIndex; bool displayGrid; bool displayTrail; - bool displayTarget; + bool displayImagery; bool displayWaypoints; bool displayRGBD2D; bool displayRGBD3D; + bool enableRGBDColor; bool followCamera; - osg::ref_ptr<osg::Vec3Array> trailVertices; - QVarLengthArray<osg::Vec3, 10000> trail; + osg::ref_ptr<osg::Vec3dArray> trailVertices; + QVarLengthArray<osg::Vec3d, 10000> trail; osg::ref_ptr<osg::Node> vehicleModel; osg::ref_ptr<osg::Geometry> hudBackgroundGeometry; osg::ref_ptr<osgText::Text> statusText; + osg::ref_ptr<HUDScaleGeode> scaleGeode; osg::ref_ptr<ImageWindowGeode> rgb2DGeode; osg::ref_ptr<ImageWindowGeode> depth2DGeode; osg::ref_ptr<osg::Image> rgbImage; @@ -127,24 +152,21 @@ private: osg::ref_ptr<osg::Geode> trailNode; osg::ref_ptr<osg::Geometry> trailGeometry; osg::ref_ptr<osg::DrawArrays> trailDrawArrays; -#ifdef QGC_OSGEARTH_ENABLED - osg::ref_ptr<osgEarth::MapNode> mapNode; -#endif - osg::ref_ptr<osg::Geode> targetNode; - osg::ref_ptr<osg::PositionAttitudeTransform> targetPosition; - osg::ref_ptr<osg::Group> waypointsNode; + osg::ref_ptr<Imagery> mapNode; + osg::ref_ptr<WaypointGroupNode> waypointGroupNode; osg::ref_ptr<osg::Geode> rgbd3DNode; #ifdef QGC_LIBFREENECT_ENABLED QScopedPointer<Freenect> freenect; + QVector<Freenect::Vector6D> pointCloud; #endif + bool enableFreenect; QSharedPointer<QByteArray> rgb; QSharedPointer<QByteArray> coloredDepth; QVector< osg::ref_ptr<osg::Node> > vehicleModels; - QPushButton* targetButton; - - float lastRobotX, lastRobotY, lastRobotZ; + MAV_FRAME frame; + double lastRobotX, lastRobotY, lastRobotZ; }; #endif // PIXHAWK3DWIDGET_H diff --git a/src/ui/map3D/Q3DWidget.cc b/src/ui/map3D/Q3DWidget.cc index 21300459923b90d477531cf7545424936d62e799..91e1ad093f29ff235f904dbabefed8a71aa0021d 100644 --- a/src/ui/map3D/Q3DWidget.cc +++ b/src/ui/map3D/Q3DWidget.cc @@ -71,6 +71,9 @@ void Q3DWidget::init(float fps) { getCamera()->setGraphicsContext(osgGW); + + // manually specify near and far clip planes + getCamera()->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); setLightingMode(osg::View::SKY_LIGHT); @@ -149,8 +152,9 @@ Q3DWidget::createRobot(void) osg::ref_ptr<osg::Node> Q3DWidget::createHUD(void) { - hudProjectionMatrix->setMatrix(osg::Matrix::ortho2D(0, width(), - 0, height())); + hudProjectionMatrix->setMatrix(osg::Matrix::ortho(0.0, width(), + 0.0, height(), + -10.0, 10.0)); osg::ref_ptr<osg::MatrixTransform> hudModelViewMatrix( new osg::MatrixTransform); @@ -164,6 +168,7 @@ Q3DWidget::createHUD(void) hudGroup->setStateSet(hudStateSet); hudStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF); hudStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF); + hudStateSet->setMode(GL_BLEND, osg::StateAttribute::ON); hudStateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); hudStateSet->setRenderBinDetails(11, "RenderBin"); @@ -181,13 +186,13 @@ Q3DWidget::setCameraParams(float minZoomRange, float cameraFov, } void -Q3DWidget::moveCamera(float dx, float dy, float dz) +Q3DWidget::moveCamera(double dx, double dy, double dz) { cameraManipulator->move(dx, dy, dz); } void -Q3DWidget::recenterCamera(float x, float y, float z) +Q3DWidget::recenterCamera(double x, double y, double z) { cameraManipulator->setCenter(osg::Vec3d(x, y, z)); } @@ -256,8 +261,9 @@ Q3DWidget::getMouseY(void) void Q3DWidget::resizeGL(int width, int height) { - hudProjectionMatrix->setMatrix(osg::Matrix::ortho2D(0, width, - 0, height)); + hudProjectionMatrix->setMatrix(osg::Matrix::ortho(0.0, width, + 0.0, height, + -10.0, 10.0)); osgGW->getEventQueue()->windowResize(0, 0, width, height); osgGW->resized(0 , 0, width, height); @@ -385,18 +391,6 @@ Q3DWidget::wheelEvent(QWheelEvent* event) osgGA::GUIEventAdapter::SCROLL_DOWN); } -float -Q3DWidget::r2d(float angle) -{ - return angle * 57.295779513082320876f; -} - -float -Q3DWidget::d2r(float angle) -{ - return angle * 0.0174532925199432957692f; -} - osgGA::GUIEventAdapter::KeySymbol Q3DWidget::convertKey(int key) const { diff --git a/src/ui/map3D/Q3DWidget.h b/src/ui/map3D/Q3DWidget.h index 0dcd8d91f1716e129a7b7fcfb45f2fa2403c92d7..62639508b94ad9eb2ccce225ef2a535f61bdfbe7 100644 --- a/src/ui/map3D/Q3DWidget.h +++ b/src/ui/map3D/Q3DWidget.h @@ -33,7 +33,7 @@ This file is part of the QGROUNDCONTROL project #define Q3DWIDGET_H #include <QtOpenGL> - +#include <inttypes.h> #include <osg/LineSegment> #include <osg/PositionAttitudeTransform> @@ -88,12 +88,12 @@ public: * @param dy Translation along the y-axis in meters. * @param dz Translation along the z-axis in meters. */ - void moveCamera(float dx, float dy, float dz); + void moveCamera(double dx, double dy, double dz); /** * @brief Recenters the camera at (x,y,z). */ - void recenterCamera(float x, float y, float z); + void recenterCamera(double x, double y, double z); /** * @brief Sets up 3D display mode. @@ -211,20 +211,6 @@ protected: */ virtual void wheelEvent(QWheelEvent* event); - /** - * @brief Converts radians to degrees. - * @param angle Angle in radians. - * @return angle in degrees. - */ - float r2d(float angle); - - /** - * @brief Converts degrees to radians. - * @param angle Angle in degrees. - * @return angle in radians. - */ - float d2r(float angle); - /** * @brief Converts Qt-defined key to OSG-defined key. * @param key Qt-defined key. diff --git a/src/ui/map3D/QGCGoogleEarthControls.ui b/src/ui/map3D/QGCGoogleEarthControls.ui new file mode 100644 index 0000000000000000000000000000000000000000..4b7d6a45fb2f7258aed5a05c7df837f1dc0b7b66 --- /dev/null +++ b/src/ui/map3D/QGCGoogleEarthControls.ui @@ -0,0 +1,21 @@ +<ui version="4.0" > + <author></author> + <comment></comment> + <exportmacro></exportmacro> + <class>Form</class> + <widget class="QWidget" name="Form" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle" > + <string>Form</string> + </property> + </widget> + <pixmapfunction></pixmapfunction> + <connections/> +</ui> diff --git a/src/ui/map3D/QGCGoogleEarthView.cc b/src/ui/map3D/QGCGoogleEarthView.cc new file mode 100644 index 0000000000000000000000000000000000000000..be3154cd9cef42cbdf25897a3c07081d8956e2f8 --- /dev/null +++ b/src/ui/map3D/QGCGoogleEarthView.cc @@ -0,0 +1,145 @@ +#include <QWebFrame> +#include <QWebPage> + +#include <QDebug> + +#include "QGCGoogleEarthView.h" +#include "QGCWebPage.h" +#include "UASManager.h" +#include "ui_QGCGoogleEarthControls.h" +#if (defined Q_OS_WIN) && !(defined __MINGW32__) +#include "ui_QGCGoogleEarthViewWin.h" +#else +#include "ui_QGCGoogleEarthView.h" +#endif + +QGCGoogleEarthView::QGCGoogleEarthView(QWidget *parent) : + QWidget(parent), + updateTimer(new QTimer(this)), + mav(NULL), + followCamera(true), +#if (defined Q_OS_MAC) + webViewMac(new QWebView(this)), +#endif +#if (defined Q_OS_WIN) & !(defined __MINGW32__) + webViewWin(new QGCWebAxWidget(this)), +#else + ui(new Ui::QGCGoogleEarthView) +#endif +{ +#if (defined Q_OS_WIN) & !(defined __MINGW32__) + // Create layout and attach webViewWin +#else +#endif + + ui->setupUi(this); + +#if (defined Q_OS_MAC) + ui->webViewLayout->addWidget(webViewMac); + webViewMac->setPage(new QGCWebPage(webViewMac)); + webViewMac->settings()->setAttribute(QWebSettings::PluginsEnabled, true); + webViewMac->load(QUrl("earth.html")); +#endif + +#if (defined Q_OS_WIN) & !(defined __MINGW32__) + webViewWin->load(QUrl("earth.html")); +#endif + +#if ((defined Q_OS_MAC) | ((defined Q_OS_WIN) & !(defined __MINGW32__))) + connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*))); + connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateState())); + updateTimer->start(200); +#endif + + // Get list of available 3D models + + // Load HTML file + + // Parse for model links + + // Populate model list +} + +QGCGoogleEarthView::~QGCGoogleEarthView() +{ + delete ui; +} + +void QGCGoogleEarthView::setActiveUAS(UASInterface* uas) +{ + mav = uas; +} + +void QGCGoogleEarthView::showTrail(int state) +{ + +} + +void QGCGoogleEarthView::showWaypoints(int state) +{ + +} + +void QGCGoogleEarthView::follow(bool follow) +{ + +} + +void QGCGoogleEarthView::updateState() +{ +#ifdef Q_OS_MAC + if (webViewMac->page()->currentFrame()->evaluateJavaScript("isInitialized();").toBool()) + { + static bool initialized = false; + if (!initialized) + { + webViewMac->page()->currentFrame()->evaluateJavaScript("setGCSHome(22.679833,8.549444, 470);"); + initialized = true; + } + int uasId = 0; + double lat = 22.679833; + double lon = 8.549444; + double alt = 470.0; + + float roll = 0.0f; + float pitch = 0.0f; + float yaw = 0.0f; + + if (mav) + { + uasId = mav->getUASID(); + lat = mav->getLatitude(); + lon = mav->getLongitude(); + alt = mav->getAltitude(); + roll = mav->getRoll(); + pitch = mav->getPitch(); + yaw = mav->getYaw(); + } + webViewMac->page()->currentFrame()->evaluateJavaScript(QString("setAircraftPositionAttitude(%1, %2, %3, %4, %6, %7, %8);") + .arg(uasId) + .arg(lat) + .arg(lon) + .arg(alt+500) + .arg(roll) + .arg(pitch) + .arg(yaw)); + + if (followCamera) + { + webViewMac->page()->currentFrame()->evaluateJavaScript(QString("updateFollowAircraft()")); + } + } +#endif +} + +void QGCGoogleEarthView::changeEvent(QEvent *e) +{ + QWidget::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} diff --git a/src/ui/map3D/QGCGoogleEarthView.h b/src/ui/map3D/QGCGoogleEarthView.h new file mode 100644 index 0000000000000000000000000000000000000000..d7d2e9da9b456de1b9342b094593793714412b1d --- /dev/null +++ b/src/ui/map3D/QGCGoogleEarthView.h @@ -0,0 +1,87 @@ +#ifndef QGCGOOGLEEARTHVIEW_H +#define QGCGOOGLEEARTHVIEW_H + +#include <QWidget> +#include <QTimer> +#include <UASInterface.h> + +#if (defined Q_OS_MAC) +#include <QWebView> +#endif + +#if (defined Q_OS_WIN) && !(defined __MINGW32__) + QGCWebAxWidget* webViewWin; +#include <ActiveQt/QAxWidget> +#include "windows.h" + +class WebAxWidget : public QAxWidget +{ +public: + + WebAxWidget(QWidget* parent = 0, Qt::WindowFlags f = 0) + : QAxWidget(parent, f) + { + } +protected: + virtual bool translateKeyEvent(int message, int keycode) const + { + if (message >= WM_KEYFIRST && message <= WM_KEYLAST) + return true; + else + return QAxWidget::translateKeyEvent(message, keycode); + } + +}; +#else +namespace Ui { + class QGCGoogleEarthControls; +#if (defined Q_OS_WIN) && !(defined __MINGW32__) + class QGCGoogleEarthViewWin; +#else + class QGCGoogleEarthView; +#endif +} +#endif + +class QGCGoogleEarthView : public QWidget +{ + Q_OBJECT + +public: + explicit QGCGoogleEarthView(QWidget *parent = 0); + ~QGCGoogleEarthView(); + +public slots: + /** @brief Update the internal state. Does not trigger a redraw */ + void updateState(); + /** @brief Set the currently selected UAS */ + void setActiveUAS(UASInterface* uas); + /** @brief Show the vehicle trail */ + void showTrail(int state); + /** @brief Show the waypoints */ + void showWaypoints(int state); + /** @brief Follow the aircraft during flight */ + void follow(bool follow); + +protected: + void changeEvent(QEvent *e); + QTimer* updateTimer; + UASInterface* mav; + bool followCamera; +#if (defined Q_OS_WIN) && !(defined __MINGW32__) + WebAxWidget* webViewWin; +#endif +#if (defined Q_OS_MAC) + QWebView* webViewMac; +#endif + +private: + Ui::QGCGoogleEarthControls* controls; +#if (defined Q_OS_WIN) && !(defined __MINGW32__) + Ui::QGCGoogleEarthViewWin* ui; +#else + Ui::QGCGoogleEarthView* ui; +#endif +}; + +#endif // QGCGOOGLEEARTHVIEW_H diff --git a/src/ui/map3D/QGCGoogleEarthView.ui b/src/ui/map3D/QGCGoogleEarthView.ui new file mode 100644 index 0000000000000000000000000000000000000000..0731e9a0013d1f44ff78a88b619c158c9aff5f30 --- /dev/null +++ b/src/ui/map3D/QGCGoogleEarthView.ui @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>QGCGoogleEarthView</class> + <widget class="QWidget" name="QGCGoogleEarthView"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>597</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="horizontalSpacing"> + <number>10</number> + </property> + <property name="verticalSpacing"> + <number>5</number> + </property> + <property name="margin"> + <number>2</number> + </property> + <item row="0" column="0" colspan="6"> + <layout class="QVBoxLayout" name="webViewLayout"/> + </item> + <item row="1" column="0"> + <widget class="QComboBox" name="mavComboBox"/> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="goHomeButton"> + <property name="text"> + <string>Home</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QCheckBox" name="followAirplaneCheckbox"> + <property name="text"> + <string>Follow</string> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QCheckBox" name="trailCheckbox"> + <property name="text"> + <string>Trail</string> + </property> + </widget> + </item> + <item row="1" column="4"> + <widget class="QPushButton" name="clearWPButton"> + <property name="text"> + <string>Clear WPs</string> + </property> + </widget> + </item> + <item row="1" column="5"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>177</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/ui/map3D/QGCGoogleEarthViewWin.ui b/src/ui/map3D/QGCGoogleEarthViewWin.ui new file mode 100644 index 0000000000000000000000000000000000000000..4b7d6a45fb2f7258aed5a05c7df837f1dc0b7b66 --- /dev/null +++ b/src/ui/map3D/QGCGoogleEarthViewWin.ui @@ -0,0 +1,21 @@ +<ui version="4.0" > + <author></author> + <comment></comment> + <exportmacro></exportmacro> + <class>Form</class> + <widget class="QWidget" name="Form" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle" > + <string>Form</string> + </property> + </widget> + <pixmapfunction></pixmapfunction> + <connections/> +</ui> diff --git a/src/ui/map3D/QGCWebPage.cc b/src/ui/map3D/QGCWebPage.cc new file mode 100644 index 0000000000000000000000000000000000000000..ffdd649701b06481510e68279c643950f1e3ea37 --- /dev/null +++ b/src/ui/map3D/QGCWebPage.cc @@ -0,0 +1,12 @@ +#include "QGCWebPage.h" +#include <QDebug> + +QGCWebPage::QGCWebPage(QObject *parent) : + QWebPage(parent) +{ +} + +void QGCWebPage::javaScriptConsoleMessage ( const QString & message, int lineNumber, const QString & sourceID ) +{ + qDebug() << "JAVASCRIPT: " << lineNumber << sourceID << message; +} diff --git a/src/ui/map3D/QGCWebPage.h b/src/ui/map3D/QGCWebPage.h new file mode 100644 index 0000000000000000000000000000000000000000..f7783c9a33c6d84206043188031ca50a54ac0e08 --- /dev/null +++ b/src/ui/map3D/QGCWebPage.h @@ -0,0 +1,21 @@ +#ifndef QGCWEBPAGE_H +#define QGCWEBPAGE_H + +#include <QWebPage> + +class QGCWebPage : public QWebPage +{ + Q_OBJECT +public: + explicit QGCWebPage(QObject *parent = 0); + +signals: + +public slots: + +protected: + void javaScriptConsoleMessage ( const QString & message, int lineNumber, const QString & sourceID ); + +}; + +#endif // QGCWEBPAGE_H diff --git a/src/ui/map3D/Texture.cc b/src/ui/map3D/Texture.cc index 43703e8929a913ec877d20d1382009042f1c667d..54c3f39461eb5ab37310041ec2fcd9c4aa76bd79 100644 --- a/src/ui/map3D/Texture.cc +++ b/src/ui/map3D/Texture.cc @@ -33,18 +33,46 @@ This file is part of the QGROUNDCONTROL project #include "Texture.h" -Texture::Texture() - : _is3D(false) +Texture::Texture(unsigned int _id) + : id(_id) + , texture2D(new osg::Texture2D) + , geometry(new osg::Geometry) { texture2D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST); texture2D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST); - GLuint id; - glGenTextures(1, &id); - t->setID(id); - glBindTexture(GL_TEXTURE_2D, id); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + texture2D->setDataVariance(osg::Object::DYNAMIC); + texture2D->setResizeNonPowerOfTwoHint(false); + + osg::ref_ptr<osg::Image> image = new osg::Image; + texture2D->setImage(image); + + osg::ref_ptr<osg::Vec3dArray> vertices(new osg::Vec3dArray(4)); + geometry->setVertexArray(vertices); + + osg::ref_ptr<osg::Vec2Array> textureCoords = new osg::Vec2Array; + textureCoords->push_back(osg::Vec2(0.0f, 1.0f)); + textureCoords->push_back(osg::Vec2(1.0f, 1.0f)); + textureCoords->push_back(osg::Vec2(1.0f, 0.0f)); + textureCoords->push_back(osg::Vec2(0.0f, 0.0f)); + geometry->setTexCoordArray(0, textureCoords); + + geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, + 0, 4)); + + osg::ref_ptr<osg::Vec4Array> colors(new osg::Vec4Array); + colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); + geometry->setColorArray(colors); + geometry->setColorBinding(osg::Geometry::BIND_OVERALL); + + geometry->setUseDisplayList(false); + + osg::ref_ptr<osg::LineWidth> linewidth(new osg::LineWidth); + linewidth->setWidth(2.0f); + geometry->getOrCreateStateSet()-> + setAttributeAndModes(linewidth, osg::StateAttribute::ON); + geometry->getOrCreateStateSet()-> + setMode(GL_LIGHTING, osg::StateAttribute::OFF); } const QString& @@ -53,199 +81,89 @@ Texture::getSourceURL(void) const return sourceURL; } -void -Texture::setId(unsigned int _id) -{ - id = _id; -} - void Texture::sync(const WebImagePtr& image) { state = static_cast<State>(image->getState()); if (image->getState() != WebImage::UNINITIALIZED && - (sourceURL != image->getSourceURL() || - _is3D != image->is3D())) + sourceURL != image->getSourceURL()) { sourceURL = image->getSourceURL(); - _is3D = image->is3D(); } if (image->getState() == WebImage::READY && image->getSyncFlag()) { image->setSyncFlag(false); - if (image->getWidth() != imageWidth || - image->getHeight() != imageHeight) + if (texture2D->getImage() != NULL) { - imageWidth = image->getWidth(); - textureWidth = 32; - while (textureWidth < imageWidth) - { - textureWidth *= 2; - } - imageHeight = image->getHeight(); - textureHeight = 32; - while (textureHeight < imageHeight) - { - textureHeight *= 2; - } - - maxU = static_cast<double>(imageWidth) - / static_cast<double>(textureWidth); - maxV = static_cast<double>(imageHeight) - / static_cast<double>(textureHeight); - - osg::ref_ptr<osg::Image> image; - image->setImage(textureWidth, textureHeight, 8, 3, GL_RGBA, GL_UNSIGNED_BYTES, NULL, osg::Image::USE_NEW_DELETE); - - texture2D-> - glBindTexture(GL_TEXTURE_2D, id); - glTexImage2D(GL_TEXTURE_2D, 0, 3, textureWidth, textureHeight, - 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + texture2D->getImage()->setImage(image->getWidth(), + image->getHeight(), + 1, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + image->getImageData(), + osg::Image::NO_DELETE); + texture2D->getImage()->dirty(); } - - glBindTexture(GL_TEXTURE_2D, id); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, imageWidth, imageHeight, - GL_RGBA, GL_UNSIGNED_BYTE, image->getImageData()); - - heightModel = image->getHeightModel(); } } osg::ref_ptr<osg::Geometry> -Texture::draw(float x1, float y1, float x2, float y2, +Texture::draw(double x1, double y1, double x2, double y2, + double z, bool smoothInterpolation) const { - return draw(x1, y1, x2, y1, x2, y2, x1, y2, smoothInterpolation); + return draw(x1, y1, x2, y1, x2, y2, x1, y2, z, smoothInterpolation); } osg::ref_ptr<osg::Geometry> -Texture::draw(float x1, float y1, float x2, float y2, - float x3, float y3, float x4, float y4, +Texture::draw(double x1, double y1, double x2, double y2, + double x3, double y3, double x4, double y4, + double z, bool smoothInterpolation) const { - osg::ref_ptr<osg::Geometry> geometry(new osg::Geometry); - osg::ref_ptr<osg::StateSet> stateset(new osg::StateSet); + osg::Vec3dArray* vertices = + static_cast<osg::Vec3dArray*>(geometry->getVertexArray()); + (*vertices)[0].set(x1, y1, z); + (*vertices)[1].set(x2, y2, z); + (*vertices)[2].set(x3, y3, z); + (*vertices)[3].set(x4, y4, z); + + osg::DrawArrays* drawarrays = + static_cast<osg::DrawArrays*>(geometry->getPrimitiveSet(0)); + osg::Vec4Array* colors = + static_cast<osg::Vec4Array*>(geometry->getColorArray()); if (state == REQUESTED) { - osg::ref_ptr<osg::Vec2Array> vertices(new osg::Vec2Array); - vertices->push_back(osg::Vec2(x1, y1)); - vertices->push_back(osg::Vec2(x2, y2)); - vertices->push_back(osg::Vec2(x3, y3)); - vertices->push_back(osg::Vec2(x4, y4)); - - geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, - 0, vertices->size())); - - geometry->setVertexArray(vertices); - - osg::ref_ptr<osg::Vec4Array> color(new osg::Vec4Array); - color->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); - geometry->setColorArray(color); - geometry->setColorBinding(osg::Geometry::BIND_OVERALL); + drawarrays->set(osg::PrimitiveSet::LINE_LOOP, 0, 4); + (*colors)[0].set(0.0f, 0.0f, 1.0f, 1.0f); + geometry->getOrCreateStateSet()-> + setTextureAttributeAndModes(0, texture2D, osg::StateAttribute::OFF); + return geometry; } - stateset->setTextureAttributeAndModes(id, texture2D); - - float dx, dy; if (smoothInterpolation) { texture2D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); texture2D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); - dx = 1.0f / (2.0f * textureWidth); - dy = 1.0f / (2.0f * textureHeight); } else { texture2D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST); texture2D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST); - dx = 0.0f; - dy = 0.0f; } - glColor3f(1.0f, 1.0f, 1.0f); - if (!_is3D) - { - osg::ref_ptr<osg::Vec2Array> tc = new osg::Vec2Array; - - geometry->setTexCoordArray(id, tc); - tc->push_back(osg::Vec2(dx, maxV - dy)); - tc->push_back(osg::Vec2(maxU - dx, maxV - dy)); - tc->push_back(osg::Vec2(maxU - dx, dy)); - tc->push_back(osg::Vec2(dx, dy)); - - glBegin(GL_QUADS); - glTexCoord2f(dx, maxV - dy); - glVertex3f(x1, y1, 0.0f); - glTexCoord2f(maxU - dx, maxV - dy); - glVertex3f(x2, y2, 0.0f); - glTexCoord2f(maxU - dx, dy); - glVertex3f(x3, y3, 0.0f); - glTexCoord2f(dx, dy); - glVertex3f(x4, y4, 0.0f); - glEnd(); - } - else - { - float scaleX = 1.0f / static_cast<float>(heightModel.size() - 1); + drawarrays->set(osg::PrimitiveSet::POLYGON, 0, 4); + (*colors)[0].set(1.0f, 1.0f, 1.0f, 1.0f); - for (int32_t i = 0; i < heightModel.size() - 1; ++i) - { - float scaleI = scaleX * static_cast<float>(i); - - float scaleY = - 1.0f / static_cast<float>(heightModel[i].size() - 1); - - float x1i = x1 + scaleI * (x4 - x1); - float x1f = x2 + scaleI * (x3 - x2); - float x2i = x1i + scaleX * (x4 - x1); - float x2f = x1f + scaleX * (x3 - x2); - - for (int32_t j = 0; j < heightModel[i].size() - 1; ++j) - { - float scaleJ = scaleY * static_cast<float>(j); - - float y1i = y1 + scaleJ * (y2 - y1); - float y1f = y4 + scaleJ * (y3 - y4); - float y2i = y1i + scaleY * (y2 - y1); - float y2f = y1f + scaleY * (y3 - y4); - - float nx1 = x1i + scaleJ * (x1f - x1i); - float nx2 = x1i + (scaleJ + scaleY) * (x1f - x1i); - float nx3 = x2i + (scaleJ + scaleY) * (x2f - x2i); - float nx4 = x2i + scaleJ * (x2f - x2i); - float ny1 = y1i + scaleI * (y1f - y1i); - float ny2 = y2i + scaleI * (y2f - y2i); - float ny3 = y2i + (scaleI + scaleX) * (y2f - y2i); - float ny4 = y1i + (scaleI + scaleX) * (y1f - y1i); - - glBegin(GL_QUADS); - glTexCoord2f(dx + scaleJ * (maxU - dx * 2.0f), - dy + (1.0f - scaleI) * (maxV - dy * 2.0f)); - glVertex3f(nx1, ny1, -static_cast<float>(heightModel[i][j])); - glTexCoord2f(dx + (scaleJ + scaleY) * (maxU - dx * 2.0f), - dy + (1.0f - scaleI) * (maxV - dy * 2.0f)); - glVertex3f(nx2, ny2, -static_cast<float>(heightModel[i][j + 1])); - glTexCoord2f(dx + (scaleJ + scaleY) * (maxU - dx * 2.0f), - dy + (1.0f - scaleI - scaleX) * (maxV - dy * 2.0f)); - glVertex3f(nx3, ny3, -static_cast<float>(heightModel[i + 1][j + 1])); - glTexCoord2f(dx + scaleJ * (maxU - dx * 2.0f), - dy + (1.0f - scaleI - scaleX) * (maxV - dy * 2.0f)); - glVertex3f(nx4, ny4, -static_cast<float>(heightModel[i + 1][j])); - - glEnd(); - } - } - } -} + geometry->getOrCreateStateSet()-> + setTextureAttributeAndModes(0, texture2D, osg::StateAttribute::ON); -bool -Texture::is3D(void) const -{ - return _is3D; + return geometry; } diff --git a/src/ui/map3D/Texture.h b/src/ui/map3D/Texture.h index 6907c831d8dc4abcdc1ddbf3320475a0bc168869..8bf82ab3b677a8e1a29198d8b1f60f5b4f1fda96 100644 --- a/src/ui/map3D/Texture.h +++ b/src/ui/map3D/Texture.h @@ -32,14 +32,10 @@ This file is part of the QGROUNDCONTROL project #ifndef TEXTURE_H #define TEXTURE_H -#if (defined __APPLE__) & (defined __MACH__) -#include <OpenGL/gl.h> -#else -#include <GL/gl.h> -#endif #include <inttypes.h> #include <osg/ref_ptr> #include <osg/Geometry> +#include <osg/Texture2D> #include <QSharedPointer> #include "WebImage.h" @@ -47,7 +43,7 @@ This file is part of the QGROUNDCONTROL project class Texture { public: - Texture(); + explicit Texture(unsigned int _id); const QString& getSourceURL(void) const; @@ -55,14 +51,14 @@ public: void sync(const WebImagePtr& image); - osg::ref_ptr<osg::Geometry> draw(float x1, float y1, float x2, float y2, + osg::ref_ptr<osg::Geometry> draw(double x1, double y1, double x2, double y2, + double z, bool smoothInterpolation) const; - osg::ref_ptr<osg::Geometry> draw(float x1, float y1, float x2, float y2, - float x3, float y3, float x4, float y4, + osg::ref_ptr<osg::Geometry> draw(double x1, double y1, double x2, double y2, + double x3, double y3, double x4, double y4, + double z, bool smoothInterpolation) const; - bool is3D(void) const; - private: enum State { @@ -75,18 +71,7 @@ private: QString sourceURL; unsigned int id; osg::ref_ptr<osg::Texture2D> texture2D; - - int32_t textureWidth; - int32_t textureHeight; - - int32_t imageWidth; - int32_t imageHeight; - - bool _is3D; - QVector< QVector<int32_t> > heightModel; - - float maxU; - float maxV; + osg::ref_ptr<osg::Geometry> geometry; }; typedef QSharedPointer<Texture> TexturePtr; diff --git a/src/ui/map3D/TextureCache.cc b/src/ui/map3D/TextureCache.cc index 3337f5235cef19f118bb9f12f5c8d14dc1a2c6aa..5e36a72c79a6dda90858f4a522f3d3583d496b2d 100644 --- a/src/ui/map3D/TextureCache.cc +++ b/src/ui/map3D/TextureCache.cc @@ -37,28 +37,26 @@ TextureCache::TextureCache(uint32_t _cacheSize) { for (uint32_t i = 0; i < cacheSize; ++i) { - TexturePtr t(new Texture); - t->setId(i); + TexturePtr t(new Texture(i)); textures.push_back(t); } } TexturePtr -TextureCache::get(const QString& tileURL, bool useHeightModel) +TextureCache::get(const QString& tileURL) { - QPair<TexturePtr, int32_t> p1 = lookup(tileURL, useHeightModel); + QPair<TexturePtr, int32_t> p1 = lookup(tileURL); if (!p1.first.isNull()) { return p1.first; } - QPair<WebImagePtr, int32_t> p2 = - imageCache->lookup(tileURL, useHeightModel); + QPair<WebImagePtr, int32_t> p2 = imageCache->lookup(tileURL); if (!p2.first.isNull()) { textures[p2.second]->sync(p2.first); - p1 = lookup(tileURL, useHeightModel); + p1 = lookup(tileURL); return p1.first; } @@ -79,12 +77,11 @@ TextureCache::sync(void) } QPair<TexturePtr, int32_t> -TextureCache::lookup(const QString& tileURL, bool useHeightModel) +TextureCache::lookup(const QString& tileURL) { for (int32_t i = 0; i < textures.size(); ++i) { - if (textures[i]->getSourceURL() == tileURL && - textures[i]->is3D() == useHeightModel) + if (textures[i]->getSourceURL() == tileURL) { return qMakePair(textures[i], i); } diff --git a/src/ui/map3D/TextureCache.h b/src/ui/map3D/TextureCache.h index ef469a124ea11f352e60d43cb6044dd0cb9f3836..25be665b90f82560549d35237e17688566432a53 100644 --- a/src/ui/map3D/TextureCache.h +++ b/src/ui/map3D/TextureCache.h @@ -42,13 +42,12 @@ class TextureCache public: explicit TextureCache(uint32_t cacheSize); - TexturePtr get(const QString& tileURL, bool useHeightModel = false); + TexturePtr get(const QString& tileURL); void sync(void); private: - QPair<TexturePtr, int32_t> lookup(const QString& tileURL, - bool useHeightModel); + QPair<TexturePtr, int32_t> lookup(const QString& tileURL); bool requireSync(void) const; diff --git a/src/ui/map3D/WaypointGroupNode.cc b/src/ui/map3D/WaypointGroupNode.cc new file mode 100644 index 0000000000000000000000000000000000000000..cc706157f47a0500d2195acdd278f1a3060e283f --- /dev/null +++ b/src/ui/map3D/WaypointGroupNode.cc @@ -0,0 +1,173 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL 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. + + QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. + +======================================================================*/ + +/** + * @file + * @brief Definition of the class WaypointGroupNode. + * + * @author Lionel Heng <hengli@student.ethz.ch> + * + */ + +#include "WaypointGroupNode.h" + +#include <osg/LineWidth> +#include <osg/PositionAttitudeTransform> +#include <osg/ShapeDrawable> + +#include "Imagery.h" + +WaypointGroupNode::WaypointGroupNode() +{ + +} + +void +WaypointGroupNode::init(void) +{ + +} + +void +WaypointGroupNode::update(MAV_FRAME frame, UASInterface *uas) +{ + if (uas) + { + double robotX, robotY, robotZ; + if (frame == MAV_FRAME_GLOBAL) + { + double latitude = uas->getLatitude(); + double longitude = uas->getLongitude(); + double altitude = uas->getAltitude(); + + QString utmZone; + Imagery::LLtoUTM(latitude, longitude, robotX, robotY, utmZone); + robotZ = -altitude; + } + else if (frame == MAV_FRAME_LOCAL) + { + robotX = uas->getLocalX(); + robotY = uas->getLocalY(); + robotZ = uas->getLocalZ(); + } + + if (getNumChildren() > 0) + { + removeChild(0, getNumChildren()); + } + + const QVector<Waypoint *>& list = uas->getWaypointManager().getWaypointList(); + + for (int i = 0; i < list.size(); i++) + { + Waypoint* wp = list.at(i); + + double wpX, wpY, wpZ; + getPosition(wp, wpX, wpY, wpZ); + + osg::ref_ptr<osg::ShapeDrawable> sd = new osg::ShapeDrawable; + osg::ref_ptr<osg::Cylinder> cylinder = + new osg::Cylinder(osg::Vec3d(0.0, 0.0, -wpZ / 2.0), + wp->getOrbit(), + fabs(wpZ)); + + sd->setShape(cylinder); + sd->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON); + + if (wp->getCurrent()) + { + sd->setColor(osg::Vec4(1.0f, 0.3f, 0.3f, 0.5f)); + } + else + { + sd->setColor(osg::Vec4(0.0f, 1.0f, 0.0f, 0.5f)); + } + + osg::ref_ptr<osg::Geode> geode = new osg::Geode; + geode->addDrawable(sd); + + char wpLabel[10]; + sprintf(wpLabel, "wp%d", i); + geode->setName(wpLabel); + + if (i < list.size() - 1) + { + double nextWpX, nextWpY, nextWpZ; + getPosition(list.at(i + 1), nextWpX, nextWpY, nextWpZ); + + osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry; + osg::ref_ptr<osg::Vec3dArray> vertices = new osg::Vec3dArray; + vertices->push_back(osg::Vec3d(0.0, 0.0, -wpZ)); + vertices->push_back(osg::Vec3d(nextWpY - wpY, + nextWpX - wpX, + -nextWpZ)); + geometry->setVertexArray(vertices); + + osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array; + colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 0.5f)); + geometry->setColorArray(colors); + geometry->setColorBinding(osg::Geometry::BIND_OVERALL); + + geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 2)); + + osg::ref_ptr<osg::LineWidth> linewidth(new osg::LineWidth()); + linewidth->setWidth(2.0f); + geometry->getOrCreateStateSet()->setAttributeAndModes(linewidth, osg::StateAttribute::ON); + geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); + + geode->addDrawable(geometry); + } + + osg::ref_ptr<osg::PositionAttitudeTransform> pat = + new osg::PositionAttitudeTransform; + + pat->setPosition(osg::Vec3d(wpY - robotY, + wpX - robotX, + robotZ)); + + addChild(pat); + pat->addChild(geode); + } + } +} + +void +WaypointGroupNode::getPosition(Waypoint* wp, double &x, double &y, double &z) +{ + if (wp->getFrame() == MAV_FRAME_GLOBAL) + { + double latitude = wp->getY(); + double longitude = wp->getX(); + double altitude = wp->getZ(); + + QString utmZone; + Imagery::LLtoUTM(latitude, longitude, x, y, utmZone); + z = -altitude; + } + else if (wp->getFrame() == MAV_FRAME_LOCAL) + { + x = wp->getX(); + y = wp->getY(); + z = wp->getZ(); + } +} diff --git a/src/ui/map3D/WaypointGroupNode.h b/src/ui/map3D/WaypointGroupNode.h new file mode 100644 index 0000000000000000000000000000000000000000..1c1c4de8ec46e55c2f8ccb0bdfd1bd1e8d360f91 --- /dev/null +++ b/src/ui/map3D/WaypointGroupNode.h @@ -0,0 +1,51 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL 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. + + QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. + +======================================================================*/ + +/** + * @file + * @brief Definition of the class WaypointGroupNode. + * + * @author Lionel Heng <hengli@student.ethz.ch> + * + */ + +#ifndef WAYPOINTGROUPNODE_H +#define WAYPOINTGROUPNODE_H + +#include <osg/Group> + +#include "UASInterface.h" + +class WaypointGroupNode : public osg::Group +{ +public: + WaypointGroupNode(); + + void init(void); + void update(MAV_FRAME frame, UASInterface* uas); + +private: + void getPosition(Waypoint* wp, double& x, double& y, double& z); +}; + +#endif // WAYPOINTGROUPNODE_H diff --git a/src/ui/map3D/WebImage.cc b/src/ui/map3D/WebImage.cc index 466d6879542f23cd21e030c3390d850d1966e648..23cf20769b09c795dcc0dbfeeb96aa549c5362c1 100644 --- a/src/ui/map3D/WebImage.cc +++ b/src/ui/map3D/WebImage.cc @@ -39,7 +39,6 @@ WebImage::WebImage() , sourceURL("") , image(0) , lastReference(0) - , _is3D(false) , syncFlag(false) { @@ -52,7 +51,6 @@ WebImage::clear(void) sourceURL.clear(); state = WebImage::UNINITIALIZED; lastReference = 0; - heightModel.clear(); } WebImage::State @@ -79,18 +77,12 @@ WebImage::setSourceURL(const QString& url) sourceURL = url; } -const uint8_t* +uchar* WebImage::getImageData(void) const { return image->scanLine(0); } -const QVector< QVector<int32_t> >& -WebImage::getHeightModel(void) const -{ - return heightModel; -} - bool WebImage::setData(const QByteArray& data) { @@ -131,90 +123,32 @@ WebImage::setData(const QString& filename) } } -bool -WebImage::setData(const QString& imageFilename, const QString& heightFilename) -{ - QFile heightFile(heightFilename); - - QImage tempImage; - if (tempImage.load(imageFilename) && heightFile.open(QIODevice::ReadOnly)) - { - if (image.isNull()) - { - image.reset(new QImage); - } - *image = QGLWidget::convertToGLFormat(tempImage); - - QDataStream heightDataStream(&heightFile); - - // read in width and height values for height map - char header[8]; - heightDataStream.readRawData(header, 8); - - int32_t height = *(reinterpret_cast<int32_t *>(header)); - int32_t width = *(reinterpret_cast<int32_t *>(header + 4)); - - char buffer[height * width * sizeof(int32_t)]; - heightDataStream.readRawData(buffer, height * width * sizeof(int32_t)); - - heightModel.clear(); - for (int32_t i = 0; i < height; ++i) - { - QVector<int32_t> scanline; - for (int32_t j = 0; j < width; ++j) - { - int32_t n = *(reinterpret_cast<int32_t *>(buffer - + (i * height + j) - * sizeof(int32_t))); - scanline.push_back(n); - } - heightModel.push_back(scanline); - } - - heightFile.close(); - - _is3D = true; - - return true; - } - else - { - return false; - } -} - -int32_t +int WebImage::getWidth(void) const { return image->width(); } -int32_t +int WebImage::getHeight(void) const { return image->height(); } -int32_t +int WebImage::getByteCount(void) const { return image->byteCount(); } -bool -WebImage::is3D(void) const -{ - return _is3D; -} - -uint64_t +ulong WebImage::getLastReference(void) const { return lastReference; } void -WebImage::setLastReference(uint64_t value) +WebImage::setLastReference(ulong value) { lastReference = value; } diff --git a/src/ui/map3D/WebImage.h b/src/ui/map3D/WebImage.h index c4dc2a1d31a57ede192c049d735960ac06af0dd6..21d8546b3ea1990fce4b49b39bd8cf8bc4bb7c2b 100644 --- a/src/ui/map3D/WebImage.h +++ b/src/ui/map3D/WebImage.h @@ -57,20 +57,16 @@ public: const QString& getSourceURL(void) const; void setSourceURL(const QString& url); - const uint8_t* getImageData(void) const; - const QVector< QVector<int32_t> >& getHeightModel(void) const; + uchar* getImageData(void) const; bool setData(const QByteArray& data); bool setData(const QString& filename); - bool setData(const QString& imageFilename, const QString& heightFilename); - int32_t getWidth(void) const; - int32_t getHeight(void) const; - int32_t getByteCount(void) const; + int getWidth(void) const; + int getHeight(void) const; + int getByteCount(void) const; - bool is3D(void) const; - - uint64_t getLastReference(void) const; - void setLastReference(uint64_t value); + ulong getLastReference(void) const; + void setLastReference(ulong value); bool getSyncFlag(void) const; void setSyncFlag(bool onoff); @@ -79,9 +75,7 @@ private: State state; QString sourceURL; QScopedPointer<QImage> image; - QVector< QVector<int32_t> > heightModel; - uint64_t lastReference; - bool _is3D; + ulong lastReference; bool syncFlag; }; diff --git a/src/ui/map3D/WebImageCache.cc b/src/ui/map3D/WebImageCache.cc index 2203f2141422c44370d7ca71807ea78cdf95675c..aca9e4fa4360cc4226e59f7b6bfaf1e95f6f512a 100644 --- a/src/ui/map3D/WebImageCache.cc +++ b/src/ui/map3D/WebImageCache.cc @@ -52,15 +52,14 @@ WebImageCache::WebImageCache(QObject* parent, uint32_t _cacheSize) } QPair<WebImagePtr, int32_t> -WebImageCache::lookup(const QString& url, bool useHeightModel) +WebImageCache::lookup(const QString& url) { QPair<WebImagePtr, int32_t> cacheEntry; for (int32_t i = 0; i < webImages.size(); ++i) { if (webImages[i]->getState() != WebImage::UNINITIALIZED && - webImages[i]->getSourceURL() == url && - webImages[i]->is3D() == useHeightModel) + webImages[i]->getSourceURL() == url) { cacheEntry.first = webImages[i]; cacheEntry.second = i; @@ -111,22 +110,7 @@ WebImageCache::lookup(const QString& url, bool useHeightModel) } else { - bool success; - - if (useHeightModel) - { - QString heightURL = url; - heightURL.replace("color", "dom"); - heightURL.replace(".jpg", ".txt"); - - success = cacheEntry.first->setData(url, heightURL); - } - else - { - success = cacheEntry.first->setData(url); - } - - if (success) + if (cacheEntry.first->setData(url)) { cacheEntry.first->setSyncFlag(true); cacheEntry.first->setState(WebImage::READY); diff --git a/src/ui/map3D/WebImageCache.h b/src/ui/map3D/WebImageCache.h index 7b2f1ea6b8163ab1cf165a1a4997cdb0a05fcc41..d482d717a60b2338e5a2f20e1e8beda680211759 100644 --- a/src/ui/map3D/WebImageCache.h +++ b/src/ui/map3D/WebImageCache.h @@ -45,8 +45,7 @@ class WebImageCache : public QObject public: WebImageCache(QObject* parent, uint32_t cacheSize); - QPair<WebImagePtr, int32_t> lookup(const QString& url, - bool useHeightModel); + QPair<WebImagePtr, int32_t> lookup(const QString& url); WebImagePtr at(int32_t index) const;