event.cpp

来自「ABis无线接口全套资料」· C++ 代码 · 共 188 行

CPP
188
字号
/* ======================================================================== *\
 |
 |
 |  JOYIT Communication Technology
 |  Copyright (C)  2002-2003,  All Right Reserved.
 |
 |  System: Programmable Signaling Gateway
 |  Sub-system: PSG
 |  Filename: event.cpp
 |  Environment: Red Hat Linux 9.0 & GNU C/C++ Compiler 3.2.2
 |  Function description: Define the menthod of event class.
 |           
 |
\* ======================================================================== */

#ifndef _EVENT_HPP
#include "event.hpp"
#endif

# include "stdio.h"
extern "C" {

#ifndef _STRING_H
#include <string.h>
#endif

};

EventQueueType::EventQueueType( ) : head(NULL), tail(NULL), evCount(0),
                capacity(MAXEVENT)
{
}

EventQueueType::EventQueueType(short cap) : head(NULL), tail(NULL), evCount(0),
                capacity(MAXEVENT)
{
    if (cap > 0)
        capacity = cap;
    // Otherwise, it will keep the default value.
}

EventQueueType::~EventQueueType( )
{ // destroy all event and it's message.
    Clear( );
}

void EventQueueType::Clear( )
{
    while (head != NULL)
    {
        WEvent  * tmpC = head->next;
        delete head->msgPtr;
        delete head;
        head = tmpC;
    }
    tail = head;
    evCount = 0;
}

short EventQueueType::getCapacity( )
{
    return capacity;
}

void EventQueueType::setCapacity(short cap)
{
    if (cap > 0)
        capacity = cap;
}

char EventQueueType::insertEvent(const WEvent& event)
{
    if (! event.what) // Null event.
        return EV_NULL;

    if (evCount >= capacity)
        return EV_QFULL; // event queue is full, couldn't insert event more

    WEvent * ev = new WEvent;

    if (NULL == ev)
    { // Exception handle here.
        return EV_OUTMEM;
    }
    else
    {
        memcpy(ev, &event, sizeof(WEvent));
        if (ev->msgLen > 0)
        {
            ev->msgPtr = new char [ev->msgLen];
            if (NULL == ev->msgPtr)
            { // Exception handle here.
                delete ev;
                return EV_OUTMEM;
            }
            else
                memcpy(ev->msgPtr, event.msgPtr, ev->msgLen);
        }
        ev->next = head;
        if (NULL == head)
        {
            tail = ev;
            head = tail;
        }
        else
            head = ev;
        P_ev( );
        return EV_QINSERT; // event inserted successful.
    }
}

char EventQueueType::pushEvent(const WEvent& event)
{
    if (! event.what) // Null event.
        return EV_NULL;

    if (evCount >= capacity)
        return EV_QFULL; // event queue is full, couldn't insert event more

    WEvent * ev = new WEvent;

    if (NULL == ev)
    { // Exception handle here.
        return EV_OUTMEM;
    }
    else
    {
        memcpy(ev, &event, sizeof(WEvent));
        if (ev->msgLen > 0)
        {
            ev->msgPtr = new char [ev->msgLen];
            if (NULL == ev->msgPtr)
            { // Exception handle here.
                delete ev;
                return EV_OUTMEM;
            }
            else
                memcpy(ev->msgPtr, event.msgPtr, ev->msgLen);
        }
        ev->next = NULL;
        if (NULL == head)
        {
            tail = ev;
            head = tail;
        }
        else
        {
            tail->next = ev;
            tail = tail->next;
        }
        P_ev( );
        return EV_QINSERT; // event inserted successful.
    }
}

void EventQueueType::popEvent(WEvent& event)
{
    if (NULL == head)
    {
        event.what = evNothing;
        return;
    }

    WEvent  * ev = head;
    memcpy(&event, ev, sizeof(WEvent));
    head = ev->next;
    delete ev;
    V_ev( );
    if (NULL == head)
        tail = NULL;
}

// Public event queue manager, all other module access this object to
// put event and get event.
EventQueueType systemEventQueue;


// ------------------------------------------------------------------------
//
//  Revision list.
//  ==============
//
//  1.0,        2003-04-18,     Wu jianjin
//      Initial version.
//
// ------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?