⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcpost.c

📁 彩信MMS的全部代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    case MMS_M_SEND_REQ :
        postMsg(instance);
        break;
    case MMS_M_NOTIFY_RESP :
    case MMS_M_ACKNOWLEDGE_IND :
    case MMS_M_READ_REC_IND :
    case MMS_M_FORWARD_REQ :
        postPdu(instance);
        break;
    default :
        MMS_LOG_I(("POST: Illegal type (%d)!\n", fsmInstance[instance]->param.type));

        postFinished( instance, MMS_RESULT_ERROR);
        return;
    } 
} 







static void postMore(long instance)
{
    UINT32 startPos = 0;
    UINT32 bytesToSend = 0;
    UINT32 bytesRead = 0;
    unsigned char *theMsg = NULL;
    FmResult res;
    MmsClientStatusData data;
    CohPostInstanceData *fsm;   

    fsm = fsmInstance[instance];
    res = fldrmgrOpenMessage( CMN_CLIENT_MMS, fsm->param.data.msgId, FM_READ);

    
    mmsWapFreeContentParams(fsm->cont);
    fsm->cont = NULL;
    mmsWapFreeContentParams(fsm->sarBuffer);
    fsm->sarBuffer = NULL;

    M_TIMER_RESET_I( M_FSM_COH_POST, instance); 

    


    
    if (fsm->msgSize - fsm->sent > MMS_POST_MAX_SIZE)
    {   
        bytesToSend = MMS_POST_MAX_SIZE;
    }
    else
    {   
        bytesToSend = fsm->msgSize - fsm->sent;
    } 

    MMS_LOG_I(("Send next %lu bytes of file, starting at %lu, entire size %lu\n",
        bytesToSend, fsm->sent, fsm->msgSize));

    if (bytesToSend == 0)
    {
        MMS_LOG_I(("%s(%d): No data but still requested to send!\n", 
            __FILE__, __LINE__));

        MMSa_httpRequestDataResponse( fsm->requestId,  NULL, 0, FALSE);
        postMsgAbort( instance, MMS_RESULT_MESSAGE_EMPTY);
        return;
    } 

    theMsg = M_ALLOC(bytesToSend);
    startPos = fsm->sent;
    res = fldrmgrGetMessage( CMN_CLIENT_MMS, fsm->param.data.msgId, startPos, 
        bytesToSend, &bytesRead, theMsg);
    if (res != FM_RESULT_OK)
    {
        MMS_LOG_I(("%s(%d): Error reading msg (%d)!\n", __FILE__, __LINE__, res));

        postMsgAbort( instance, MMS_RESULT_MESSAGE_EMPTY);
        MMSa_httpRequestDataResponse( fsm->requestId,  NULL, 0, FALSE);
        M_FREE(theMsg);
        return;
    }
    else if (bytesRead != bytesToSend)
    {
        MMS_LOG_I(("POST: Couldn't read entire msg (%d, %d)!\n",
            bytesRead, bytesToSend));

        postMsgAbort( instance, MMS_RESULT_MESSAGE_EMPTY);
        MMSa_httpRequestDataResponse( fsm->requestId,  NULL, 0, FALSE);
        M_FREE(theMsg);
        return;
    } 

    fsm->sent += bytesToSend;

    M_TIMER_SET_I( M_FSM_COH_POST, MMS_POST_TIMEOUT, instance);
    MMSa_httpRequestDataResponse( fsm->requestId,  (char *)theMsg, 
        (int)bytesToSend,           
        fsm->sent != fsm->msgSize); 

    M_FREE(theMsg); 

    (void)fldrmgrCloseMessage( CMN_CLIENT_MMS, fsm->param.data.msgId);

    
    data.percentage = (int)(fsm->sent * 100 / fsm->msgSize);
    MMSa_status( MMS_CLIENT_STATUS_SENDING, fsm->param.data.msgId, data);
} 






static void postMsg(long instance)
{
    UINT32 startPos = 0;
    UINT32 bytesToSend = 0;
    UINT32 bytesRead;
    unsigned char *theMsg = NULL;
    FmResult res;
    MmsClientStatusData data;
    CohPostInstanceData *fsm;   

    fsm = fsmInstance[instance];
    M_TIMER_RESET_I( M_FSM_COH_POST, instance); 

    
    res = fldrmgrOpenMessage( CMN_CLIENT_MMS, fsm->param.data.msgId, FM_READ);

    if (res == FM_RESULT_OK)
    {
        res = fldrmgrGetMessageSize( CMN_CLIENT_MMS, fsm->param.data.msgId, 
            (UINT32*)&fsm->msgSize);
    } 

    if (res != FM_RESULT_OK)
    {
        MMS_LOG_I(("Couldn't get size of msg. Error (%d)! Terminating!\n", res));

        postMsgAbort( instance, checkFolderError(res));
        return;
    }
    else if (fsm->msgSize == 0)
    {
        MMS_LOG_I(("Send empty message, size %lu\n", fsm->msgSize));

        postMsgAbort( instance, MMS_RESULT_MESSAGE_EMPTY);
        return;
    }
    else if (fsm->msgSize > MMS_POST_MAX_SIZE)
    {   
        bytesToSend = MMS_POST_MAX_SIZE;
    }
    else
    {   
        bytesToSend = fsm->msgSize;
    } 

    MMS_LOG_I(("Preparing to send first %lu bytes of %lu bytes large message\n",
        bytesToSend, fsm->msgSize));

    theMsg = (unsigned char *)M_CALLOC( (unsigned)bytesToSend);
    res = fldrmgrGetMessage( CMN_CLIENT_MMS, fsm->param.data.msgId, startPos, 
        bytesToSend, &bytesRead, theMsg);
    if (res != FM_RESULT_OK)
    {
        MMS_LOG_I(("POST: Couldn't read msg (%d)!\n", res));
        M_FREE(theMsg);
        postMsgAbort( instance, checkFolderError(res));
        return;
    }
    else if (bytesRead != bytesToSend)
    {
        MMS_LOG_I(("POST: Couldn't read entire msg (%lu, %lu)!\n",
            bytesRead, bytesToSend));
        M_FREE(theMsg);
        postMsgAbort( instance, MMS_RESULT_FILE_READ_ERROR);
        return;
    }
    else
    {
        fsm->sent = bytesToSend;
    } 

    









    fsm->transactionId = getTransactionId( (char *)theMsg, fsm->sent);

    
    if (fsm->param.origMsg != 0)
    {
       MmsHeaderValue read;
       
        
       if ( !mmsPduGet((char *)theMsg, fsm->sent, X_MMS_READ_REPLY, &read) && 
           read.readReply == MMS_READ_REPLY_NO)
       {
            
           if (!mmsPduGet((char *)theMsg, fsm->sent, X_MMS_DELIVERY_REPORT, &read) &&
               read.deliveryReport == MMS_DELIVERY_REPORT_NO)
           {
               fsm->param.origMsg = 0; 
           }  
       }  
    }  

#ifdef MMS_LOG_PROTOCOL
    mmsWapLog( FALSE, (int)fsm->sent, (char *)theMsg);
#endif 

    M_TIMER_SET_I( M_FSM_COH_POST, MMS_POST_TIMEOUT, instance);

    MMS_LOG_I(("====> POST Msg, transactionId <%s>, requestId %d\n", 
        fsm->transactionId == NULL ? "NULL" : fsm->transactionId, fsm->requestId));
    MMSa_http( fsm->requestId, MMS_HTTP_POST, fsm->uri, myHttpHeader, 
        (char *)theMsg, fsm->sent,  
        fsm->msgSize,               
        fsm->sent != fsm->msgSize); 

    M_FREE(theMsg); 

    (void)fldrmgrCloseMessage( CMN_CLIENT_MMS, fsm->param.data.msgId);

    
    data.percentage = (int)(fsm->sent * 100 / fsm->msgSize);
    MMSa_status( MMS_CLIENT_STATUS_SENDING, fsm->param.data.msgId, data);
} 







static long postMsgInit(MmsSignal *sig)
{
    long instance = -1L;
    UINT32 port = MMS_INVALID_CFG_VARIABLE;
    unsigned len = 0;
    char *server = NULL;
    char *uri = NULL;
    char *scheme = NULL;
    MmsResult result = MMS_RESULT_OK;
    CohPostInstanceData *fsm;   
    MmsSigCohPostParam *param;
    MmsSigCohPostResultParam *resultParam;

    param = (MmsSigCohPostParam *)sig->p_param;

    
    instance = selectInstance();
    server = cfgGetStr(MMS_CFG_PROXY_RELAY);
    port = cfgGetInt(MMS_CFG_PORT);
    uri = cfgGetStr(MMS_CFG_POST_URI);
    scheme = cfgGetStr(MMS_CFG_SCHEME);

    
    if (instance == -1L)
    {
        MMS_LOG_I(("%s(%d): We're BUSY! Return!\n", __FILE__, __LINE__));
        result = MMS_RESULT_BUSY;
    }
    else if (instance < 0L || instance >= MMS_MAX_FSM_POST_INSTANCES ||
        fsmInstance[instance] == NULL)
    {
        MMS_LOG_I(("%s(%d): instance out of bounds (%ld)\n",
            __FILE__, __LINE__, instance));
        result = MMS_RESULT_ERROR;
    }
    else if (scheme == NULL || server == NULL || 
        port == MMS_INVALID_CFG_VARIABLE || uri == NULL)
    {
        MMS_LOG_I(("Illegal configuration: Missing scheme, server, port or URI!\n"));
        result = MMS_RESULT_CONFIG_ERROR;
    }
    else if (param == NULL)
    {
        MMS_LOG_I(("%s(%d): Parameter error (%d)\n", 
            __FILE__, __LINE__, param));
        result = MMS_RESULT_ERROR;
    }
    else if (param->type < MMS_M_SEND_REQ || param->type > MMS_M_FORWARD_CONF)
    {
        MMS_LOG_I(("%s(%d): Illegal POST requested %d\n", __FILE__, __LINE__,
            param->type));
        result = MMS_RESULT_ERROR;
    } 

    


    if (result != MMS_RESULT_OK || instance == -1L || uri == NULL || 
        server == NULL || scheme == NULL)
    {
        resultParam = M_ALLOCTYPE(MmsSigCohPostResultParam);
        resultParam->result = result;
        resultParam->responseStatus = MMS_RSP_STATUS_NONE;
        resultParam->responseText = NULL;

        
        M_SIGNAL_SENDTO_IP( sig->u_param1, sig->u_param2, sig->i_param, resultParam);

        if (param != NULL && param->type != MMS_M_SEND_REQ)
        {
            M_FREE(param->data.pdu.packet);
        } 

        if (sig->p_param != NULL)
        {
            M_FREE(sig->p_param);
        } 
        
        deleteInstance(instance);
        return -1L;
    } 

    fsm = fsmInstance[instance];

    
    fsm->requestingFsm = (MmsStateMachine)sig->u_param1;
    fsm->returnSig = (MmsSignalId)sig->u_param2;
    fsm->fsmInstance = sig->i_param;

    
    fsm->retries = 0;
    fsm->param.type = param->type;
    fsm->param.isResponseRequested = param->isResponseRequested;
    fsm->param.origMsg = param->origMsg;
    fsm->responseStatus = MMS_RSP_STATUS_NONE;
    fsm->responseText = NULL;

    
    switch (fsm->param.type)
    {
    case MMS_M_SEND_REQ :
        fsm->param.data.msgId = param->data.msgId;
        break;
    case MMS_M_NOTIFY_RESP :
    case MMS_M_ACKNOWLEDGE_IND :
    case MMS_M_READ_REC_IND :
    case MMS_M_FORWARD_REQ :
        fsm->param.data.pdu = param->data.pdu;
        break;
    default :
        MMS_LOG_I(("POST: Can't be here. Already tested (%d)!\n", fsm->param.type));
        return -1L;
    } 

    M_FREE(sig->p_param);

    
    len = strlen(scheme) + strlen(server) + 1 + LEN_POST_PORT + strlen(uri) + 1;
    fsm->uri = M_ALLOC(len);
    if (port == 0)
    {
        if (sprintf( fsm->uri, "%s%s%s", scheme, server, uri) > (int)len)
        {
            MMS_LOG_I(("%s(%d): Wrote outside allocated memory\n",
                __FILE__, __LINE__));
            MMSa_error(MMS_RESULT_RESTART_NEEDED);
            return -1L;
        } 
    }
    else if (sprintf( fsm->uri, "%s%s:%lu%s", scheme, server, port, uri) > (int)len)
    {
        MMS_LOG_I(("%s(%d): Wrote outside allocated memory\n",
            __FILE__, __LINE__));
        MMSa_error(MMS_RESULT_RESTART_NEEDED);
        return -1L;
    } 

    
    fsm->requestId = mmsWapGetRequestId();
    if (fsm->requestId == -1)
    {
        MMS_LOG_I(("No available request IDs! Terminating!\n"));

        
        M_SIGNAL_SENDTO_IU(sig->u_param1, sig->u_param2, 
            sig->i_param, MMS_RESULT_BUSY); 

        deleteInstance(instance);
        return -1L;
    } 

    return instance;
} 






static void postPdu(long instance)
{
    CohPostInstanceData *fsm;   

    fsm = fsmInstance[instance];

    

    if (fsm->param.origMsg != 0 && fsm->param.type == MMS_M_FORWARD_REQ)
    {
       MmsHeaderValue read;
       
        
       if ( !mmsPduGet((char *)fsm->param.data.pdu.packet, fsm->param.data.pdu.length,
           X_MMS_READ_REPLY, &read) && read.readReply == MMS_READ_REPLY_NO)
       {
            
           if ( !mmsPduGet((char *)fsm->param.data.pdu.packet, fsm->param.data.pdu.length,
               X_MMS_DELIVERY_REPORT, &read) && read.readReply == MMS_READ_REPLY_NO)
           {
               fsm->param.origMsg = 0; 
           }  
       }         
    } 
     
    M_TIMER_RESET_I( M_FSM_COH_POST, instance); 
    
    
    fsm->sent = fsm->msgSize = fsm->param.data.pdu.length;
    fsm->transactionId = getTransactionId( (char *)fsm->param.data.pdu.packet,
        fsm->param.data.pdu.length);

#ifdef MMS_LOG_PROTOCOL
    mmsWapLog( FALSE, (int)fsm->sent, (char *)fsm->param.data.pdu.packet);
#endif 

    M_TIMER_SET_I( M_FSM_COH_POST, MMS_POST_TIMEOUT, instance);

    MMS_LOG_I(("====> POST PDU, transactionId <%s>, requestId %d\n", 
        fsm->transactionId == NULL ? "NULL" : fsm->transactionId, fsm->requestId));
    MMSa_http( fsm->requestId, MMS_HTTP_POST, fsm->uri, myHttpHeader, 
        (char *)fsm->param.data.pdu.packet, 
        fsm->sent,                  
        fsm->msgSize,               
        fsm->sent != fsm->msgSize); 
} 







static void postRetry(long instance, MmsResult ret)
{
    CohPostInstanceData *fsm;   

    fsm = fsmInstance[instance];
    if (++fsm->retries < cfgGetInt(MMS_CFG_POST_RETRY))
    {
        MMS_LOG_I(("******* POST Retry ******* %s %s %s%lu\n",
            fsm->uri, fsm->transactionId == NULL ? "NULL" : fsm->transactionId, 
            fsm->param.type == MMS_M_SEND_REQ ? "msgId=" : "pdu type=",
            fsm->param.type == MMS_M_SEND_REQ ? 
                fsm->param.data.msgId : (UINT32)fsm->param.data.pdu.packet[1]));

        
        mmsWapCancelHttpOperation(fsm->requestId);

        if (fsm->responseText != NULL)
        {
            if (fsm->responseText->text != NULL)
            {
                M_FREE(fsm->responseText->text);
            } 

            M_FREE(fsm->responseText);
            fsm->responseText = NULL;
        } 

        if (fsm->transactionId != NULL)
        {
            M_FREE(fsm->transactionId);
            fsm->transactionId = NULL;
        } 

        
        mmsWapFreeContentParams(fsm->cont);
        fsm->cont = NULL;
        mmsWapFreeContentParams(fsm->sarBuffer);
        fsm->sarBuffer = NULL;

        fsm->requestId = mmsWapRenewRequestId(fsm->requestId);
        postIt(instance);               
    }
    else
    {
        
        postFinished( instance, ret);
    } 
} 







static long selectInstance(void)
{
    long i;
    
    for (i = 0L; i < MMS_MAX_FSM_POST_INSTANCES; i++) 
    {
        if (fsmInstance[i] == NULL)
        {
            
            fsmInstance[i] = (CohPostInstanceData *)M_CALLOC(sizeof(CohPostInstanceData));

            fsmInstance[i]->requestingFsm = M_FSM_MAX_REGS;
            fsmInstance[i]->returnSig = MMS_SIG_COMMON_BASE;
            fsmInstance[i]->transactionId = NULL;
            
            return i;
        } 
    } 

    return -1L;
} 

⌨️ 快捷键说明

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