📄 slcreate.c
字号:
/*
* 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 + -