//////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> Compara en emision por cadena. </summary> /// /// <remarks> Método predicado usado por el método FindAll para obtener todas las emisiones que pertenecen a una /// única cadena. Se apoya en el atributo de clase ID_cadena.</remarks> /// /// <param name="x"> Emisión actual </param> /// /// <returns> true if it succeeds, false if it fails. </returns> //////////////////////////////////////////////////////////////////////////////////////////////////// private bool ComparaENEmisionPorCadena(ENEmision x) { return(x.Id_cadena == ID_cadena); }
//////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> Compara en emision por fecha inicio. </summary> /// /// <remarks> Método delegado usado para la ordenación, método Sort, del objeto Collection.List </remarks> /// /// <param name="x"> Emision actual </param> /// <param name="y"> Siguiente emisión </param> /// /// <returns> . </returns> //////////////////////////////////////////////////////////////////////////////////////////////////// private int ComparaENEmisionPorFechaInicio(ENEmision x, ENEmision y) { return(x.FechaHoraInicio.CompareTo(y.FechaHoraInicio)); }
//////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> Leer xmltv. </summary> /// /// <remarks> Procesa el documento XML rellenando la lista List que almacena las emisiones. /// /// Las etiquetas channel, contienen información de las cadenas, mientras que la etiqueta programme sobre /// los programas. /// Una vez leído el XML, se ordena la lista usando como criterio la fecha de emisión, y, posteriormente /// se recorre para realizar las inserciones en la BD de forma correcta. Cada emisión debe calcular su duración con relación /// a la siguiente emsión dentro de la cadena. /// </remarks> /// /// <param name="xElem"> The x coordinate element. </param> //////////////////////////////////////////////////////////////////////////////////////////////////// public void leerXMLtv(XElement xElem) { string infoLectura = ""; infoLectura = etRespuesta.Text + "\nLeyendo XML..."; MensajeSistema(etRespuesta, infoLectura, kMensajeSistema.mCORRECTO); MensajeSistema(etInfoXML, "Procesando XML...", kMensajeSistema.mCORRECTO); gbInfoXML.Visible = true; try { //La ruta del documento XML permite rutas relativas //respecto del ejecutable! int numcad = 0; int numprog = 0; Hashtable miguiaTV = new Hashtable(); List <ENEmision> listaEmision = new List <ENEmision>(); IEnumerable <XElement> ListaHijos = from el in xElem.Elements() select el; foreach (XElement e in ListaHijos) { if (e.Name.LocalName == "channel") { IEnumerable <XElement> HijosDeChannel = from hijo in e.Elements() select hijo; foreach (XElement h in HijosDeChannel) { if (h.Name.LocalName == "display-name") { ENCadena nuevo = new ENCadena(h.Value); nuevo.Activo = true; nuevo.Tipo = Enum.GetName(typeof(kTipo), kTipo.Generalista); // e.Attribute int id = nuevo.existeNombreCadena(); if (id == -1) // No existe el nombre en la BD { nuevo.insertarCadena(); miguiaTV[e.FirstAttribute.Value] = nuevo.Id; infoLectura = etRespuesta.Text + "\nAñadido nuevo Canal: " + nuevo.Nombre; MensajeSistema(etRespuesta, infoLectura, kMensajeSistema.mCORRECTO); } else { miguiaTV[e.FirstAttribute.Value] = id; numcad++; } } } } if (e.Name.LocalName == "programme") { // Start string start = SecurityElement.Escape(e.Attribute("start").Value); // Channel string channel = e.Attribute("channel").Value; int cadena = (int)miguiaTV[channel]; string nombre = SecurityElement.Escape(Validacion.SustituyeCaracteresRaros(e.Element("title").Value)); // string descripcion = xmlStringHelpers.ConvierteA_UTF8(e.Element("desc").Value); string descripcion = SecurityElement.Escape(Validacion.SustituyeCaracteresRaros(e.Element("desc").Value)); int tematica = 1; int calificacion = 1; bool novedad = true; bool activo = true; int id_programa = -1; ENPrograma p = new ENPrograma(cadena, tematica, calificacion, nombre, descripcion, activo, novedad); if (!p.existePrograma()) { p.InsertarPrograma(); id_programa = p.Id_Programa; infoLectura = etRespuesta.Text + "\nAñadido nuevo Programa: " + p.Nombre; MensajeSistema(etRespuesta, infoLectura, kMensajeSistema.mCORRECTO); numprog++; } else { id_programa = p.ObtenerIdPrograma(0, nombre); } DateTimeConverter con = new DateTimeConverter(); string anyo = start.Substring(0, 4); string mes = start.Substring(4, 2); string dia = start.Substring(6, 2); string hora = start.Substring(8, 2); string minuto = start.Substring(10, 2); string segundo = start.Substring(12, 2); DateTime fechaHoraEmision = new DateTime(Convert.ToInt32(anyo), Convert.ToInt32(mes), Convert.ToInt32(dia), Convert.ToInt32(hora), Convert.ToInt32(minuto), Convert.ToInt32(segundo)); ENEmision emision = new ENEmision(cadena, id_programa, fechaHoraEmision, 0); listaEmision.Add(emision); } } listaEmision.Sort(ComparaENEmisionPorFechaInicio); MensajeSistema(etInfoXML, "Creando estructura de datos interna...", kMensajeSistema.mADVERTENCIA); gbInfoXML.Visible = true; foreach (int id_cadena in miguiaTV.Values) { List <ENEmision> emisionPorCadena = new List <ENEmision>(); ID_cadena = id_cadena; emisionPorCadena = listaEmision.FindAll(ComparaENEmisionPorCadena); //(totaller.AddBookToTotal)ComparaENEmisionPorCadena); // Bucle que asigna las duraciones for (int j = 0; j < emisionPorCadena.Count; j++) { if (j == (emisionPorCadena.Count) - 1) { // Ultima emision emisionPorCadena[emisionPorCadena.Count - 1].Duracion = 30; listaEmisionCompleta.Add(emisionPorCadena[emisionPorCadena.Count - 1]); } else { // Todas excepto la última ENEmision completa = emisionPorCadena[j]; DateTime actual = emisionPorCadena[j].FechaHoraInicio; DateTime siguiente = emisionPorCadena[j + 1].FechaHoraInicio; TimeSpan duracion = siguiente.Subtract(actual); completa.Duracion = (int)Math.Ceiling(duracion.TotalMinutes); listaEmisionCompleta.Add(completa); } } } infoLectura = etRespuesta.Text + "\nEstructura de datos interna cargada con la programación."; MensajeSistema(etRespuesta, infoLectura, kMensajeSistema.mCORRECTO); MensajeSistema(etInfoXML, "Proceso finalizado", kMensajeSistema.mCORRECTO); gbInfoXML.Visible = true; } catch (Exception ex) { if (MessageBox.Show("El fichero xml no está bien formado, hay que volver a generarlo. ¿Desea generar de nuevo el xml?", "TEVEO :: Aplicación de gestión", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { btnGenerarXML_Click((Button)btnCarga, null); } } }