Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Feb 22nd, 2010 | Syntax: C | Size: 16.88 KB | Hits: 231 | Expires: Never
Copy text to clipboard
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using Skybound.Gecko;
  9. using System.IO;
  10. using System.Threading;
  11.  
  12. namespace DirectShowLib.Sample
  13. {
  14.     public partial class FirefoxOverlay : Form
  15.     {
  16.         //bekommt Zugriff auf das panel1 von mainform
  17.         //wird über Konstruktor übergeben
  18.         Panel dvbPanel;
  19.  
  20.         //neutral grau für FarbKeying in Hex und RGB
  21.         public static string keyColorHex = "eeeeee";
  22.         public static Color keyColorRGB = System.Drawing.Color.FromArgb(238, 238, 238);
  23.  
  24.         bool dvbPanelisMaximize = false;
  25.  
  26.         //enthält Informationen über das video/broadcast <object>
  27.         DvbVideoInformation information = new DvbVideoInformation();
  28.  
  29.         //variable, welche den eigenen Thread stoppt
  30.         bool doCloseUpdateThread = false;
  31.  
  32.         public FirefoxOverlay(Panel dvbPanel)
  33.         {
  34.             InitializeComponent();
  35.  
  36.             this.dvbPanel = dvbPanel;
  37.  
  38.             //Entfernt Scrollbalken. Html größe nun von Form größe abhängig, kein overflow mehr
  39.             geckoWebBrowser1.MinimumSize = new Size(1280, 720);
  40.  
  41.         }
  42.  
  43.         public void showWindow()
  44.         {
  45.             geckoWebBrowser1.Show();
  46.             this.BringToFront();
  47.         }
  48.  
  49.  
  50.         /// <summary>
  51.         /// Fügt dem HTML immer einen neutralgrauen Background ein. Unwahrscheinliche Farbe die auftritt
  52.         /// Zum background keyen erforderlich!
  53.         /// </summary>
  54.         delegate void delSetBackground();
  55.         public void setBackground()
  56.         {
  57.             //geckoWebBrowser1.Navigate("javascript:void(document.bgColor='#"+keyColorHex+"');");
  58.  
  59.             GeckoElementCollection objectCollection = geckoWebBrowser1.Document.GetElementsByTagName("body");
  60.  
  61.             if (objectCollection[0] != null)
  62.                 objectCollection[0].SetAttribute("style", "background-color:#" + keyColorHex + ";");
  63.  
  64.  
  65.         }
  66.  
  67.  
  68.  
  69.         /// <summary>
  70.         /// Funktion sucht im HTML Quelltext nach <object type="video/broadcast">
  71.         /// und übergibt dessen Informationen wie z.B Position,Größe und existenz.
  72.         /// delegate damit es vom Thread aufrufbar ist
  73.         /// </summary>
  74.         delegate void delegateSearch();
  75.         public void searchVideoBroadcastObject()
  76.         {
  77.             //Default wert setzen
  78.             information.exist(false);
  79.  
  80.             //sucht alle <object> tags ab und fügt sie zu einer liste hinzu
  81.             GeckoElementCollection objectCollection = geckoWebBrowser1.Document.GetElementsByTagName("object");
  82.  
  83.             for (int i = 0; i < objectCollection.Count; i++)
  84.             {
  85.                 //durchgrast die liste nach type=video/broadcast
  86.                 if (objectCollection[i].GetAttribute("type") == "video/broadcast")
  87.                 {
  88.  
  89.                     //MessageBox.Show("dvb video vorhanden");
  90.                     information.exist(true);
  91.  
  92.                     //unsicherer Code - attribut könnte nicht vorhanden sein -->Absturz
  93.                     //information.setScaleX(Convert.ToInt16(objectCollection[i].GetAttribute("width")));
  94.                     //information.setScaleY(Convert.ToInt16(objectCollection[i].GetAttribute("height")));
  95.  
  96.                     information.setIDName(objectCollection[i].GetAttribute("id"));
  97.  
  98.                     //findet absolute Position des Videocontainers
  99.                     //indem er sich bis zum body element hochhangelt
  100.                     //und von jedem übergeordneten element top und left aufaddiert
  101.                     int xParameter = 0;
  102.                     int yParameter = 0;
  103.  
  104.                     GeckoElement node = objectCollection[i];
  105.  
  106.                     while (node.TagName != "BODY")
  107.                     {
  108.                         //MessageBox.Show(node.TagName);
  109.                         xParameter += node.OffsetLeft;
  110.                         yParameter += node.OffsetTop;
  111.                         node = node.Parent; //ebene höher gehen
  112.                     }
  113.  
  114.  
  115.                     //im Folgenden wird zusätzlich das Style Attribut (Css)analysiert nach seinen Werten
  116.                     // wie left;top;height;width:
  117.                     String styleString = Convert.ToString(objectCollection[i].GetAttribute("style"));
  118.  
  119.                     int cssX = getVideoLoc(styleString, 0);
  120.                     int cssY = getVideoLoc(styleString, 1);
  121.                     int cssWidth = getVideoLoc(styleString, 2);
  122.                     int cssHeight = getVideoLoc(styleString, 3);
  123.  
  124.                     //Setzt immer Größe anhand der CSS formatierung
  125.                     information.setScaleX(cssWidth);
  126.                     information.setScaleY(cssHeight);
  127.  
  128.                     //setzt vorläufig die Position anhand der HTML verschachtelung
  129.                     information.setPositionX(xParameter);
  130.                     information.setPositionY(yParameter);
  131.  
  132.                     //wenn breite 1280,dann ist video fullscreen und top+left=0
  133.                     if (cssWidth == 1280)
  134.                     {
  135.                         information.setPositionX(0);
  136.                         information.setPositionY(0);
  137.                     }
  138.  
  139.                     //Der Fall wenn ein kleines Video vorhanden ist
  140.                     else
  141.                     {
  142.                         //wenn Html Verschachtelung beide 0 ergibt, dann verwende CSS,
  143.                         //auch wenn es dennoch 0 sein kann
  144.                         if (xParameter == 0 && yParameter == 0)
  145.                         {
  146.                             information.setPositionX(cssX);
  147.                             information.setPositionY(cssY);
  148.                         }
  149.                     }
  150.  
  151.                 }
  152.  
  153.             }
  154.  
  155.         }
  156.  
  157.  
  158.  
  159.         /// <summary>
  160.         /// Bettet den DVB Stream in das HTML ein. Eine "Durchscheinmaske" (panel1) wird erstellt,
  161.         /// welche die position und scaling des <objects..> hat. der firefox hat an der stelle
  162.         /// der Maske einen "blue-screen" bereich, mit welchem man auf die mainform drauf schauen kann
  163.         /// das video liegt im hintergrund und wurde auch repositioniert und rescaled.
  164.         /// </summary>
  165.         delegate void delegateEmbedDVB();
  166.         public void embedDVBinHTML()
  167.         {
  168.  
  169.             if (information.exist() == true)
  170.             {
  171.  
  172.                 dvbPanel.Dock = System.Windows.Forms.DockStyle.None;
  173.                 dvbPanel.Location = new Point(information.getPositionX(), information.getPositionY());
  174.                 dvbPanel.Size = new Size(information.getScaleX(), information.getScaleY());
  175.  
  176.                 //Console.WriteLine(Convert.ToString("vorif :"+information.getScaleX()));
  177.  
  178.                 if (information.getScaleX() == 1280 && information.getScaleY() == 720)
  179.                 {
  180.                     //jetzt soll dvb Film Fullscreen sein und die schnittebene panel wird nicht mehr gebraucht
  181.                     panel1.Size = new Size(0, 0);
  182.                     panel1.Location = new Point(0, 0);
  183.  
  184.                     dvbPanelisMaximize = true;
  185.                     //Dock.Fill entspricht maximaler größe bzw Ursprungszustand
  186.                     if (!dvbPanelisMaximize) dvbPanel.Dock = System.Windows.Forms.DockStyle.Fill;
  187.                     //Console.WriteLine(Convert.ToString(information.getScaleX()));
  188.                 }
  189.                 else
  190.                 {
  191.                     //dvb video wird nun an die richtige kleinere stelle gesetzt
  192.                     panel1.Location = new Point(information.getPositionX() - 1, information.getPositionY() - 1);
  193.                     panel1.Size = new Size(information.getScaleX(), information.getScaleY());
  194.                     dvbPanelisMaximize = false;
  195.                 }
  196.  
  197.                 panel1.Refresh();
  198.             }
  199.  
  200.             else
  201.             {
  202.                 dvbPanel.Dock = System.Windows.Forms.DockStyle.Fill;
  203.                 panel1.Size = new Size(0, 0);
  204.                 panel1.Location = new Point(0, 0);
  205.             }
  206.         }
  207.  
  208.  
  209.         public void navigate(String url)
  210.         {
  211.             geckoWebBrowser1.Navigate(url);
  212.         }
  213.  
  214.  
  215.         /// <summary>
  216.         /// Überwacht video-broadcast-object. Läuft nur als Thread
  217.         /// </summary>
  218.         public void updateInformation()
  219.         {
  220.             // Um als eigenständiger Thread dennoch auf die Methoden der eigenen Klasse
  221.             //zugreifen zu können, müssen die Funktionen als delegate aufgerufen werden
  222.             delegateSearch delegateSearch = new delegateSearch(this.searchVideoBroadcastObject);
  223.             delegateEmbedDVB delEmbedDVB = new delegateEmbedDVB(this.embedDVBinHTML);
  224.             delSetBackground delSetBackground = new delSetBackground(this.setBackground);
  225.  
  226.             while (doCloseUpdateThread == false)
  227.             {
  228.  
  229.                 this.Invoke(delegateSearch);
  230.                 this.Invoke(delEmbedDVB);
  231.                 this.Invoke(delSetBackground);
  232.  
  233.                 Thread.Sleep(500); //0,5 sec warten
  234.  
  235.             }
  236.         }
  237.  
  238.         /// <summary>
  239.         /// Setzt cancel Variable um object ÜberwachungsThread bei ProgrammEnde zu stoppen
  240.         /// </summary>
  241.         public void cancelThread()
  242.         {
  243.             doCloseUpdateThread = true;
  244.         }
  245.  
  246.  
  247.         /// <summary>
  248.         /// Feuert einen Event in den Firefox
  249.         /// Event vom DSMCC Decoder
  250.         ///
  251.         /// Originaler JS Code : -->
  252.         /// var ev = document.createEvent("StreamEvent");
  253.         /// ev.initStreamEvent("StreamEvent", true, false, "name", "data", "text");
  254.         /// video.dispatchEvent(ev);
  255.         /// </summary>
  256.         public delegate void delegateFireEvent(String name, String data, String text);
  257.         public void fireEvent(String name, String data, String text)
  258.         {
  259.  
  260.             searchVideoBroadcastObject();
  261.  
  262.             //wenn es ein objekt gibt ,dann erlaube event fire
  263.             if (information.exist() == true)
  264.             {
  265.  
  266.                 //Sämtliche Codes werden in den Firefox "injected" über die URL Eingabe (navigate).
  267.  
  268.                 //erzeugt ein neues Event vom Typ StreamEvent
  269.                 geckoWebBrowser1.Navigate("javascript:var ev = document.createEvent(\"StreamEvent\")");
  270.  
  271.                 //holt sich das video objekt mit Hilfe  der id vom <object> tag
  272.                 geckoWebBrowser1.Navigate("javascript:var video = document.getElementById(\"" + information.getIDName() + "\");");
  273.  
  274.                 //hängt den validen addeventListener an, addstreameventlistener wird nicht verwendet, aber umgemapped
  275.                 geckoWebBrowser1.Navigate("javascript:void(video.addEventListener(\"StreamEvent\"," + searchStreamEventListener() + ",true));");
  276.  
  277.                 //Initialisiert das StreamEvent und füllt es mit den 3 wichtigen Strings
  278.                 geckoWebBrowser1.Navigate("javascript:void(ev.initStreamEvent(\"StreamEvent\", true, false, \"" + name + "\", \"" + data + "\", \"" + text + "\"));");
  279.  
  280.                 //feuert das Event in die Javascript Umgebung des Firefox
  281.                 geckoWebBrowser1.Navigate("javascript:void(video.dispatchEvent(ev));");
  282.  
  283.             }
  284.  
  285.  
  286.         }
  287.  
  288.         /// <summary>
  289.         /// Durchsucht kompletten HTML Code nach dem dritten Argument des addstreameventlisteners
  290.         /// </summary>
  291.         public String searchStreamEventListener()
  292.         {
  293.             string path = geckoWebBrowser1.Url.ToString().Substring(8);
  294.             string s = ReadFile(path);
  295.  
  296.             string funcname = "";
  297.  
  298.             GeckoElementCollection objectCollection = geckoWebBrowser1.Document.GetElementsByTagName("script");
  299.  
  300.             string[] pathsub = new string[objectCollection.Count];
  301.             for (int i = 0; i < objectCollection.Count; i++)
  302.             {
  303.                 if (objectCollection[i].GetAttribute("type") == "text/javascript")
  304.                 {
  305.                     pathsub[i] = objectCollection[i].GetAttribute("src");
  306.                     //MessageBox.Show(pathsub[i]);
  307.  
  308.                 }
  309.             }
  310.  
  311.  
  312.             if (s.Contains(".addStreamEventListener"))
  313.             {
  314.                 funcname = getFuncName(s);
  315.             }
  316.             else
  317.             {
  318.                 for (int i = 0; i < objectCollection.Count; i++)
  319.                 {
  320.                     path = path.Substring(0, path.LastIndexOf("/") + 1);
  321.                     s = ReadFile(path + pathsub[i]);
  322.  
  323.                     if (s.Contains(".addStreamEventListener"))
  324.                     {
  325.                         funcname = getFuncName(s);
  326.                     }
  327.                 }
  328.             }
  329.             //  Console.WriteLine(getFuncName(ReadFile(path + pathsub[1]))); //<-- test für eigenes file
  330.             //MessageBox.Show("dritter Parameter: " + funcname);
  331.             return funcname;
  332.         }
  333.  
  334.         /// <summary>
  335.         /// Ließt Datei in einen langen String ein
  336.         /// </summary>
  337.         public string ReadFile(String sFilename)
  338.         {
  339.             string sContent = "";
  340.             if (File.Exists(sFilename))
  341.             {
  342.                 StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default);
  343.                 sContent = myFile.ReadToEnd();
  344.                 myFile.Close();
  345.             }
  346.             return sContent;
  347.         }
  348.  
  349.         /// <summary>
  350.         /// Parst aus einem String das dritte Argument der methode addstreameventlistener heraus
  351.         /// </summary>
  352.         public string getFuncName(String filecontent)
  353.         {
  354.             int posstart = filecontent.IndexOf(".addStreamEventListener");
  355.             int posend = filecontent.IndexOf(")", posstart);
  356.             string subit = filecontent.Substring(posstart, (posend - posstart));
  357.             string funcname = subit.Substring(subit.LastIndexOf(",") + 1);
  358.  
  359.             return funcname;
  360.         }
  361.  
  362.         public int getVideoLoc(String videostring, int art)
  363.         {
  364.             int[] videoinfo = { 0, 1, 2, 3 };
  365.             string[] videostringArr;
  366.  
  367.             //initialisieren
  368.             for (int i = 0; i < 3; i++) videoinfo[i] = 0;
  369.  
  370.             videostringArr = videostring.Split(';');
  371.  
  372.             for (int i = 0; i < videostringArr.Length; i++)
  373.             {
  374.                 if (videostringArr[i].Contains(" left:"))
  375.                 {
  376.                     videoinfo[0] = Convert.ToInt16(videostringArr[i].TrimStart('l', 'e', 'f', 't', ':', ' ').TrimEnd('p', 'x'));
  377.                 }
  378.  
  379.                 if (videostringArr[i].Contains(" top:"))
  380.                 {
  381.                     videoinfo[1] = Convert.ToInt16(videostringArr[i].TrimStart('t', 'o', 'p', ':', ' ').TrimEnd('p', 'x'));
  382.                 }
  383.  
  384.                 if (videostringArr[i].Contains(" width:"))
  385.                 {
  386.                     videoinfo[2] = Convert.ToInt16(videostringArr[i].TrimStart('w', 'i', 'd', 't', 'h', ':', ' ').TrimEnd('p', 'x'));
  387.                 }
  388.  
  389.                 if (videostringArr[i].Contains(" height:"))
  390.                 {
  391.                     videoinfo[3] = Convert.ToInt16(videostringArr[i].TrimStart('h', 'e', 'i', 'g', 'h', 't', ':', ' ').TrimEnd('p', 'x'));
  392.                 }
  393.             }
  394.  
  395.             Console.Write(videoinfo[0]);
  396.             Console.Write(videoinfo[1]);
  397.             Console.Write(videoinfo[2]);
  398.             Console.Write(videoinfo[3]);
  399.  
  400.             return videoinfo[art];
  401.         }
  402.     }
  403. }
  404.  
  405. using System;
  406. using System.Collections.Generic;
  407. using System.Text;
  408. using System.Threading;
  409. using System.Windows.Forms;
  410.  
  411.  
  412. namespace DirectShowLib.Sample
  413. {
  414.  
  415.  
  416.     class DsmccListener
  417.     {
  418.         //braucht instanz vom firefox_overlay um fireEvent methode zu rufen
  419.         FirefoxOverlay f_overlay = null;
  420.  
  421.         //Instanz zum delegate, welcher auf fireEvent methode verweist
  422.         FirefoxOverlay.delegateFireEvent del_f_overlay = null;
  423.  
  424.         Thread newThread;
  425.  
  426.         //Thread Stop variable
  427.         bool stop = false;
  428.  
  429.         public DsmccListener(FirefoxOverlay.delegateFireEvent instance, FirefoxOverlay instance2)
  430.         {
  431.             del_f_overlay = instance;
  432.             f_overlay = instance2;
  433.  
  434.             newThread = new Thread(new ThreadStart(this.waitForEvent));
  435.             newThread.Start();
  436.         }
  437.  
  438.  
  439.         public void waitForEvent()
  440.         {
  441.  
  442.             DSMCC_Decoder.StreamEvent e = new DSMCC_Decoder.StreamEvent();
  443.             DSMCC_Decoder.StreamEventListener.register(ref e);
  444.  
  445.  
  446.             while (stop == false)
  447.             {
  448.                 //warte auf Eintreffen eines StreamEvents
  449.                 e.isTriggered.WaitOne();
  450.  
  451.                 //führe fireEvent(...,..,..) als delegate aus
  452.                 f_overlay.Invoke(del_f_overlay, new object[3] { e.Name, e.Data, e.Text });
  453.  
  454.                 e.isTriggered.Reset();
  455.  
  456.             }
  457.         }
  458.  
  459.         //Beim Schließen des ganzen Programmes
  460.         public void cancelThread()
  461.         {
  462.             stop = true;
  463.             newThread.Abort();
  464.         }
  465.  
  466.     }
  467. }