Beispiel #1
0
void AbstractHost::parseReceivedData()
{
	size_t lastPosition = std::string::npos;

	size_t receiveBufferLength = strlen(receiveBuffer);
	if(receiveBufferLength > 4096)
	{
		receiveBufferLength = 4096;
	}
	std::string buffer(receiveBuffer,receiveBufferLength);

	if(receivedNewline && buffer[0] == '\n') // we received the end of a package, lets process it
	{
		buffer.erase(0,1);
		processPackage();
		receivedNewline = false;
	}

	while((lastPosition = buffer.find("\n\n")) != std::string::npos) // check whether we have received a complete package
	{
		parseBuffer += buffer.substr(0,lastPosition+1); // we include the first newline, because package parsing needs a newline after each line
		buffer.erase(0,lastPosition+2);

		processPackage();
	}

	if(*(buffer.rbegin()) == '\n') { receivedNewline = true; }
	else { receivedNewline = false; }
	parseBuffer += buffer;
}
Beispiel #2
0
/// \fn NetConnection::process(int clientid)
/// \brief Process all pending messages.
void NetConnection::process(NetAddress& client)
{
   if ( client.waitAttempt > 0 )
   {
      client.waitTimer -= TIMER.getTick();
      if ( client.waitTimer > 0.0f )
      {
         return;
      }
      else if ( client.waitTimer <= 0.0f )
      {
         sendRequest(client);

         client.waitAttempt++;
         client.waitTimer = client.waitAttempt * client.waitAttempt;
      }
   }

   auto it = client.mOrderQueue.begin();
   for (; it != client.mOrderQueue.end(); it++ )
   {
      auto& handle = *it;
      if ( handle->getNumber() == client.nextPackageNumber )
      {
         client.waitAttempt = 0;

         // first remove it from the pile
         //PackageHandle package(handle);
         //it.remove();

         processPackage(client, *handle);
      }
      else if ( handle->getNumber() > client.nextPackageNumber )
      {
         // we miss a package, start the wait timer
         client.waitAttempt++;
         client.waitTimer = client.waitAttempt * client.waitAttempt;
         break;
      }
   }

   if (it != client.mOrderQueue.begin())
   {
      client.mOrderQueue.erase(client.mOrderQueue.begin(), it);
   }
}
Beispiel #3
0
int main( int argc, char *argv[] )
{
	QString serverPath = "";
	QString packagePath = "";
	OPERATION listOperation = DEFAULT;

	int c;
	while ( ( c = getopt( argc, argv, "c:r:a:p:d:u" ) ) != -1 )
	{
		switch(c)
		{
			case 'c':
				listOperation = CREATE_LIST;
				serverPath = optarg;
				break;
			case 'd':
				listOperation = DELETE_LIST;
				break;
			case 'a':
				listOperation = ADD_PACKAGE;
				packagePath = optarg;
				break;
			case 'r':
				listOperation = DELETE_PACKAGE;
				packagePath = optarg;
				break;
			case 'p':
				listOperation = AUTO_CREATE;
				serverPath = optarg;
				break;
			case 'u':
				listOperation = AUTO_UPDATE;
				serverPath = optarg;
				break;
			default:
				printf( "operation not recognized\n" );
				return 0;
		}
	}

	if( argc < 2 || ( argc != 3 && listOperation != DELETE_LIST ) )
	{
		printf( "usage:\n" );
		printf( "-p server_url : create list automatically by recursively parsing mapmanager directory\n" );
		printf( "-u server_url : update list automatically by recursively parsing mapmanager directory\n" );
		printf( "-c server_url : create list\n" );
		printf( "-d server_url : delete list\n" );
		printf( "-a package_path_and_name : add package to list\n" );
		printf( "-r package_path_and_name : delete package from list\n" );

		return 0;
	}

	if( !serverPath.endsWith( "/" ) )
		serverPath.append( "/" );

	if( packagePath.startsWith( "." ) )
		packagePath.remove( 0, 1 );

	if( packagePath.startsWith( "/" ) )
		packagePath.remove( 0, 1 );

	QString packageName = packagePath;
	packageName.remove( 0, packageName.lastIndexOf( '/' ) + 1 );
	packageName.truncate( packageName.lastIndexOf( '.' ) );

	QDomDocument list;
	QFile listFile( "packageList.xml" );

	if( listOperation == CREATE_LIST )
		return createList( &list, &listFile, serverPath );

	if( listOperation == AUTO_CREATE )
	{
		if( !createList( &list, &listFile, serverPath ) )
			return 0;

		QStringList localPackages = parseForPackages( QDir() );

		foreach( QString packagePath, localPackages )
			processPackage( &list, packagePath );
	}

	else
	{
		if ( !listFile.exists() )
		{
			printf( "create list file first using -c or -p\n" );
			return 0;
		}

		if( listOperation == DELETE_LIST )
		{
			if ( !listFile.remove() )
			{
				printf( "error deleting list file\n" );
				return 0;
			}

			printf( "deleted list\n" );
			return 1;
		}


		if ( !listFile.open( QIODevice::ReadOnly ) )
		{
			printf( "failed to open list file\n" );
			return 0;
		}

		if ( !list.setContent( &listFile ) )
		{
			printf("error parsing list file\n");
			listFile.close();
			return 0;
		}
		listFile.close();
	}

	if( listOperation == DELETE_PACKAGE )
	{
		if ( !deletePackage( &list, packagePath ) )
			return 0;
	}

	if( listOperation == ADD_PACKAGE )
	{
		if ( !processPackage( &list, packagePath ) )
			return 0;
	}

	if( listOperation == AUTO_UPDATE )
	{
		QStringList localPackages = parseForPackages( QDir() );

		foreach( QString packagePath, localPackages )
			processPackage( &list, packagePath );
	}

	if (!listFile.open(QIODevice::ReadWrite | QIODevice::Truncate)) return 1;
	listFile.write(list.toString().toUtf8());
	listFile.close();

	return 1;
}