msg_queue.c
上传用户:ai20ln
上传日期:2007-01-05
资源大小:79k
文件大小:3k
源码类别:

ICQ/即时通讯

开发平台:

Unix_Linux

  1. /************************************************************
  2. Author Lawrence Gold
  3. Handles resending missed packets.
  4. *************************************************************/
  5. #include "msg_queue.h"
  6. #include "micq.h"
  7. #include <stdlib.h>
  8. #include <assert.h>
  9. #include <limits.h>
  10. static struct msg_queue *queue= NULL;
  11. void msg_queue_init( void )
  12. {
  13.     queue = malloc( sizeof( *queue ) );
  14.     queue->entries = 0;
  15.     queue->head = queue->tail = NULL;
  16. }
  17. struct msg *msg_queue_peek( void )
  18. {
  19.     if ( NULL != queue->head )
  20.     {
  21.         return queue->head->msg;
  22.     }
  23.     else
  24.     {
  25.         return NULL;
  26.     }
  27. }
  28. struct msg *msg_queue_pop( void )
  29. {
  30.     struct msg *popped_msg;
  31.     struct msg_queue_entry *temp;
  32.     if ( ( NULL != queue->head ) && ( queue->entries > 0 ) )
  33.     {
  34.         popped_msg = queue->head->msg;    
  35.         temp = queue->head->next;
  36.         free(queue->head);
  37.         queue->head = temp;
  38.         queue->entries--;
  39.         if ( NULL == queue->head )
  40.         {
  41.             queue->tail = NULL;
  42.         }
  43.        /* if ( 0x1000 < Chars_2_Word( &popped_msg->body[6] ) ) {
  44.    M_print( "nn******************************************aaan"
  45.             "Error!!!!!!!!!!!!!!!!!!!!!n" );
  46. }*/
  47.         return popped_msg;
  48.     }
  49.     else
  50.     {
  51.         return NULL;
  52.     }
  53. }
  54. void msg_queue_push( struct msg *new_msg)
  55. {
  56.     struct msg_queue_entry *new_entry;
  57.     assert( NULL != new_msg );
  58.     
  59.     if ( NULL == queue ) return;
  60.     new_entry = malloc(sizeof(struct msg_queue_entry));
  61.     new_entry->next = NULL;
  62.     new_entry->msg = new_msg;
  63.     if (queue->tail)
  64.     {
  65.         queue->tail->next = new_entry;
  66.         queue->tail = new_entry;
  67.     }
  68.     else
  69.     {
  70.         queue->head = queue->tail = new_entry; 
  71.     }
  72.     queue->entries++;
  73. }
  74. void Dump_Queue( void )
  75. {
  76.    int i;
  77.    struct msg *queued_msg;
  78.    assert( queue != NULL );
  79.    assert( 0 <= queue->entries );
  80.    
  81.    M_print( "nTotal entries %dn", queue->entries );
  82.    for (i = 0; i < queue->entries; i++)
  83.    {
  84.        queued_msg = msg_queue_pop();
  85.        M_print( "SEQ = %04xtCMD = %04xtattempts = %dtlen = %d",
  86.           queued_msg->seq, Chars_2_Word( &queued_msg->body[6] ),
  87.   queued_msg->attempts, queued_msg->len );
  88.        if ( Verbose ) {
  89.           Hex_Dump( queued_msg->body, queued_msg->len );
  90.        }
  91.        msg_queue_push( queued_msg );
  92.    }
  93. }
  94. void Check_Queue( WORD seq )
  95. {
  96.    int i;
  97.    struct msg *queued_msg;
  98.    assert( 0 <= queue->entries );
  99.    
  100.    for (i = 0; i < queue->entries; i++)
  101.    {
  102.        queued_msg = msg_queue_pop();
  103.        if (queued_msg->seq != seq)
  104.        {
  105.            msg_queue_push( queued_msg );
  106.        }
  107.        else
  108.        {
  109.            if ( Verbose )
  110.            {
  111.                M_print( "nDiscarded message with SEQ %04X CMD ", queued_msg->seq);
  112.        Print_CMD( Chars_2_Word( &queued_msg->body[6] ) );
  113.        M_print( " from resend queue because of ack.n" );
  114.        
  115.                Prompt();
  116.            }
  117.            free(queued_msg->body);
  118.            free(queued_msg);
  119.            if ((queued_msg = msg_queue_peek()) != NULL)
  120.            {
  121.                next_resend = queued_msg->exp_time;
  122.            }
  123.            else
  124.            {
  125.                next_resend = INT_MAX;
  126.            }
  127.            break;
  128.        }
  129.    }
  130. }