[Redbutton-devel] SF.net SVN: redbutton: [275] redbutton-browser/trunk
Brought to you by:
skilvington
|
From: <ski...@us...> - 2007-04-03 14:14:43
|
Revision: 275
http://svn.sourceforge.net/redbutton/?rev=275&view=rev
Author: skilvington
Date: 2007-04-03 07:14:42 -0700 (Tue, 03 Apr 2007)
Log Message:
-----------
SI_GetBasicSI resident programme
Modified Paths:
--------------
redbutton-browser/trunk/ResidentProgramClass.c
redbutton-browser/trunk/si.c
redbutton-browser/trunk/si.h
Modified: redbutton-browser/trunk/ResidentProgramClass.c
===================================================================
--- redbutton-browser/trunk/ResidentProgramClass.c 2007-04-03 13:10:45 UTC (rev 274)
+++ redbutton-browser/trunk/ResidentProgramClass.c 2007-04-03 14:14:42 UTC (rev 275)
@@ -991,6 +991,17 @@
bool
prog_SI_GetBasicSI(LIST_OF(Parameter) *params, OctetString *caller_gid)
{
+ GenericInteger *serviceIndex_par;
+ GenericInteger *networkId_par;
+ GenericInteger *origNetworkId_par;
+ GenericInteger *transportStreamId_par;
+ GenericInteger *serviceId_par;
+ int si;
+ OctetString *url;
+ unsigned int network_id;
+ unsigned int transport_id;
+ unsigned int service_id;
+
if(!check_parameters(params, 5, Parameter_new_generic_integer, /* in: serviceIndex */
Parameter_new_generic_integer, /* out: networkId */
Parameter_new_generic_integer, /* out: origNetworkId */
@@ -1000,8 +1011,28 @@
error("ResidentProgram: SI_GetBasicSI (BSI): wrong number or type of parameters");
return false;
}
-/* TODO */
-printf("TODO: program BSI SI_GetBasicSI\n");
+
+ serviceIndex_par = &(get_parameter(params, 1)->u.new_generic_integer);
+ networkId_par = &(get_parameter(params, 2)->u.new_generic_integer);
+ origNetworkId_par = &(get_parameter(params, 3)->u.new_generic_integer);
+ transportStreamId_par = &(get_parameter(params, 4)->u.new_generic_integer);
+ serviceId_par = &(get_parameter(params, 5)->u.new_generic_integer);
+
+ si = GenericInteger_getInteger(serviceIndex_par, caller_gid);
+ url = si_get_url(si);
+
+ network_id = si_get_network_id(url);
+ transport_id = si_get_transport_id(url);
+ service_id = si_get_service_id(url);
+
+ /* not sure what the difference between the Network ID and the Original Network ID is */
+ GenericInteger_setInteger(networkId_par, caller_gid, network_id);
+ GenericInteger_setInteger(origNetworkId_par, caller_gid, network_id);
+ GenericInteger_setInteger(transportStreamId_par, caller_gid, transport_id);
+ GenericInteger_setInteger(serviceId_par, caller_gid, service_id);
+
+ verbose("ResidentProgram: SI_GetBasicSI(%u, %u, %u, %u, %u)", si, network_id, network_id, transport_id, service_id);
+
return true;
}
Modified: redbutton-browser/trunk/si.c
===================================================================
--- redbutton-browser/trunk/si.c 2007-04-03 13:10:45 UTC (rev 274)
+++ redbutton-browser/trunk/si.c 2007-04-03 14:14:42 UTC (rev 275)
@@ -22,6 +22,12 @@
if(OctetString_cmp(ref, &si_channel[i]) == 0)
return i;
+/* TODO */
+/* convert rec://svc/{def,cur,lcn/X} to dvb://network.transport.service */
+/* even if we don't have a backend! */
+if(ref->size < 6 || strncmp(ref->data, "dvb://", 6) != 0)
+printf("TODO: si_get_index '%.*s' is not in 'dvb://' format\n", ref->size, ref->data);
+
/* add it to the list */
si_max_index ++;
si_channel = safe_realloc(si_channel, (si_max_index + 1) * sizeof(OctetString));
@@ -30,6 +36,18 @@
return si_max_index;
}
+OctetString *
+si_get_url(int index)
+{
+ if(index > si_max_index)
+ {
+ error("SI_GetURL: invalid service index (%d); max is %d", index, si_max_index);
+ return NULL;
+ }
+
+ return &si_channel[index];
+}
+
bool
si_tune_index(int index)
{
@@ -44,12 +62,72 @@
return true;
}
+/*
+ * URL format is:
+ * dvb://original_network_id.[transport_id].service_id
+ * each id is a hex value without any preceeding 0x etc
+ */
+
unsigned int
+si_get_network_id(OctetString *ref)
+{
+ unsigned int pos;
+ unsigned int id;
+
+ if(ref == NULL || ref->size < 6 || strncmp(ref->data, "dvb://", 6) != 0)
+ return 0;
+
+ /* read upto the first . or end of string */
+ id = 0;
+ pos = 6;
+ while(pos < ref->size && isxdigit(ref->data[pos]))
+ {
+ id <<= 4;
+ id += char2hex(ref->data[pos]);
+ pos ++;
+ }
+
+ return id;
+}
+
+unsigned int
+si_get_transport_id(OctetString *ref)
+{
+ unsigned int pos;
+ unsigned int id;
+
+ if(ref == NULL || ref->size < 6 || strncmp(ref->data, "dvb://", 6) != 0)
+ return 0;
+
+ /* find the first . or end of string */
+ pos = 6;
+ while(pos < ref->size && ref->data[pos] != '.')
+ pos ++;
+
+ /* skip the . */
+ pos ++;
+
+ /* read the value */
+ id = 0;
+ while(pos < ref->size && isxdigit(ref->data[pos]))
+ {
+ id <<= 4;
+ id += char2hex(ref->data[pos]);
+ pos ++;
+ }
+
+ return id;
+}
+
+unsigned int
si_get_service_id(OctetString *ref)
{
unsigned int len;
unsigned int id;
+ if(ref == NULL || ref->size < 6 || strncmp(ref->data, "dvb://", 6) != 0)
+ return 0;
+
len = ref->size;
while(len > 0 && isxdigit(ref->data[len - 1]))
len --;
Modified: redbutton-browser/trunk/si.h
===================================================================
--- redbutton-browser/trunk/si.h 2007-04-03 13:10:45 UTC (rev 274)
+++ redbutton-browser/trunk/si.h 2007-04-03 14:14:42 UTC (rev 275)
@@ -8,8 +8,12 @@
#include "der_decode.h"
int si_get_index(OctetString *);
+OctetString *si_get_url(int);
+
bool si_tune_index(int);
+unsigned int si_get_network_id(OctetString *);
+unsigned int si_get_transport_id(OctetString *);
unsigned int si_get_service_id(OctetString *);
void si_free(void);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|