unsigned int LocalAddressReceiver::getReceivedMessages( char *inAddress, unsigned int inNumMessages, char ***outMessages, char ***outFromAddresses ) { mReceiveAddressLock->lock(); int index = findAddressIndex( inAddress ); int returnValue; char **messages; char **fromAddresses; if( index != -1 ) { SimpleVector<char *> *currentMessageQueue = *( mMessageQueueVector->getElement( index ) ); SimpleVector<char *> *currentFromAddressQueue = *( mFromAddressQueueVector->getElement( index) ); int numToGet = inNumMessages; int numAvailable = currentMessageQueue->size(); if( numToGet > numAvailable ) { numToGet = numAvailable; } messages = new char*[numToGet]; fromAddresses = new char*[numToGet]; for( int i=0; i<numToGet; i++ ) { messages[i] = *( currentMessageQueue->getElement(0) ); fromAddresses[i] = *( currentFromAddressQueue->getElement(0) ); currentMessageQueue->deleteElement( 0 ); currentFromAddressQueue->deleteElement( 0 ); } returnValue = numToGet; } else { returnValue = 0; messages = new char*[0]; fromAddresses = new char*[0]; } *outMessages = messages; *outFromAddresses = fromAddresses; mReceiveAddressLock->unlock(); return returnValue; }
char OutboundChannel::sendMessage( char * inMessage, int inPriority ) { mLock->lock(); char sent; if( !mConnectionBroken ) { // add it to the queue SimpleVector<char *> *queueToUse; if( inPriority <=0 ) { queueToUse = mMessageQueue; } else { queueToUse = mHighPriorityMessageQueue; } queueToUse->push_back( stringDuplicate( inMessage ) ); sent = true; if( queueToUse->size() > mMaxQueueSize ) { // the queue is over-full // drop the oldest message char *message = *( queueToUse->getElement( 0 ) ); queueToUse->deleteElement( 0 ); delete [] message; mDroppedMessageCount++; } } else { // channel no longer working sent = false; } mLock->unlock(); if( sent ) { mMessageReadySemaphore->signal(); } return sent; }
void stepLineageLog() { if( ! useLineageServer ) { return; } for( int i=0; i<records.size(); i++ ) { LineageRecord *r = records.getElement( i ); int result = r->request->step(); char recordDone = false; if( result == -1 ) { AppLog::info( "Request to lineage server failed." ); recordDone = true; } else if( result == 1 ) { // done, have result char *webResult = r->request->getResult(); if( r->sequenceNumber == -1 ) { // still waiting for sequence number response int numRead = sscanf( webResult, "%d", &( r->sequenceNumber ) ); if( numRead != 1 ) { AppLog::info( "Failed to read sequence number " "from lineage server response." ); recordDone = true; } else { delete r->request; // start lineage-posting request char *seqString = autoSprintf( "%d", r->sequenceNumber ); char *lineageServerSharedSecret = SettingsManager::getStringSetting( "lineageServerSharedSecret", "secret_phrase" ); char *hash = hmac_sha1( lineageServerSharedSecret, seqString ); delete [] lineageServerSharedSecret; delete [] seqString; char *encodedEmail = URLUtils::urlEncode( r->email ); char *encodedName = URLUtils::urlEncode( r->name ); char *encodedLastSay = URLUtils::urlEncode( r->lastSay ); int maleInt = 0; if( r->male ) { maleInt = 1; } char *url = autoSprintf( "%s?action=log_life" "&server=%s" "&email=%s" "&age=%f" "&player_id=%d" "&parent_id=%d" "&display_id=%d" "&killer_id=%d" "&name=%s" "&last_words=%s" "&male=%d" "&sequence_number=%d" "&hash_value=%s", lineageServerURL, serverID, encodedEmail, r->age, r->playerID, r->parentID, r->displayID, r->killerID, encodedName, encodedLastSay, maleInt, r->sequenceNumber, hash ); delete [] encodedEmail; delete [] encodedName; delete [] encodedLastSay; delete [] hash; r->request = new WebRequest( "GET", url, NULL ); printf( "Starting new web request for %s\n", url ); delete [] url; } } else { if( strstr( webResult, "DENIED" ) != NULL ) { AppLog::info( "Server log_life request rejected by lineage server" ); } recordDone = true; } delete [] webResult; } if( recordDone ) { delete r->request; delete [] r->email; delete [] r->name; delete [] r->lastSay; records.deleteElement( i ); i--; } } }
Plant *GardenerAI::getClosestPlantInGardenerPlot( Gardener *inGardener ) { SimpleVector<Plant *> *ourPlants = mWorld->getPlotPlants( mGardener ); SimpleVector<Plant *> *otherPlants = mWorld->getPlotPlants( inGardener ); if( otherPlants == NULL ) { if( ourPlants != NULL ) { delete ourPlants; } return NULL; } // first, filter otherPlants to remove overlaps with ourPlants int i=0; while( i < otherPlants->size() ) { Plant *plant = *( otherPlants->getElement( i ) ); if( ourPlants != NULL && ourPlants->getElementIndex( plant ) != -1 ) { // overlap otherPlants->deleteElement( i ); } else { // no overlap i++; } } if( ourPlants != NULL ) { delete ourPlants; } Plant *returnPlant = NULL; int numPlants = otherPlants->size(); if( numPlants > 0 ) { // look for closest to us Vector3D *ourPostion = mWorld->getGardenerPosition( mGardener ); double closestDistance = DBL_MAX; for( i=0; i<numPlants; i++ ) { Plant *plant = *( otherPlants->getElement( i ) ); Vector3D *plantPosition = mWorld->getPlantPosition( plant ); double distance = plantPosition->getDistance( ourPostion ); delete plantPosition; if( distance < closestDistance ) { closestDistance = distance; returnPlant = plant; } } delete ourPostion; } delete otherPlants; return returnPlant; }