機頂盒向手機apk端發送xml格式的數據流程如下所示:
1.調用函數 (1) send_xml_data_to _mobile() ;
2.在函數(1)中調用函數(2)send_common_data_to_mobile();
3.在函數(2)中調用函數(3)create_xml_buff(),並向函數傳遞了三個重要的參數,分別是壓縮前的xml數據緩存xml_send_buff_before_compress,和一個結構體xml_root,以及xml_type;
4.在函數(3)中分情況討論,調用不同的方法創建攜帶不同信息的xml文件;
在該項目中攜帶不同數據信息的xml文件的生成主要通過使用libxml2所攜帶的庫函數完成xml文件的創建
以創建頻道節目列表爲例:
static BOOL create_channel_list_xml(char *result_buffer, void * buf)
{
xmlTextWriterPtr writer;
int rc;
int program_index = 0, j;
char str[GMS_MAX_BYTE_LENGTH_SERVICE_NAME];
char buff[GMS_MAX_BYTE_LENGTH_SERVICE_NAME];
GS_CHANNEL_LIST* channel_list = buf;
int prog_num;
GMS_PROGRAM_INFO * xml_array;
xmlBufferPtr xml_buf = NULL;
if (result_buffer == NULL)
{
return FALSE;
}
prog_num = channel_list->request_program_num;
xml_array = channel_list->program_list;
xml_buf = xmlBufferCreateSize(PROGRAM_SMALL_XML_BUFF_LENGTH);
if (xml_buf == NULL)
{
return FALSE;
}
LIBXML_TEST_VERSION
writer = xmlNewTextWriterMemory(xml_buf, 0);
if (writer == NULL)
{
printf("testXmlwriterFilename: Error creating the xml writer\n");
return FALSE;
}
rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
xmlFreeTextWriter(writer);
return FALSE;
}
//Command
rc = xmlTextWriterStartElement(writer, BAD_CAST "Command");
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
xmlFreeTextWriter(writer);
return FALSE;
}
for (program_index = 0; program_index < prog_num; program_index++)
{
//parm
rc = xmlTextWriterStartElement(writer, BAD_CAST "parm");
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
xmlFreeTextWriter(writer);
return FALSE;
}
//ProgramId
rc = xmlTextWriterWriteElement(writer, BAD_CAST "ProgramId", BAD_CAST xml_array[program_index].prog_sat_tp_id);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
xmlFreeTextWriter(writer);
return FALSE;
}
//ProgramName
convert_windows_to_utf8(xml_array[program_index].prog_name, xml_array[program_index].prog_name, sizeof(xml_array[program_index].prog_name), -1);
rc = xmlTextWriterWriteElement(writer, BAD_CAST "ProgramName", BAD_CAST xml_array[program_index].prog_name);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//ProgamIndex
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ProgramIndex", "%d", xml_array[program_index].prog_index);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//SatName
// rc = xmlTextWriterWriteElement(writer, BAD_CAST "SatName", BAD_CAST xml_array[i].sat_name);
// if (rc < 0)
// {
// printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
// xmlFreeTextWriter(writer);
// return FALSE;
// }
//ProgramType
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ProgramType", "%d", xml_array[program_index].is_scramble);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//Is HD channel
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IsProgramHD", "%d", xml_array[program_index].is_hd);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//FavMark
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "FavMark", "%d", xml_array[program_index].fav_mark);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//LockMark
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "LockMark", "%d", xml_array[program_index].lock_mark);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//haveEPG
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HaveEPG", "%d", xml_array[program_index].have_epg);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//is_playing
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IsPlaying", "%d", xml_array[program_index].is_playing);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//will_be_played
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "WillBePlayed", "%d", xml_array[program_index].will_be_played);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//CurChannelType
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ChannelType", "%d", xml_array[program_index].channel_type);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
// //freq
// rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Frequency", "%d", xml_array[i].freq);
// if (rc < 0)
// {
// printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
// xmlFreeTextWriter(writer);
// return FALSE;
// }
//
// //pol
// rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Polar", "%d", xml_array[i].pol);
// if (rc < 0)
// {
// printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
// xmlFreeTextWriter(writer);
// return FALSE;
// }
//modulation_sys
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ModulationSystem", "%d", xml_array[program_index].modulation_sys);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//modulation_type
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ModulationType", "%d", xml_array[program_index].modulation_type);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//roll_off
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "RollOff", "%d", xml_array[program_index].roll_off);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//pilot_tones
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PilotTones", "%d", xml_array[program_index].pilot_tones);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
// //sym_rate
// rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "SymbolRate", "%d", xml_array[i].sym_rate);
// if (rc < 0)
// {
// printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
// xmlFreeTextWriter(writer);
// return FALSE;
// }
//
// //fec
// rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Fec", "%d", xml_array[i].fec);
// if (rc < 0)
// {
// printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
// xmlFreeTextWriter(writer);
// return FALSE;
// }
//video_pid
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "VideoPid", "%d", xml_array[program_index].video_pid);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//audio_pid
memset(str, 0x00, GMS_MAX_BYTE_LENGTH_SERVICE_NAME);
for (j = 0; j < xml_array[program_index].audio_pid_num; j++)
{
if (j > 0)
{
string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, ",");
itoa(xml_array[program_index].audio_pid[j], buff, 10);
string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, buff);
}
else
{
itoa(xml_array[program_index].audio_pid[j], buff, 10);
string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, buff);
}
}
rc = xmlTextWriterWriteElement(writer, BAD_CAST "AudioPid", BAD_CAST str);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//ttx_pid
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "TtxPid", "%d", xml_array[program_index].ttx_pid);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//sub_pid
memset(str, 0x00, GMS_MAX_BYTE_LENGTH_SERVICE_NAME);
for (j = 0; j < xml_array[program_index].sub_pid_num; j++)
{
if (j > 0)
{
string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, ",");
itoa(xml_array[program_index].sub_pid[j], buff, 10);
string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, buff);
}
else
{
itoa(xml_array[program_index].sub_pid[j], buff, 10);
string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, buff);
}
}
rc = xmlTextWriterWriteElement(writer, BAD_CAST "SubPid", BAD_CAST str);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//pmt_pid
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PmtPid", "%d", xml_array[program_index].pmt_pid);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//which tunner
rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IsTuner2", "%d", xml_array[program_index].is_channel_in_tunner_2);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__);
xmlFreeTextWriter(writer);
return FALSE;
}
//end of parm
rc = xmlTextWriterEndElement(writer);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
xmlFreeTextWriter(writer);
return FALSE;
}
}
rc = xmlTextWriterEndElement(writer);
if (rc < 0)
{
printf("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
xmlFreeTextWriter(writer);
return FALSE;
}
xmlFreeTextWriter(writer);
strcpy(result_buffer,(const char *)xml_buf->content);
xmlCleanupParser();
xmlBufferFree(xml_buf);
return TRUE;
}