"contents": "Präsentation retroText\n----------------------\n\nBildschirmtext (Btx) war ein inter-\naktiver Onlinedienst.\n\nVorstellung auf der IFA '77 in Berlin \nvon Postminister Kurt Gscheidle\nEntwickelt unter der Leitung von Eric \nDanke, inspiriert 1975 durch Veröffent-\nlichung über das britische\nPRESTEL-System.\n\n----\n\n1980 Feldversuch mit 2000 Teilnehmern.\n18. März 1983 Unterzeichnung des \n Btx-Staatsvertrags\n1. Sept. 1983 Start zur IFA\n\nNutzer: 1986 ca. 60.000 (gepl.: 1 Mio.) \nerst 1996 1 Mio., aber da war es schon\n T-Online mit Internet+E-Mail\n\n31.12.2001: Abschaltung des \n klassischen Btx\nOnline-Banking noch bis 10. Mai 2007\n\n----\n\nBtx-Leitzentrale in Ulm\nZu Beginn Vermittlungsstellen in \n Düsseldorf, Hamburg, Frankfurt/M, \n München, Stuttgart\nGeplant waren 150 VSt...\n\n----\n\nÖsterreich: \nStart Juni 1982,\nMUPID als eigenes Terminal \n (vgl. RetroPulsiv 7.0)\nEnde: November 2001\n\n----\n\nÄhnliche Systeme in Europa:\n\nSchweiz: Videotex\nUK: Prestel\nSchweden: Prestel plus\nFrankreich: Minitel\nDänemark: Teledata\nItalien: Videotel\nNiederlande: Viditel\nSpanien: Ibertex\n\nDeutschland\n-----------\n\nBtx-Endgerät:\n- Fernseher mit Btx-Decoder oder \n Set-Top-Box (z.B. btxTv)\n- Btx-Terminal (z.B. MultiTel, MultiKom)\n- Computer mit Btx-Karten/-Modulen \n oder Software\n\nPostmodem:\n- D-BT 03 war lange der Standard\n- 1200 Bit/s empfangen, \n 75 Bit/s senden (V.23)\n- feste Anschlußkennung (EPROM)\n- fest programmierte Telefonnummer\n- eigenes Anschlußinterface\n\n- später auch alternative Modems, \n Akustikkoppler erlaubt\n- hierfür war \"Software-Kennung\" nötig\n- Zugänge mit höherer Datenrate kamen \n erst über die Jahre\n\nZugangsdaten:\n- Anschlußkennung (12 Stellen) identi-\n fiziert den Telefonanschluß\n- aufgrunnd fehlender \"CallerID\", da ja\n noch viele VSt Analogtechnik hatten\n\n- Benutzerkennung identifiziert den \n Teilnehmer\n- Mitbenutzerkennung z.B. andere \n Familienmitglieder\n- Persönliches Kennwort als Sicherheit\n\n- Für nomadische Benutzer:\n - Anschlußfreizügigkeit\n - Teilnehmerfreizügigkeit\n\nBtx-Server:\n- Hierarchisch organisiert\n- Leitzentrale in Ulm mit IBM-Technik\n- weitere VSt waren \"Caches\"\n- \"externe Rechner\" wurden direkt \n angesprochen, waren per Datex-P \n (X.25) angebunden\n - Beispiele: Quelle, Fluglinien, Bahn,\n Banken ...\n\nKosten für Inhalte:\n- \"seitenabhängige Vergütung\":\n 0,01 DM bis 9,99 DM möglich\n- \"zeitabhängige Vergütung\": \n 0,01 DM bis 1,30 DM pro Min. möglich\n- Abrechnung über Telefonrechnung\n\n1993: Trennung von Netz (Datex-J) \n und Inhalt (Btx)\nBtx blieb aber der einzige Dienst \n im Datex-J\n1995: Umbenennung in T-Online\n\nÖsterreich: \"PAN\" (Public Access \n Network), 1993-1995\n\nDer CEPT-Standard\n-----------------\n\n\nhttps://de.wikipedia.org/wiki/Minitel\n",
"contents": "# -*- coding: UTF-8 -*-\n'''\nrtx - RetroText\nrtxHelpers: verschiedene Hilfsfunktionen\nby Anna Christina Naß <acn@acn.wtf>\nreleased under GPL\n'''\n\nfrom rtxPage import rtxPage\nimport cept\nimport glob\nimport logging\n\ndef process_byte(in_byte):\n \"\"\" takes the received byte and processes the command line\n if a new command has been entered, it will call process_command()\n if a short link has been entered, the link_list of the current page will be searched\n and the found target will be sent to process_command()\n \"\"\"\n instr=str(in_byte, encoding=\"latin-1\")\n \n logging.debug(\"> %s < CD: %s\", instr, glob.ser.getCD())\n\n # what to send back to the client\n if instr == cept.INI:\n logging.debug(\"INI\")\n echo_char = \"*\"\n elif instr == cept.TER:\n logging.debug(\"TER\")\n echo_char = \"#\"\n else:\n echo_char=instr\n\n # start of line: clear rest of cmdline\n if len(glob.cmdline) == 0:\n glob.ser.write(bytes(cept.CLEARLINE, \"latin-1\"))\n\n # echo the character to the client\n glob.ser.write(bytes(echo_char, \"latin-1\"))\n\n glob.cmdline += instr\n\n # Backspace:\n if instr == cept.BSP:\n glob.cmdline = glob.cmdline[:-1]\n return\n\n logging.debug(\"Cmdline: >%s<\", glob.cmdline)\n\n # process links inside the page:\n if ( len(glob.cmdline) == 1 or len(glob.cmdline) == 2 ) and glob.curpage.get_link(glob.cmdline):\n glob.cmdline = cept.INI + glob.curpage.get_link(glob.cmdline) + cept.TER\n process_command(glob.cmdline)\n return\n\n # reset cmdline:\n if instr == cept.INI and glob.cmdline[-2:] == cept.INI+cept.INI:\n logging.debug(\"reset cmdline\")\n glob.cmdline = \"\"\n glob.ser.write(bytes(clear_line24, \"latin-1\"))\n return\n\n # goto last page:\n if instr == cept.TER and glob.cmdline == cept.INI+cept.TER:\n if glob.prevpage.get_page_id() == -1:\n glob.cmdline = \"\"\n send_error(\"Keine vorige Seite vorhanden.\")\n return\n glob.cmdline = \"\" # reset cmdline\n goto_last_page()\n return\n\n # \"Make it so\":\n if instr == cept.TER:\n # or instr == cept.SEND or instr == cept.CR:\n logging.info(\"Kommando: >%s<\", glob.cmdline)\n process_command(glob.cmdline)\n return\n\ndef process_command(cmd):\n \"\"\" processes the given command line\n \"\"\"\n\n # reset cmdline\n glob.cmdline = \"\"\n\n # process *cmdline#, normally a page-loading command:\n if cmd[0] == cept.INI and cmd[-1:] == cept.TER:\n pgnr = cmd[1:-1]\n check_and_send_page(pgnr, \"Die Seite kann nicht gefunden werden.\")\n\n # if only # is entered, either go to the link behind '#'\n # or to the next sub-page (2000a => 2000b) if it exists\n if cmd == cept.TER:\n if glob.curpage.get_link(\"#\"):\n pgnr = glob.curpage.get_link(\"#\")\n check_and_send_page(pgnr, \"Die Seite kann nicht gefunden werden.\")\n else:\n # check if the next page exists, e.g. 2000a => 2000b\n curid = glob.curpage.get_page_id()\n if curid[-1:].isalpha():\n # aus 2000a 2000b machen:\n nextid = curid[:-1] + chr(ord(curid[-1:])+1)\n check_and_send_page(nextid, \"Keine n\"+str(cept['UMLAUT'])+\"achste Seite gefunden.\")\n\n # special commands:\n# if cmd == \"!1\" + cept.TER\n# glob.ser.write(bytes(c#ept.btxlogo, \"latin-1\"))\n# return\n# if cmd == \"!2\" + cept.TER:\n# glob.ser.write(bytes(cept.init_screen, \"latin-1\"))\n# return\n\ndef goto_last_page():\n \"\"\" go back to the previous page and make the current page the previous page\n \"\"\"\n logging.info(\"Letzte Seite: %s\", str(glob.prevpage.get_page_id()))\n\n # swap prevpage and curpage\n temp = glob.curpage\n glob.curpage = glob.prevpage\n glob.prevpage = temp\n\n # send the previous page (now curpage) to the client\n send_page(glob.curpage)\n\ndef send_welcome_page():\n \"\"\" get the btxlogo, make a rtxPage of it and send it to the client \"\"\"\n wpage = rtxPage()\n wpage.set_page(bytes(cept.btxlogo, \"latin-1\"))\n send_page(wpage)\n\ndef check_and_send_page(pgnr, errormsg):\n \"\"\" checks if the page \"pgnr\" exists\n if yes, it loads it into curpage and sends it to the client\n if not, it sends the error message \"errormsg\" to