#include "News.h" #include #include #include #include #include #include #include void KSGSRückruf( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **ret ) { if( !p ) return; ( (News*)p )->rückruf( parameter, ret ); } // Inhalt der News Klasse aus News.h // Konstruktor News::News( Bildschirm *zB, Schrift *zS, KSGClient::NewsServerClient *client ) : Thread() { this->client = client; // Ladeanimation laden Animation2DData *aData = new Animation2DData(); LTDBDatei *aDatei = new LTDBDatei(); aDatei->setDatei( new Text( "data/bilder/ladeanimation.ltdb" ) ); aDatei->leseDaten( 0 ); aData->ladeAnimation( aDatei ); aData->setFPS( 30 ); aData->setWiederhohlend( 1 ); aData->setTransparent( 0 ); laden = new Animation2D(); laden->setPosition( zB->getBackBufferSize() / 2 - Punkt( 25, 25 ) ); laden->setSize( 50, 50 ); laden->setAPS( 450 ); laden->setAnimationDataZ( aData ); laden->setRahmen( 1 ); laden->setRahmenBreite( 1 ); laden->setRahmenFarbe( 0xFFFFFFFF ); laden->setSichtbar( 0 ); zB->setOnTopZeichnung( laden->getThis() ); // Fehler Textfeld Initialisieren fehler = new TextFeld(); fehler->setStyle( TextFeld::Style::Text & ~TextFeld::Style::Sichtbar ); fehler->setPosition( 10, 60 ); fehler->setSize( 480, 312 ); fehler->setSchriftFarbe( 0xFFFFFFFF ); fehler->setSchriftZ( zS->getThis() ); fehler->setText( "Fehler beim Laden der Seite!\n" ); zB->addMember( fehler->getThis() ); // Startwerte Initialisieren screen = zB->getThis(); schrift = zS->getThis(); // DLL Datei Laden ksgsDll = LoadLibrary( "data/bin/KSGScript.dll" ); if( !ksgsDll ) { // Error fehler->addZeile( "Die DLL Datei 'data/bin/KSGScript.dll' wurde nicht gefunden." ); fehler->addStyle( TextFeld::Style::Sichtbar ); laden->setSichtbar( 0 ); screen->setOnTop( 0 ); run = 0; return; } KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress( ksgsDll, KSGS_START_FUNKTION ); if( !getKSGSZeichnung ) { // Error fehler->addZeile( "Die Funktion '" KSGS_START_FUNKTION "' wurde in der\nDLL Datei 'data/bil/KSGScript.dll' nicht gefunden." ); fehler->addStyle( TextFeld::Style::Sichtbar ); laden->setSichtbar( 0 ); screen->setOnTop( 0 ); run = 0; return; } frame = getKSGSZeichnung(); if( !frame ) { // Error fehler->addZeile( "Unbekannter Fehler." ); fehler->addStyle( TextFeld::Style::Sichtbar ); laden->setSichtbar( 0 ); screen->setOnTop( 0 ); run = 0; return; } frame->setSchriftZ( schrift->getThis() ); frame->setBildschirmZ( screen->getThis() ); frame->setPosition( 10, 60 ); frame->setSize( 480, 312 ); frame->setRückrufParam( this ); frame->setRückrufFunktion( KSGSRückruf ); screen->addMember( frame->getThis() ); scriptName = new Text( "Patcher/Start" ); // Lade Thread starten start(); } // Destruktor News::~News() { if( client ) { client->trenne( 1 ); client->release(); } if( frame ) { frame->zurücksetzen(); frame->setBildschirmZ( 0 ); screen->removeMember( frame ); frame->release(); } if( ksgsDll ) FreeLibrary( ksgsDll ); if( scriptName ) scriptName->release(); laden->release(); screen->release(); fehler->release(); schrift->release(); } // nicht constant void News::rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret ) { if( isRunning() ) return; KSGSVariable *bef = parameter->z( 0 ); if( !bef ) return; Text *sn = bef->getText(); if( !sn || !sn->getLength() ) { if( sn ) sn->release(); return; } scriptName->setText( sn->getText() ); sn->release(); start(); } void News::thread() { screen->setOnTop( 1 ); laden->setSichtbar( 1 ); frame->zurücksetzen(); // KSGScript Seite Herunterladen if( client ) { if( !client->verbinde() ) { fehler->addZeile( "Fehler beim verbinden mit dem News-Server." ); fehler->addStyle( TextFeld::Style::Sichtbar ); laden->setSichtbar( 0 ); screen->setOnTop( 0 ); return; } if( !client->ladeSeite( scriptName->getText() ) ) { client->trenne( 0 ); fehler->addZeile( "Die Seite konnte nicht herruntergeladen werden." ); fehler->addStyle( TextFeld::Style::Sichtbar ); laden->setSichtbar( 0 ); screen->setOnTop( 0 ); return; } client->trenne( 0 ); } else { fehler->addZeile( "Es steht kein News Client zur Verfügung." ); fehler->addStyle( TextFeld::Style::Sichtbar ); laden->setSichtbar( 0 ); screen->setOnTop( 0 ); return; } // KSGScript Laden Text *pfad = new Text( "data/tmp/news/" ); pfad->append( scriptName->getText() ); pfad->append( "/seite.ksgs" ); frame->setScriptDatei( pfad ); if( !frame->neuLaden() ) { // error fehler->addZeile( "Es befindet sich ein Scriptfehler auf dieser Seite." ); fehler->addStyle( TextFeld::Style::Sichtbar ); laden->setSichtbar( 0 ); screen->setOnTop( 0 ); run = 0; return; } laden->setSichtbar( 0 ); screen->setOnTop( 0 ); run = 0; } // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread Thread *News::release() { if( ref == 2 && run ) warteAufThread( INFINITE ); return Thread::release(); }