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; }
/// \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); } }
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; }