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

📄 slcreate.c

📁 彩信MMS的全部代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
 * Copyright (C) Obigo AB, 2002-2005.
 * All rights reserved.
 *
 * This software is covered by the license agreement between
 * the end user and Obigo AB, and may be 
 * used and copied only in accordance with the terms of the 
 * said agreement.
 *
 * Obigo AB assumes no responsibility or 
 * liability for any errors or inaccuracies in this software, 
 * or any consequential, incidental or indirect damage arising
 * out of the use of the software.
 *
 */

















#include "cansilib.h"   
#include "cmnconf.h"    
#include "aapifile.h"   

#include "aapicmn.h"    
#include "gmem.h"       
#include "cmntypes.h"   

#include "mmem.h"       
#include "mmsconf.h"    
#include "mmstypes.h"   
#include "msig.h"       
#include "aapimms.h"    

#include "slutil.h"     
#include "slcreate.h"   




static const char SMIL_REGION_TEXT[] = "Text";


static const char SMIL_REGION_IMAGE[] = "Image";





const int SMIL_NUM_REGION_TO_ALLOW_ID_NAME_TEST = 2;




typedef enum
{ 
    SLC_ADD_QUOTES, 
    SLC_UNQUOTED 
} SlcQuotes;


static const char SLC_QUOTE_CHAR[] = "\"";




typedef enum 
{
    SLC_TAG_SMIL_BEGIN = 0, 
    SLC_TAG_SMIL_END,
    SLC_TAG_HEAD_BEGIN , 
    SLC_TAG_HEAD_END,
    SLC_TAG_BODY_BEGIN , 
    SLC_TAG_BODY_END,
    SLC_TAG_META_BEGIN, 
    SLC_TAG_META_CONTENT, 
    SLC_TAG_ATTR_NAME,      
    SLC_TAG_LAYOUT_BEGIN,
    SLC_TAG_LAYOUT_END,
    SLC_TAG_ROOT_LAYOUT,
    SLC_TAG_REGION,
    SLC_TAG_WIDTH, 
    SLC_TAG_HEIGHT,
    SLC_TAG_TOP, 
    SLC_TAG_LEFT,
    SLC_TAG_ID,
    SLC_TAG_FIT,
    SLC_TAG_BG_COLOR,       
    SLC_TAG_PAR_BEGIN,
    SLC_TAG_PAR_END,
    SLC_TAG_DUR,
    SLC_TAG_SRC,
    SLC_TAG_ATTR_REGION,
    SLC_TAG_ATTR_ALT,
    SLC_TAG_ATTR_BEGIN,
    SLC_TAG_ATTR_END,
    SLC_TAG_NEWLINE,
    SLC_TAG_LESS_THEN,
    SLC_TAG_GREATER_THEN,
    SLC_TAG_SPACE,
    SLC_TAG_END,
    SLC_TAG_PARAM,
    SLC_TAG_NAME_VALUE_BG_COLOR,    
    SLC_TAG_NAME_VALUE_FG_COLOR,    
    SLC_TAG_ATTR_VALUE,
    SLC_TAG_TEXT_END,
    SLC_TAG_LAST_ENTRY      
} SlcSmilTags;








static const char *slcSmilTagName[] = 
{ 
    "<smil>", "</smil>",  
    "<head>", "</head>",  
    "<body>", "</body>", 
    "<meta",  "content=", "name=", 
    "<layout>",
    "</layout>",
    "<root-layout",
    "<region",  "width=",  "height=", "top=",  "left=", "id=", "fit=",
    "backgroundColor=",
    "<par",   "</par>",
    "dur=",
    "src=",  "region=",  "alt=",  "begin=",  "end=",
        
    "\r\n",   
        
    "<",  ">",  " ",  "/>",
    "<param",
    "backgroundcolor", "foregroundcolor",
    "value=",
    "</text>"
};




static const char *slcMediaObjectElementStr[] = 
{
    "audio", "img", "ref", "text", "video"
};


static const char hex_digits[16] = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};



#define SLC_FILE_NOT_USED         0


#define SLC_FILE_CREATE_FAILED   -1


#define SLC_START_POS             0


#define SLC_QUOTE_CHAR_LEN        1


#define SLC_QUOTE_CHAR_POS        0


#define SLC_TWO_STR_QUOTE_INC_LEN 2





#define  SLC_BIT_FLAG_INIT_VALUE  0


#define SLC_BIT_HEAD_CREATED 0x01


#define SLC_BIT_PAR_CREATED  0x02


typedef struct 
{
    




    char buf[SMIL_CREATE_BUFFER_SIZE];
    
    
    int bufPos;
    

    



    unsigned long fileId;
    
    
    unsigned int filePos;

    
    SmilMsgStorage storageType;

    
    unsigned char flags;
} SlcInstance;






static SlcInstance *slcInst = NULL;


static CMN_BOOL slcFsmBusy = FALSE;


static SmilResult slcAddString(const char *inStr, SlcQuotes useQuotes);
static SmilResult slcAddTag(SlcSmilTags tag);
static SmilResult slcAddTagString(SlcSmilTags tag, const char *str, 
    SlcQuotes strQuote);
static SmilResult slcAddTagTag(SlcSmilTags tag, SlcSmilTags secondTag);
static SmilResult slcCreateHead(const SmilHead *head);
static SmilResult slcCreateMeta(const SmilMetaInfo *metaInfo);
static SmilResult slcCreateRootLayout(const SmilRootLayout *rootLayout);
static SmilResult slcCreateRegion(SmilRegion *region);
static SmilResult slcCreateMediaObjects(const SmilMediaObject *mobj);
static SmilResult slcCreateNoneNestedPar(const SmilPar *par);
static SmilResult slcWriteToFile(const char *strBuf, unsigned int strLen, 
    SlcQuotes useQuotes);
static void slcHandleCreateOfEnd(void);
static void slcHandleCreateOfHead(MmsSignal *sig);
static void slcHandleCreateOfPar(const MmsSignal *sig);
static void slcInitInstance(void);
static void slcDeleteInstance(void);
static void slcMain(MmsSignal *sig);
static void slcExitFailure(void);
static SmilResult slcZeroTerminateBuffer(void);
static SmilResult slcFlushFileBuffer(void);
















static SmilResult slcAddString(const char *inStr, SlcQuotes useQuotes)
{
    const char *p;          
    int size = 0;  
    int sizeIncludingQuotes = 0;      
    SmilResult res;

    
    p = inStr;
    while (*p && p++)
    {
        ++size;
    }
    
    sizeIncludingQuotes = size;
    if (SLC_ADD_QUOTES == useQuotes)
    {
        
        sizeIncludingQuotes += SLC_TWO_STR_QUOTE_INC_LEN;
    }
    
    
    if (sizeIncludingQuotes + slcInst->bufPos >= (int)SMIL_CREATE_BUFFER_SIZE)
    {
        
        if (SMIL_RESULT_OK != (res = slcWriteToFile(slcInst->buf, 
            (UINT32)slcInst->bufPos, SLC_UNQUOTED)))
        {
            return res;
        }
        
        else if (SMIL_RESULT_OK != (res = slcWriteToFile(inStr, (UINT32)size, 
            useQuotes)))
        {
            return res;
        }
        else
        {
            
            slcInst->bufPos = 0;
            return SMIL_RESULT_OK;
        }
    }
    
        
    if (SLC_ADD_QUOTES == useQuotes)
    {
        
        slcInst->buf[slcInst->bufPos] = SLC_QUOTE_CHAR[SLC_QUOTE_CHAR_POS]; 
        ++slcInst->bufPos;
    }
    
    
    while (inStr && *inStr)
    {
        slcInst->buf[slcInst->bufPos] = *inStr++;
        ++slcInst->bufPos;
    }
    
    if (SLC_ADD_QUOTES == useQuotes)
    {
        
        slcInst->buf[slcInst->bufPos] = SLC_QUOTE_CHAR[SLC_QUOTE_CHAR_POS];
        ++slcInst->bufPos;
    }
    
    return SMIL_RESULT_OK;
}








static SmilResult slcAddTag(SlcSmilTags tag)
{   
    
    if ((tag < SLC_TAG_SMIL_BEGIN) || (tag >= SLC_TAG_LAST_ENTRY))
    {
        MMS_LOG_I(("SMIL SLC: unknown keyword %d\n", tag));
        return SMIL_RESULT_UNKNOWN_KEYWORD;
    }
    else
    {
        return slcAddString(slcSmilTagName[tag], SLC_UNQUOTED);
    } 
}











static SmilResult slcAddTagString(SlcSmilTags tag, const char *str, 
    SlcQuotes strQuote)
{   
    SmilResult res;

    if ((tag < SLC_TAG_SMIL_BEGIN) || (tag >= SLC_TAG_LAST_ENTRY))
    {

        MMS_LOG_I(("SMIL SLC: unknown keyword %d\n", tag));
        return SMIL_RESULT_UNKNOWN_KEYWORD;
    }
    else if (SMIL_RESULT_OK != (res = slcAddString(slcSmilTagName[tag], 
                                                   SLC_UNQUOTED)))
    {
        return res;
    }
    else if (SMIL_RESULT_OK != (res = slcAddString(str, strQuote)))
    {
        return res;
    } 
    else  
    {
        return slcAddString(slcSmilTagName[SLC_TAG_SPACE], SLC_UNQUOTED);
    }
}










static SmilResult slcAddTagTag(SlcSmilTags tag, SlcSmilTags secondTag)
{   
    SmilResult res;

    if ((tag < SLC_TAG_SMIL_BEGIN) || (tag >= SLC_TAG_LAST_ENTRY))
    {

        MMS_LOG_I(("SMIL SLC: unknown keyword %d\n", tag));
        return SMIL_RESULT_UNKNOWN_KEYWORD;
    }
    else if (SMIL_RESULT_OK != (res = slcAddString(slcSmilTagName[tag], 
                                                   SLC_UNQUOTED)))
    {
        return res;
    }
    if ((secondTag < SLC_TAG_SMIL_BEGIN) || (secondTag >= SLC_TAG_LAST_ENTRY))
    {
        MMS_LOG_I(("SMIL SLC: unknown keyword %d\n", secondTag));
        return SMIL_RESULT_UNKNOWN_KEYWORD;
    }
    else 
    {
        return slcAddString(slcSmilTagName[secondTag], SLC_UNQUOTED);
    }
}











static SmilResult slcAddTagParam(SlcSmilTags nameKeyword, const char *valueStr)
{   
    SmilResult res;

    
    res = slcAddTag(SLC_TAG_PARAM);
    if (res != SMIL_RESULT_OK)
    {
        return res;
    }

    
    res = slcAddTag(SLC_TAG_SPACE);
    if (res != SMIL_RESULT_OK)
    {
        return res;
    }

    
    res = slcAddTagString(SLC_TAG_ATTR_NAME,
                          slcSmilTagName[nameKeyword], 
                          SLC_ADD_QUOTES);
    if (res != SMIL_RESULT_OK)
    {
        return res;
    }

    
    res = slcAddTagString(SLC_TAG_ATTR_VALUE, valueStr, SLC_ADD_QUOTES);
    if (res != SMIL_RESULT_OK)
    {
        return res;
    }
    
    
    res = slcAddTagTag(SLC_TAG_END, SLC_TAG_NEWLINE);
    if (res != SMIL_RESULT_OK)
    {
        return res;
    }

    return SMIL_RESULT_OK;
} 








void slcByte2Hex(unsigned char b, char *s)
{
    *s++ = hex_digits[(b >> 4) & 0xF];
    *s = hex_digits[b & 0xF];
}







static void slcByte2HexColor(UINT32 color, char *s)
{
    
    s[0] = SMIL_HASH_MARK;
    
    
    slcByte2Hex((unsigned char)(color>>16), &(s[1]));
    slcByte2Hex((unsigned char)(color>>8), &(s[3]));
    slcByte2Hex((unsigned char)color, &(s[5]));
    s[7] = EOS;
} 









static SmilResult slcCreateMediaObjects(const SmilMediaObject *mobj)
{    
    SmilResult res;
    char colorStr[(UINT32)8];

    while (mobj)
    {       
        if ((SMIL_MEDIA_OBJECT_AUDIO > mobj->mediaObjectElement) ||
            (SMIL_MEDIA_OBJECT_LAST_ENTRY <= mobj->mediaObjectElement))
        {
            MMS_LOG_I(("SMIL SLC: Unknown media object element, %d\n",
                mobj->mediaObjectElement));
            return SMIL_RESULT_UNKNOWN_MEDIA_OBJECT_ELEMENT;
        }
        else if (SMIL_RESULT_OK != 
            (res = slcAddTagString(SLC_TAG_LESS_THEN, 
             slcMediaObjectElementStr[mobj->mediaObjectElement], SLC_UNQUOTED)))
        {

⌨️ 快捷键说明

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