Example #1
0
bool opentv_read_channels_bat (unsigned char *data, unsigned int length)
{
	unsigned short int	bouquet_descriptors_length		= ((data[8] & 0x0f) << 8) | data[9];
	unsigned short int	transport_stream_loop_length	= ((data[bouquet_descriptors_length + 10] & 0x0f) << 8) | data[bouquet_descriptors_length + 11];
	unsigned int		offset1							= bouquet_descriptors_length + 12;
	bool				ret								= false;
	
	while (transport_stream_loop_length > 0)
	{
		unsigned short int	tid							= (data[offset1] << 8) | data[offset1 + 1];
		unsigned short int	nid							= (data[offset1 + 2] << 8) | data[offset1 + 3];
		unsigned short int	transport_descriptor_length	= ((data[offset1 + 4] & 0x0f) << 8) | data[offset1 + 5];
		unsigned int		offset2						= offset1 + 6;
		
		offset1							+= (transport_descriptor_length + 6);
		transport_stream_loop_length	-= (transport_descriptor_length + 6);
		
		while (transport_descriptor_length > 0)
		{
			unsigned char	descriptor_tag		= data[offset2];
			unsigned char	descriptor_length	= data[offset2 + 1];
			unsigned int	offset3				= offset2 + 2;
			
			offset2						+= (descriptor_length + 2);
			transport_descriptor_length	-= (descriptor_length + 2);
			
			if (descriptor_tag == 0xb1)
			{
				offset3				+= 2;
				descriptor_length	-= 2;
				while (descriptor_length > 0)
				{
					unsigned short int channel_id;
					//unsigned short int sky_id;
					
					channel_id = (data[offset3 + 3] << 8) | data[offset3 + 4];
					//sky_id = ( data[offset3+5] << 8 ) | data[offset3+6];
					
					if (channels[channel_id] == NULL)
					{
						channels[channel_id] = epgdb_channels_add (nid, tid, (data[offset3] << 8) | data[offset3 + 1]);
						ch_count++;
						ret = true;
					}
					
					offset3				+= 9;
					descriptor_length	-= 9;
				}
			}
		}
	}
	
	return ret;
}
bool dbmerge_merge (FILE *fd_h, FILE *fd_d, void(*progress_callback)(int, int))
{
	char tmp[256];
	unsigned char revision;
	int channels_count, i, j, aliases_groups_count, indexes_count;
	time_t now = time (NULL);

	/* read headers */
	fread (tmp, strlen (MAGIC_HEADERS), 1, fd_h);
	if (memcmp (tmp, MAGIC_HEADERS, strlen (MAGIC_HEADERS)) != 0)
	{
		log_add ("Bad magic header");
		return false;
	}
	fread (&revision, sizeof (unsigned char), 1, fd_h);
	if (revision != DB_REVISION)
	{
		log_add ("Bad db revision");
		return false;
	}

	fseek (fd_h, 22, SEEK_SET);

	fread (&channels_count, sizeof (int), 1, fd_h);
	for (i=0; i<channels_count; i++)
	{
		int titles_count;
		epgdb_channel_t *tmp;
		epgdb_channel_t *channel, *channel_tmp;

		channel_tmp = _malloc (sizeof (epgdb_channel_t));
		fread (channel_tmp, sizeof (epgdb_channel_header_t), 1, fd_h);
		channel = epgdb_channels_add (channel_tmp->nid, channel_tmp->tsid, channel_tmp->sid);
		_free (channel_tmp);

		fread (&titles_count, sizeof (int), 1, fd_h);

		for (j=0; j<titles_count; j++)
		{
			char *desc, *ldesc;
			epgdb_title_t *title = _malloc (sizeof (epgdb_title_t));
			fread (title, sizeof (epgdb_title_header_t), 1, fd_h);

			desc = dbmerge_read_description (fd_d, title);
			ldesc = dbmerge_read_long_description (fd_d, title);

			title = epgdb_titles_add (channel, title);

			epgdb_titles_set_description(title, desc);
			epgdb_titles_set_long_description(title, ldesc);

			_free (desc);
			_free (ldesc);
		}

		if (progress_callback)
			progress_callback (i, channels_count);
	}


	return true;
}