function processEntry($serverID, $e, $sync_mode = SYNC_INSERT_FLIGHT_LINK) { global $CONF; global $DBGcat, $DBGlvl; if ($DBGlvl > 0) { echo "<PRE>"; print_r($e); echo "</PRE>"; } if (is_array($e['ActionXML'])) { $actionData =& $e['ActionXML']; } else { if (is_array($e['actionData'])) { $actionData =& $e['actionData']; } else { if (is_array($e['flight'])) { $actionData =& $e; } else { return array(0, "logReplicator::processEntry : actionData section not found"); } } } // if this log entry is not for a flight of the specific server // then check if we are allowesd to accpet these flights from this server if (isset($actionData['flight']['serverID'])) { $thisEntryServerID = $actionData['flight']['serverID']; } else { if (isset($e['serverID'])) { $thisEntryServerID = $e['serverID']; } else { return array(0, "logReplicator::processEntry : ServerID for Log entry could not be determined "); } } if ($thisEntryServerID != $serverID) { $wrongServer = 1; if (is_array($CONF['servers']['list'][$serverID]['accept_also_servers'])) { if (in_array($thisEntryServerID, $CONF['servers']['list'][$serverID]['accept_also_servers'])) { $wrongServer = 0; } } if ($wrongServer) { return array(0, "logReplicator::processEntry : We dont accept flights originally from server " . $thisEntryServerID); } } if ($e['type'] == '1') { // flight if ($e['action'] == 4) { // delete $flightIDlocal = logReplicator::findFlight($actionData['flight']['serverID'], $actionData['flight']['id']); if (!$flightIDlocal) { return array(0, "logReplicator::processEntry : Flight with serverID " . $actionData['flight']['serverID'] . " and original ID : " . $actionData['flight']['id'] . " is not found in the local DB -> Wont delete it"); } // echo "Will delete flight $flightIDlocal<BR>"; $extFlight = new flight(); $extFlight->getFlightFromDB($flightIDlocal, 0); $extFlight->deleteFlight(); return array(1, "Flight with local ID: {$flightIDlocal} DELETED"); } if ($e['action'] == 16) { // rename tracklog $flightIDlocal = logReplicator::findFlight($e['serverID'], $e['id']); if (!$flightIDlocal) { return array(0, "logReplicator::processEntry : Flight with serverID " . $e['serverID'] . " and original ID : " . $e['id'] . " is not found in the local DB -> Wont rename tracklog<BR>"); } $extFlight = new flight(); $extFlight->getFlightFromDB($flightIDlocal, 0); $extFlight->renameTracklog($actionData['newFilename'], $actionData['oldFilename']); return array(1, "Flight tracklog renamed for local ID {$flightIDlocal}"); } if ($e['action'] == 8) { // scoring info $flightIDlocal = logReplicator::findFlight($e['serverID'], $e['id']); if (!$flightIDlocal) { return array(0, "logReplicator::processEntry : Flight with serverID " . $e['serverID'] . " and original ID : " . $e['id'] . " is not found in the local DB -> Wont update scoring<BR>"); } // echo "Will update scoring info for flight $flightIDlocal<BR>"; // no need to pull flight info //$extFlight=new flight(); //$extFlight->getFlightFromDB($flightIDlocal,0); require_once dirname(__FILE__) . '/CL_flightScore.php'; $flightScore = new flightScore($flightIDlocal); // we have the score array in $actionData['score'] $sArr =& $actionData['score']; $flightScore->fromSyncArray($sArr); //put also in scores table, the flight is sure to be present in flights table $flightScore->putToDB(1, 1); return array(1, "Flight Score was *pulled* for local ID {$flightIDlocal}"); } // now deal with add/update $getValidationData = 1; $getScoreData = 1; // check 'alien' pilot and insert him or update him anyway $userServerID = $actionData['flight']['serverID']; if ($userServerID == 0) { $userServerID = $serverID; } // echo "logReplicator::checkPilot"; list($effectiveServerID, $effectiveUserID) = logReplicator::checkPilot($userServerID, $actionData['flight']['pilot']); //echo "effectiveServerID: $effectiveServerID, effectiveUserID: $effectiveUserID // userServerID: $userServerID, userID: ".$actionData['flight']['pilot']['userID']."<BR>"; // check if a maping took place and LOG it!! if ($effectiveServerID != $userServerID || $effectiveUserID != $actionData['flight']['pilot']['userID']) { $orgUserIDstr = $userServerID + 0 . '_' . $actionData['flight']['pilot']['userID']; } else { $orgUserIDstr = ''; } // $userIDstr=$userServerID.'_'.$actionData['flight']['pilot']['userID']; $userIDstr = $effectiveServerID . '_' . $effectiveUserID; list($nearestTakeoffID, $nearestDistance) = logReplicator::checkLocation($userServerID, $actionData['flight']['location'], $actionData['flight']['bounds']); list($nearestLandingID, $nearestLandingDistance) = findNearestWaypoint($actionData['flight']['bounds']['lastLat'], $actionData['flight']['bounds']['lastLon']); // get only the first 2 bits $externalFlightType = $sync_mode & 0x3; $addFlightNote = ''; // if action ==update check to see if the flight exists ! if ($e['action'] == 2) { $flightIDlocal = logReplicator::findFlight($actionData['flight']['serverID'], $actionData['flight']['id']); if (!$flightIDlocal) { // we then INSERT IT instead echo " [Not found,will insert] "; $e['action'] = 1; } } else { if ($e['action'] == 1) { // if action == insert we make an extra check to see if the fligh is there, if yes we UPDATE instead $flightIDlocal = logReplicator::findFlight($actionData['flight']['serverID'], $actionData['flight']['id']); if ($flightIDlocal) { // we then UPDATE IT instead echo " [Already here,will update] "; $e['action'] = 2; } } } if ($e['action'] == 1) { // add $igcFilename = $actionData['flight']['filename']; $igcFileURL = $actionData['flight']['linkIGC']; $igcZipFileURL = $actionData['flight']['linkIGCzip']; $tempFilename = LEONARDO_ABS_PATH . '/' . $CONF['paths']['tmpigc'] . '/' . $igcFilename; $hash = $actionData['flight']['validation']['hash']; $sameHashIDarray = flight::findSameHash($hash); if (count($sameHashIDarray) > 0) { $isFlightDup = 0; $markFlightAsDisabled = 1; $msg = ''; if ($CONF['servers']['list'][$actionData['flight']['serverID']]['allow_duplicate_flights']) { foreach ($sameHashIDarray as $sameHashFlightInfo) { if ($sameHashFlightInfo['serverID'] == $actionData['flight']['serverID']) { // from same server $isFlightDup = 1; $msg .= " local flight: " . $sameHashFlightInfo['serverID'] . '_' . $sameHashFlightInfo['ID'] . " , new entry:" . $actionData['flight']['serverID'] . '_' . $actionData['flight']['id']; break; } else { // we have a flight with same hash that is not from this specific server. // HERE we must make the decision whether to mark this flight as DISABLED // WE always mark this new flight as DISABLED because : // the local flight takes precedence anyway. // ONE case // we are DHV mirror , the new flight is from DHV and there is a dup from XContest // we should insert, // SO INSERT TAKES PRECEDENCE OVER LINKED FLIGHTS } } } else { $isFlightDup = 1; } if ($isFlightDup) { return array(-1, "Flight already exists : {$msg}"); } } /* if ($CONF['servers']['list'][$actionData['flight']['serverID']]['allow_duplicate_flights']) { $sameHashIDarray=flight::findSameHash( $hash , $actionData['flight']['serverID'] ); if (count($sameHashIDarray)>0 ) { return array(-1,"Flight already exists in local with ID: $sameHashID (dups allowed)"); continue; } else { // $addFlightNote="*(Duplicate Flight)*"; } } else { $sameHashIDarray=flight::findSameHash( $hash ); if (count($sameHashIDarray)>0 ) { return array(-1,"Flight already exists in local with ID: $sameHashID"); continue; } } */ } else { if ($e['action'] == 2) { // update // This is not needed , we have found $flightIDlocal earlier and if it didnt exist we will insert it instead /* $flightIDlocal=logReplicator::findFlight($actionData['flight']['serverID'],$actionData['flight']['id']); if (!$flightIDlocal) { return array(0,"logReplicator::processEntry : Flight with serverID ".$actionData['flight']['serverID']." and original ID : ". $actionData['flight']['id']." is not found in the local DB -> Wont update<BR>"); } */ // echo "Will update flight $flightIDlocal<BR>"; } } $thisCat = $actionData['flight']['info']['cat'] + 0; // when we get data from leonardo servers, we just ignore these fields // since they can be computed on the fly $originalURL = htmlDecode($actionData['flight']['linkDisplay']); $originalKML = htmlDecode($actionData['flight']['linkGE']); if ($actionData['flight']['serverID'] != 0) { global $CONF; if ($CONF['servers']['list'][$actionData['flight']['serverID']]['isLeo'] == 1) { $originalURL = ''; $originalKML = ''; } } $argArray = array("private" => $actionData['flight']['info']['private'] + 0, "cat" => $actionData['flight']['info']['gliderCat'] + 0, "linkURL" => $actionData['flight']['info']['linkURL'], "comments" => $actionData['flight']['info']['comments'], "glider" => $actionData['flight']['info']['glider'], "gliderBrandID" => $actionData['flight']['info']['gliderBrandID'] + 0, "category" => $thisCat >= 0 ? $thisCat : 0, "dateAdded" => $actionData['flight']['dateAdded'], "originalURL" => $originalURL, "originalKML" => $originalKML, "original_ID" => $actionData['flight']['id'], "serverID" => $actionData['flight']['serverID'], "userServerID" => $actionData['flight']['serverID'], "originalUserID" => $orgUserIDstr, "externalFlightType" => $externalFlightType, "allowDuplicates" => $CONF['servers']['list'][$actionData['flight']['serverID']]['allow_duplicate_flights'] + 0); // print_r($argArray); if ($e['action'] == 1 && $sync_mode & SYNC_INSERT_FLIGHT_LOCAL & SYNC_INSERT_FLIGHT_REPROCESS_LOCALLY) { if (!($igcFileStr = fetchURL($igcFileURL, 20))) { return array(0, "logReplicator::processEntry() : Cannot Fetch {$igcFileURL}"); } writeFile($tempFilename, $igcFileStr); list($res, $flightID) = addFlightFromFile($tempFilename, 0, $userIDstr, $argArray); if ($res != 1) { return array(-128, "Problem: " . getAddFlightErrMsg($res, $flightID)); } return array(1, "Flight *pulled* OK with local ID {$flightID}"); } else { // if ( ( $e['action']==1 && $sync_mode & SYNC_INSERT_FLIGHT_LINK ) || $e['action']==2 ){ // inserting in LINK / LOCAL mode or updates - NOT reproccess if ($e['action'] == 1) { $extFlight = new flight(); // get igc if required if ($sync_mode & SYNC_INSERT_FLIGHT_LOCAL) { echo " Geting IGC file : "; if (!$e['tmpDir']) { $e['tmpDir'] = '/tmp'; } $igcFileTmp = $e['tmpDir'] . '/' . $actionData['flight']['id'] . '.igc'; if (!is_file($igcFileTmp)) { echo "igc file: {$igcFileURL}<BR>\n"; echo "tmpfile: {$igcFileTmp}<BR>\n"; echo "NOT in zip -> will fetch ..."; if (!($igcFileStr = fetchURL($igcFileURL, 20))) { return array(0, "logReplicator::processEntry() : Cannot Fetch {$igcFileURL}"); } writeFile($igcFileTmp, $igcFileStr); } else { echo "IN zip -> will use that ..."; } } } else { $extFlight = new flight(); $extFlight->getFlightFromDB($flightIDlocal, 0); } $igcFilename = $actionData['flight']['filename']; $igcFileURL = $actionData['flight']['linkIGC']; if ($CONF['servers']['list'][$actionData['flight']['serverID']]['exclude_from_list']) { $extFlight->excludeFrom |= 3; } if ($CONF['servers']['list'][$actionData['flight']['serverID']]['exclude_from_league']) { $extFlight->excludeFrom |= 2; } foreach ($argArray as $fieldName => $fieldValue) { // if the flight is already present // we must tkae care to honor ONLY // the 1st bit of 'private' , the others are used locally !! if ($fieldName == 'private') { if ($fieldValue & 0x1) { $fieldValue = $extFlight->private | 0x1; } else { if ($fieldValue & 0x4) { // visible to friends $fieldValue = $extFlight->private | 0x4; } else { $fieldValue = $extFlight->private & 0xfa; } } } $extFlight->{$fieldName} = $fieldValue; } // echo " gliderBrandID : $extFlight->gliderBrandID #<BR>"; $extFlight->takeoffID = $nearestTakeoffID; $extFlight->takeoffVinicity = $nearestDistance; $extFlight->landingID = $nearestLandingID; $extFlight->landingVinicity = $nearestLandingDistance; // no userid will be assgined to this flight since it will not be inserted locally // so userID= userServerID; // $extFlight->userID=$extFlight->originalUserID; // now we take care of mapping between users $extFlight->userID = $effectiveUserID; $extFlight->userServerID = $effectiveServerID; $extFlight->dateAdded = $actionData['flight']['dateAdded']; $extFlight->DATE = $actionData['flight']['time']['date']; $extFlight->timezone = $actionData['flight']['time']['Timezone'] + 0; $extFlight->START_TIME = $actionData['flight']['time']['StartTime'] + 0; $extFlight->DURATION = $actionData['flight']['time']['Duration'] + 0; $extFlight->END_TIME = $extFlight->START_TIME + $extFlight->DURATION; $extFlight->forceBounds = $actionData['flight']['bounds']['forceBounds'] + 0; $extFlight->firstLon = $actionData['flight']['bounds']['firstLon'] + 0; $extFlight->firstLat = $actionData['flight']['bounds']['firstLat'] + 0; $extFlight->firstPointTM = $actionData['flight']['bounds']['firstTM'] + 0; $extFlight->lastLon = $actionData['flight']['bounds']['lastLon'] + 0; $extFlight->lastLat = $actionData['flight']['bounds']['lastLat'] + 0; $extFlight->lastPointTM = $actionData['flight']['bounds']['lastTM'] + 0; $firstPoint = new gpsPoint(); $firstPoint->setLon($actionData['flight']['bounds']['firstLon']); $firstPoint->setLat($actionData['flight']['bounds']['firstLat']); $firstPoint->gpsTime = $actionData['flight']['bounds']['firstTM'] % 86400; $lastPoint = new gpsPoint(); $lastPoint->setLon($actionData['flight']['bounds']['lastLon']); $lastPoint->setLat($actionData['flight']['bounds']['lastLat']); $lastPoint->gpsTime = $actionData['flight']['bounds']['lastTM'] % 86400; // $extFlight->FIRST_POINT=$firstPoint->to_IGC_Record(); // $extFlight->LAST_POINT=$lastPoint->to_IGC_Record(); // not used!! /* if ( is_array($actionData['flight']['turnpoints']) ) { foreach ($actionData['flight']['turnpoints'] as $i=>$tp){ $tpNum=$tp['id']; $tpPoint=new gpsPoint(); $tpPoint->setLon($tp['lon']); $tpPoint->setLat($tp['lat']); $varname="turnpoint$tpNum" ; $extFlight->$varname = $tpPoint->getLatMin().' '.$tpPoint->getLonMin() ; } } */ if ($getValidationData) { $extFlight->validated = $actionData['flight']['validation']['validated']; $extFlight->grecord = $actionData['flight']['validation']['grecord']; $extFlight->hash = $actionData['flight']['validation']['hash']; $extFlight->validationMessage = $actionData['flight']['validation']['validationMessage']; $extFlight->airspaceCheck = $actionData['flight']['validation']['airspaceCheck'] + 0; $extFlight->airspaceCheckFinal = $actionData['flight']['validation']['airspaceCheckFinal'] + 0; $extFlight->airspaceCheckMsg = $actionData['flight']['validation']['airspaceCheckMsg']; } $getScoreDataExtra = 0; $getScoreDataExtraMissing = 0; if ($getScoreData) { // we should get these from the [score] section also $extFlight->BEST_FLIGHT_TYPE = $actionData['flight']['stats']['FlightType']; $extFlight->FLIGHT_KM = $actionData['flight']['stats']['XCdistance']; $extFlight->FLIGHT_POINTS = $actionData['flight']['stats']['XCscore']; $extFlight->LINEAR_DISTANCE = $actionData['flight']['stats']['StraightDistance'] + 0; $extFlight->MAX_LINEAR_DISTANCE = $actionData['flight']['stats']['MaxStraightDistance'] + 0; $extFlight->MEAN_SPEED = $actionData['flight']['stats']['MeanGliderSpeed'] + 0; $extFlight->MAX_SPEED = $actionData['flight']['stats']['MaxSpeed'] + 0; $extFlight->MAX_VARIO = $actionData['flight']['stats']['MaxVario'] + 0; $extFlight->MIN_VARIO = $actionData['flight']['stats']['MinVario'] + 0; $extFlight->MAX_ALT = $actionData['flight']['stats']['MaxAltASL'] + 0; $extFlight->MIN_ALT = $actionData['flight']['stats']['MinAltASL'] + 0; $extFlight->TAKEOFF_ALT = $actionData['flight']['stats']['TakeoffAlt'] + 0; if (is_array($actionData['flight']['score']) && count($actionData['flight']['score']) > 0) { require_once dirname(__FILE__) . '/CL_flightScore.php'; $flightScore = new flightScore($extFlight->flightID); // we have the score array in $actionData['score'] $sArr =& $actionData['flight']['score']; $flightScore->fromSyncArray($sArr); $extFlight->flightScore = $flightScore; $getScoreDataExtra = 1; $extFlight->BEST_FLIGHT_TYPE = $flightScore->bestScoreType; $extFlight->FLIGHT_KM = $flightScore->bestDistance * 1000; $extFlight->FLIGHT_POINTS = $flightScore->bestScore; // check for missing linear distance if ($extFlight->LINEAR_DISTANCE == 0 && $extFlight->MAX_LINEAR_DISTANCE > 0) { // echo "compute MAxtakeoffDistance"; $extFlight->LINEAR_DISTANCE = $flightScore->computeMaxTakeoffDistance($firstPoint); } //put also in scores table, the flight is sure to be present in flights table if ($e['action'] == 2) { // update so we already know the flightID $flightScore->putToDB(1, 1); } } else { $getScoreDataExtraMissing = 1; } } // we also have [gliderBrand] => GRADIENT $extFlight->checkGliderBrand($actionData['flight']['info']['gliderBrand']); if ($e['action'] == 1) { if ($sync_mode & SYNC_INSERT_FLIGHT_LOCAL) { $tmpPilot = new pilot($effectiveServerID, $effectiveUserID); $tmpPilot->createDirs(); $extFlight->filename = $igcFilename; $extFlight->checkDirs(); if ($DBGlvl > 0) { echo "Moving file into place: " . $extFlight->getIGCFilename() . "<BR>"; } while (is_file($extFlight->getIGCFilename())) { if ($DBGlvl > 0) { echo "Same filename is already present<BR>"; } $extFlight->filename = '_' . $extFlight->filename; } @rename($igcFileTmp, $extFlight->getIGCFilename()); $opString = '*inserted*'; } else { $opString = '*linked*'; } // insert flight $extFlight->putFlightToDB(0); // take care of sme flights (hide /unhide) $extFlight->hideSameFlights(); if ($getScoreData && $getScoreDataExtra) { $flightScore->flightID = $extFlight->flightID; $flightScore->putToDB(1, 1); } else { if ($getScoreDataExtraMissing && $CONF['servers']['list'][$actionData['flight']['serverID']]['rescore_if_missing'] && $sync_mode & SYNC_INSERT_FLIGHT_LOCAL) { echo " [Re-score] "; $extFlight->computeScore(); } } return array(1, "Flight {$opString} OK {$addFlightNote} with local ID {$extFlight->flightID}"); } else { //update flight $extFlight->putFlightToDB(1); if ($getScoreDataExtraMissing && $CONF['servers']['list'][$actionData['flight']['serverID']]['rescore_if_missing'] && $sync_mode & SYNC_INSERT_FLIGHT_LOCAL) { echo " [Re-score] "; require_once dirname(__FILE__) . '/CL_flightScore.php'; $flightScore = new flightScore($extFlight->flightID); $flightScore->getFromDB(); if ($flightScore->gotValues) { echo "[not needed] "; } else { $extFlight->computeScore(); } } return array(1, "Flight with local ID {$flightIDlocal} UPDATED OK"); } } return array(0, "Unknown error, we should have returned by this far..."); } // if type==1 }
return; } if ($_REQUEST['updateMap']) $flight->getMapFromServer(); // if ($_REQUEST['updateMap3d']) $flight->getMapFromServer(1); if ($_REQUEST['updateCharts']) $flight->updateCharts(1); if ($_REQUEST['updateData']) { $flight->getFlightFromIGC( $flight->getIGCFilename() ); $flight->updateTakeoffLanding(); $flight->createEncodedPolyline(1); $flight->makeJSON(1); $flight->putFlightToDB(1); // 1== UPDATE } $flight->checkDirs(); //Added 27.11.2011 for localhost installations P.Wild $flight->updateAll(0); //echo "START<br>"; $location=formatLocation(getWaypointName($flight->takeoffID),$flight->takeoffVinicity,$takeoffRadious); // $firstPoint=new gpsPoint($flight->FIRST_POINT,$flight->timezone); $firstPoint=new gpsPoint('',$flight->timezone); $firstPoint->setLat($flight->firstLat); $firstPoint->setLon($flight->firstLon); $firstPoint->gpsTime=$flight->firstPointTM; if ($_REQUEST['updateScore'] || $flight->FLIGHT_POINTS==0) { $flight->computeScore(); // $flight->putFlightToDB(1); // 1== UPDATE
if ($_REQUEST['updateMap']) { $flight->getMapFromServer(); } // if ($_REQUEST['updateMap3d']) $flight->getMapFromServer(1); if ($_REQUEST['updateCharts']) { $flight->updateCharts(1); } if ($_REQUEST['updateData']) { $flight->getFlightFromIGC($flight->getIGCFilename()); $flight->updateTakeoffLanding(); $flight->createEncodedPolyline(1); $flight->makeJSON(1); $flight->putFlightToDB(1); // 1== UPDATE } $flight->checkDirs(); //Added 27.11.2011 for localhost installations P.Wild $flight->updateAll(0); //echo "START<br>"; $location = formatLocation(getWaypointName($flight->takeoffID), $flight->takeoffVinicity, $takeoffRadious); // $firstPoint=new gpsPoint($flight->FIRST_POINT,$flight->timezone); $firstPoint = new gpsPoint('', $flight->timezone); $firstPoint->setLat($flight->firstLat); $firstPoint->setLon($flight->firstLon); $firstPoint->gpsTime = $flight->firstPointTM; if ($_REQUEST['updateScore'] || $flight->FLIGHT_POINTS == 0) { $flight->computeScore(); // $flight->putFlightToDB(1); // 1== UPDATE } if ($CONF_use_validation) { if ($flight->grecord == 0) {
function addFlightFromFile($filename, $calledFromForm, $userIDstr, $argArray = array()) { global $CONF_default_cat_add, $CONF_photosPerFlight, $CONF; global $CONF_NAC_list, $CONF_use_NAC, $CONF_use_validation, $CONF_airspaceChecks, $CONF_server_id; global $userID, $CONF_new_flights_submit_window; global $flightsTable; set_time_limit(120); global $CONF_server_id; list($thisServerID, $userIDforFlight) = splitServerPilotStr($userIDstr); if (!$thisServerID) { $thisServerID = $CONF_server_id; } require_once dirname(__FILE__) . '/CL_actionLogger.php'; $log = new Logger(); $log->userID = $userID + 0; // the userId that is logged in , not the one that the flight will be atrributed to $log->ItemType = 1; // flight; $log->ItemID = 0; // 0 at start will fill in later if successfull $log->ServerItemID = $thisServerID; $log->ActionID = 1; //1 => add 2 => edit; $log->ActionXML = ''; $log->Modifier = 0; $log->ModifierID = 0; $log->ServerModifierID = 0; $log->Result = 0; $log->ResultDescription = ""; if (!$filename) { $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_YOU_HAVENT_SUPPLIED_A_FLIGHT_FILE, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } return array(ADD_FLIGHT_ERR_YOU_HAVENT_SUPPLIED_A_FLIGHT_FILE, 0); } // now is the time to remove bad chars from the filename! $newFilename = str_replace("'", " ", $filename); $newFilename = toLatin1($newFilename); if ($newFilename != $filename) { rename($filename, $newFilename); $filename = $newFilename; } if (!is_file($filename)) { $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_NO_SUCH_FILE, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } return array(ADD_FLIGHT_ERR_NO_SUCH_FILE, 0); } if (strtolower(substr($filename, -4)) != ".igc") { $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_FILE_DOESNT_END_IN_IGC, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } return array(ADD_FLIGHT_ERR_FILE_DOESNT_END_IN_IGC, 0); } $tmpIGCPath = $filename; $flight = new flight(); if ($thisServerID != $CONF_server_id) { $flight->userServerID = $thisServerID; } $flight->userID = $userIDforFlight; /* $flight->cat=$gliderCat; $flight->private=$is_private; $flight->category=$category; $flight->comments=$comments; $flight->glider=$glider; $flight->linkURL=$linkURL; */ foreach ($argArray as $varName => $varValue) { if ($varName == 'NACclubID' || $varName == 'NACid' || $varName == 'comments') { continue; } $flight->{$varName} = $varValue; } $comments = $argArray['comments']; if ($comments) { $flight->commentsNum = 1; } if (strtolower(substr($flight->linkURL, 0, 7)) == "http://") { $flight->linkURL = substr($flight->linkURL, 7); } if ($flight->cat == -1) { $flight->cat = $CONF_default_cat_add; } # martin jursa 22.06.2008: # in case the glider is not given otherwise, try to extract it from the IGC file if (empty($flight->glider)) { $flight->glider = extractGlider($lines); } // if no brand was given , try to detect $flight->checkGliderBrand(); // we must cope with some cases here // 1. more flights in the igc // 2. garmin saved paths -> zero time difference -> SOLVED! if (!$flight->getFlightFromIGC($tmpIGCPath)) { $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_THIS_ISNT_A_VALID_IGC_FILE, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } return array(ADD_FLIGHT_ERR_THIS_ISNT_A_VALID_IGC_FILE, 0); } // Compute hash now $lines = file($tmpIGCPath); $hash = md5(implode('', $lines)); $flight->hash = $hash; unset($lines); // check for mac newlines -> NOT USED NOW // we now use auto_detect_line_endings=true; /* if ( count ($lines)==1) { if ($lines[0]=preg_replace("/\r([^\n])/","\r\n\\1",$lines[0])) { DEBUG('addFlightFromFile',1,"addFlightFromFile: MAC newlines found<BR>"); if (!$handle = fopen($tmpIGCPath, 'w')) { print "Cannot open file ($filename)"; exit; } if (!fwrite($handle, $lines[0])) { print "Cannot write to file ($filename)"; exit; } fclose($handle); } } */ // echo $flight->DATE ." > ". date("Y-m-d",time()+3600*10) ."<BR>"; // check for dates in the furure if ($flight->DATE > date("Y-m-d", time() + 3600 * 10)) { @unlink($flight->getIGCFilename(1)); @unlink($tmpIGCPath . ".olc"); @unlink($tmpIGCPath); $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_DATE_IN_THE_FUTURE, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } return array(ADD_FLIGHT_ERR_DATE_IN_THE_FUTURE, 0); } // Two week time limit check - P.Wild /// Modification martin jursa 08.05.2007 cancel the upload if flight is too old if ($CONF_new_flights_submit_window > 0) { if (!L_auth::isAdmin($userID)) { if ($flight->DATE < date("Y-m-d", time() - $CONF_new_flights_submit_window * 24 * 3600)) { @unlink($flight->getIGCFilename(1)); @unlink($tmpIGCPath . ".olc"); @unlink($tmpIGCPath); $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_OUTSIDE_SUBMIT_WINDOW, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } return array(ADD_FLIGHT_ERR_OUTSIDE_SUBMIT_WINDOW, 0); } } } // end martin / peter $sameFilenameID = $flight->findSameFilename(basename($filename)); if ($sameFilenameID > 0) { if ($flight->allowDuplicates) { while (is_file($flight->getIGCFilename())) { $flight->filename = '_' . $flight->filename; } } else { @unlink($flight->getIGCFilename(1)); @unlink($tmpIGCPath . ".olc"); @unlink($tmpIGCPath); $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_SAME_FILENAME_FLIGHT, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } return array(ADD_FLIGHT_ERR_SAME_FILENAME_FLIGHT, $sameFilenameID); } } $sameFlightsArray = $flight->findSameTime(); if (count($sameFlightsArray) > 0) { if ($flight->allowDuplicates) { // we allow duplicates if they are from another server $dupFound = 0; foreach ($sameFlightsArray as $k => $fArr) { if ($fArr['serverID'] == $flight->serverID) { // if a same flight from this server is present we dont re-insert $dupFound = 1; break; } else { // fill in ids of flights to 'disable' $disableFlightsList[$fArr['ID']]++; } } } else { $dupFound = 1; } if ($dupFound) { @unlink($flight->getIGCFilename(1)); @unlink($tmpIGCPath . ".olc"); @unlink($tmpIGCPath); $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_SAME_DATE_FLIGHT, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } // return array( ADD_FLIGHT_ERR_SAME_DATE_FLIGHT,$sameFlightsArray[0]['serverID'].'_'. $sameFlightsArray[0]['ID']); return array(ADD_FLIGHT_ERR_SAME_DATE_FLIGHT, $sameFlightsArray[0]['ID']); } else { DEBUG("FLIGHT", 1, "addFlightFromFile: Duplicate DATE/TIME flight will be inserted<br>"); } } $sameFlightsArray = $flight->findSameHash($hash); if (count($sameFlightsArray) > 0) { if ($flight->allowDuplicates) { // we allow duplicates if they are from another server //echo "searching in dups "; //print_r($sameFlightsArray); $dupFound = 0; $flightPilot = new pilot($flight->userServerID + 0, $flight->userID + 0); $flightPilotMapTable = $flightPilot->pilotMapping(); // print_r($flightPilotMapTable); foreach ($sameFlightsArray as $k => $fArr) { if ($fArr['serverID'] == $flight->serverID) { // if a same flight from this server is present we dont re-insert $dupFound = 1; break; } else { // check that the existing flight belongs to a pilot that is 'mapped' to // $flight->userID + $flight->userServerID if (!$flightPilotMapTable[$fArr['userServerID']][$fArr['userID']]) { DEBUG("FLIGHT", 1, "addFlightFromFile: Same hash from external Server BUT from the pilot was not mapped into local <br>"); // We allow the flight to be submitted but then we must check and disable all duplicates but one //$dupFound=1; //break; } // fill in ids of flights to 'disable' $disableFlightsList[$fArr['ID']]++; } } } else { // echo "no dups allowesd"; $dupFound = 1; } if ($dupFound) { @unlink($flight->getIGCFilename(1)); @unlink($tmpIGCPath . ".olc"); @unlink($tmpIGCPath); $log->ResultDescription = getAddFlightErrMsg(ADD_FLIGHT_ERR_SAME_HASH_FLIGHT, 0); if (!$log->put()) { echo "Problem in logger<BR>"; } return array(ADD_FLIGHT_ERR_SAME_HASH_FLIGHT, $sameFlightsArray[0]['ID']); } else { DEBUG("FLIGHT", 1, "addFlightFromFile: Duplicate HASH flight will be inserted<br>"); // echo "addFlightFromFile: Duplicate HASH flight will be inserted<br>"; } } // print_r($disableFlightsList); /* if ( ! $flight->allowDuplicates ) { $sameHashIDArray=$flight->findSameHash( $hash ); if (count($sameHashIDArray)>0) { @unlink($flight->getIGCFilename(1)); @unlink($tmpIGCPath.".olc"); @unlink($tmpIGCPath); $log->ResultDescription=getAddFlightErrMsg(ADD_FLIGHT_ERR_SAME_HASH_FLIGHT,0); if (!$log->put()) echo "Problem in logger<BR>"; return array(ADD_FLIGHT_ERR_SAME_HASH_FLIGHT,$sameHashIDArray[0]['serverID'].'_'.$sameHashIDArray[0]['ID']); } } */ //****************************************************** // PASSED ALL TESTS , NOW DO SOME WORK WITH OUR FLIGHT //****************************************************** // move the flight to corresponding year $flight->checkDirs(); //$yearPath=$flightsAbsPath."/".$userIDstr."/flights/".$flight->getYear(); //$maps_dir=$flightsAbsPath."/".$userIDstr."/maps/".$flight->getYear(); //$charts_dir=$flightsAbsPath."/".$userIDstr."/charts/".$flight->getYear(); //$photos_dir=$flightsAbsPath."/".$userIDstr."/photos/".$flight->getYear(); //if (!is_dir($yearPath)) mkdir($yearPath,0755); //if (!is_dir($maps_dir)) mkdir($maps_dir,0755); //if (!is_dir($charts_dir)) mkdir($charts_dir,0755); //if (!is_dir($photos_dir)) mkdir($photos_dir,0755); /** * Martin Jursa; to avoid error log flooding */ if (file_exists($tmpIGCPath)) { @rename($tmpIGCPath, $flight->getIGCFilename()); } // in case an olc file was created too if (file_exists($tmpIGCPath . ".olc")) { @rename($tmpIGCPath . ".olc", $flight->getIGCFilename() . ".olc"); } // these commands seem redundant: //@unlink($tmpIGCPath.".olc"); //@unlink($tmpIGCPath); /*old: @rename($tmpIGCPath, $flight->getIGCFilename() ); // in case an olc file was created too @rename($tmpIGCPath.".olc", $flight->getIGCFilename().".olc" ); @unlink($tmpIGCPath.".olc"); @unlink($tmpIGCPath); */ // if we use NACclubs // get the NACclubID for userID // and see if the flight is in the current year (as defined in the NAclist array if ($CONF_use_NAC) { require_once dirname(__FILE__) . "/CL_NACclub.php"; list($pilotNACID, $pilotNACclubID) = NACclub::getPilotClub($userIDforFlight); DEBUG("FLIGHT", 1, "addFlightFromFile: pilotNACID:{$pilotNACID}, pilotNACclubID: {$pilotNACclubID}<br>"); if ($CONF_NAC_list[$pilotNACID]['use_clubs']) { DEBUG("FLIGHT", 1, "addFlightFromFile: use_clubs is on<br>"); if ($argArray['NACclubID'] > 0 && $argArray['NACid'] > 0) { $flight->NACclubID = $argArray['NACclubID']; $flight->NACid = $argArray['NACid']; DEBUG("FLIGHT", 1, "addFlightFromFile: using arguments NACclubID NACid<br>"); } else { DEBUG("FLIGHT", 1, "addFlightFromFile: calculating NACclubID NACid<br>"); // check year -> we only put the club for the current season , so that results for previous seasons cannot be affected $currSeasonYear = $CONF_NAC_list[$pilotNACID]['current_year']; DEBUG("FLIGHT", 1, "addFlightFromFile: currSeasonYear: {$currSeasonYear}<br>"); if ($CONF_NAC_list[$pilotNACID]['periodIsNormal']) { $seasonStart = $currSeasonYear - 1 . "-12-31"; $seasonEnd = $currSeasonYear . "-12-31"; } else { $seasonStart = $currSeasonYear - 1 . $CONF_NAC_list[$pilotNACID]['periodStart']; $seasonEnd = $currSeasonYear . $CONF_NAC_list[$pilotNACID]['periodStart']; } DEBUG("FLIGHT", 1, "addFlightFromFile: seasonStart:{$seasonStart} , seasonEnd:{$seasonEnd}<br>"); if ($flight->DATE > $seasonStart && $flight->DATE <= $seasonEnd) { DEBUG("FLIGHT", 1, "addFlightFromFile: inside Season !!<br>"); $flight->NACclubID = $pilotNACclubID; $flight->NACid = $pilotNACID; } } } } if ($CONF_use_validation) { $ok = $flight->validate(0); // dont update DB } if ($CONF_airspaceChecks) { $flight->checkAirspace(0); // dont update DB } $flight->putFlightToDB(0); // now do the photos if ($calledFromForm) { require_once dirname(__FILE__) . "/CL_flightPhotos.php"; $flightPhotos = new flightPhotos($flight->flightID); // $flightPhotos->getFromDB(); $j = 0; for ($i = 0; $i < $CONF_photosPerFlight; $i++) { $var_name = "photo" . $i . "Filename"; $photoName = $_FILES[$var_name]['name']; $photoFilename = $_FILES[$var_name]['tmp_name']; if ($photoName) { if (CLimage::validJPGfilename($photoName) && CLimage::validJPGfile($photoFilename)) { // $newPhotoName=toLatin1($photoName); // Fix for same photo filenames 2009.02.03 //global $flightsAbsPath; global $CONF; $newPhotoName = flightPhotos::getSafeName(LEONARDO_ABS_PATH . '/' . str_replace("%PILOTID%", $flight->getPilotID(), str_replace("%YEAR%", $flight->getYear(), $CONF['paths']['photos'])), $photoName); //$flightsAbsPath.'/'.$flight->getPilotID()."/photos/".$flight->getYear() , //$photoName ) ; $phNum = $flightPhotos->addPhoto($j, $flight->getPilotID() . "/photos/" . $flight->getYear(), $newPhotoName, $description); $photoAbsPath = $flightPhotos->getPhotoAbsPath($j); if (move_uploaded_file($photoFilename, $photoAbsPath)) { CLimage::resizeJPG($CONF['photos']['thumbs']['max_width'], $CONF['photos']['thumbs']['max_height'], $photoAbsPath, $photoAbsPath . ".icon.jpg", $CONF['photos']['compression']); CLimage::resizeJPG($CONF['photos']['normal']['max_width'], $CONF['photos']['normal']['max_height'], $photoAbsPath, $photoAbsPath, $CONF['photos']['compression']); $flight->hasPhotos++; $j++; } else { //upload not successfull $flightPhotos->deletePhoto($j); } } } } // also try to get geotag info $flightPhotos->computeGeoInfo(); } // took care of photos // tkae care of comments if ($comments) { global $lang2isoGoogle, $currentlang; $flightComments = new flightComments($flight->flightID); $commentInsertResult = $flightComments->addComment(array('parentID' => 0, 'userID' => $flight->userID + 0, 'userServerID' => $flight->userServerID + 0, 'guestName' => '', 'guestPass' => '', 'guestEmail' => '', 'text' => $comments, 'languageCode' => $lang2isoGoogle[$currentlang]), 0); } // now is a good time to disable duplicate flights we have found from other servers // AND are from the same user (using pilot's mapping table to find that out) global $db; if (0) { foreach ($disableFlightsList as $dFlightID => $num) { $query = "UPDATE {$flightsTable} SET private = private | 0x02 WHERE ID={$dFlightID} "; $res = $db->sql_query($query); # Error checking if ($res <= 0) { echo "<H3> Error in query: {$query}</H3>\n"; } } } //or $flight->hideSameFlights(); set_time_limit(200); $flight->computeScore(); $flight->updateTakeoffLanding(); // echo "TakeoffID:".$flight->takeoffID."<BR>"; if (in_array($flight->takeoffID, $CONF['takeoffs']['private'])) { $flight->private = 1; } $flight->putFlightToDB(1); // update return array(1, $flight->flightID); // ALL OK; }