Beispiel #1
0
gpointer upload(gpointer arg)
{
#if 0
    gtk_widget_hide(mtp_submenu_item_free);
#endif
    if(!mutex)
    {
#if 0
        gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(mtp_submenu_item_up))),UP_DEFAULT_LABEL);
        gtk_widget_set_sensitive(mtp_submenu_item_up, TRUE);
#endif
        return NULL;
    }
    g_mutex_lock(mutex);
    if(!mtp_device)
    {
#if 0
        gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(mtp_submenu_item_up))),UP_DEFAULT_LABEL);
        gtk_widget_set_sensitive(mtp_submenu_item_up, TRUE);
#endif
        g_mutex_unlock(mutex);
        return NULL;
    }

    Tuple* tuple;
    GList *up_list=NULL,*node;
    node=up_list=get_upload_list();
    gint up_err=0;
    while(node)
    {
        tuple=(Tuple*)(node->data);
        up_err = upload_file(tuple);
        if(up_err )
        {
            /*show_dialog("An error has occured while uploading...\nUpload failed!");*/
            break;
        }
        if(exiting)
        {
            /*show_dialog("Shutting down MTP while uploading.\nPending uploads were cancelled");*/
            break;
        }

        node = g_list_next(node);
    }
    g_list_free(up_list);
#if 0
    gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(mtp_submenu_item_up))),UP_DEFAULT_LABEL);
    gtk_widget_set_sensitive(mtp_submenu_item_up, TRUE);
#endif
    g_mutex_unlock(mutex);
#if DEBUG
    g_print("MTP upload process finished\n");
#endif
#if 0
    gtk_widget_show(mtp_submenu_item_free);
#endif
    g_thread_exit(NULL);
    return NULL;
}
void send_data_packets() {
  int i;
  struct sockaddr_in* from;
  int retsize, chunk_size;
  int * upload_id_list = get_upload_list(&retsize);
  int * upload_chunk_id_list = get_upload_chunk_list(&chunk_size);
  int peer_id;
  unsigned seq_number;
  int canSend;
  int timeout;
  for(i = 0; i < retsize; i++) {
  	peer_id = upload_id_list[i];
  	canSend = 1;
    /* if timeout send timeout packet first */
    if ((seq_number = get_timeout_seq(peer_id)) == 0) {
    	/* if not timout, check window size */
    	if(get_queue_size(peer_id) < get_cwnd_size(peer_id)) {
				seq_number = get_tail_seq_number(peer_id);
				/* transmit */
				timeout = 0;
			}
    	else{
    		canSend = 0;
      }
    }
    else {
    	/* retransmit */
      printf("retransmit\n");
      window_timeout(peer_id);
    	seq_number -= 1; /* offset by 1 */
    	timeout = 1;
    }
    //printf("seq: %d, canSend: %d, queue: %d, cwnd: %d\n", seq_number, canSend, get_queue_size(peer_id), get_cwnd_size(peer_id));
   	/* send one packet one time to ensure fairness */
    if(canSend && seq_number < MAX_PACKET_PER_CHUNK) {
		  char data[MAX_PAYLOAD_SIZE];
		  struct packet* packet;
		  if(seq_number==MAX_PACKET_PER_CHUNK-1){
		    int last_packet_size = BT_CHUNK_SIZE-MAX_PAYLOAD_SIZE*(MAX_PACKET_PER_CHUNK-1);
		    read_file(master_data_file_name, data, last_packet_size, 
		      upload_chunk_id_list[i] * BT_CHUNK_SIZE + seq_number * MAX_PAYLOAD_SIZE);
		    packet = make_packet(DATA, NULL, data, last_packet_size, seq_number + 1, 0, NULL, NULL, NULL);
		  }else{
		    read_file(master_data_file_name, data, MAX_PAYLOAD_SIZE, 
		      upload_chunk_id_list[i] * BT_CHUNK_SIZE + seq_number * MAX_PAYLOAD_SIZE);
		    packet = make_packet(DATA, NULL, data, MAX_PAYLOAD_SIZE, seq_number + 1, 0, NULL, NULL, NULL);
		  }

		  /* Send DATA */
		  from = find_addr(peer_id);
		  send_packet(*packet, sock, (struct sockaddr*)from);
		  wait_ack(peer_id, seq_number + 1, timeout);
		  free(packet->header);
		  free(packet);
    }
  }
  free(upload_id_list);
  free(upload_chunk_id_list);
}