News.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "News.h"
  2. #include <DateiSystem.h>
  3. #include <Bildschirm.h>
  4. #include <Punkt.h>
  5. #include <Textfeld.h>
  6. #include <Schrift.h>
  7. #include <Datei.h>
  8. #include <InitDatei.h>
  9. void KSGSRückruf( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
  10. {
  11. if( !p )
  12. return;
  13. ( (News*)p )->rückruf( parameter, ret );
  14. }
  15. // Inhalt der News Klasse aus News.h
  16. // Konstruktor
  17. News::News( Bildschirm *zB, Schrift *zS, KSGClient::NewsServerClient *client )
  18. : Thread()
  19. {
  20. this->client = client;
  21. // Ladeanimation laden
  22. Animation2DData *aData = new Animation2DData();
  23. LTDBDatei *aDatei = new LTDBDatei();
  24. aDatei->setDatei( new Text( "data/bilder/ladeanimation.ltdb" ) );
  25. aDatei->leseDaten( 0 );
  26. aData->ladeAnimation( aDatei );
  27. aData->setFPS( 30 );
  28. aData->setWiederhohlend( 1 );
  29. aData->setTransparent( 0 );
  30. laden = new Animation2D();
  31. laden->setPosition( zB->getBackBufferSize() / 2 - Punkt( 25, 25 ) );
  32. laden->setSize( 50, 50 );
  33. laden->setAPS( 450 );
  34. laden->setAnimationDataZ( aData );
  35. laden->setRahmen( 1 );
  36. laden->setRahmenBreite( 1 );
  37. laden->setRahmenFarbe( 0xFFFFFFFF );
  38. laden->setSichtbar( 0 );
  39. zB->setOnTopZeichnung( laden->getThis() );
  40. // Fehler Textfeld Initialisieren
  41. fehler = new TextFeld();
  42. fehler->setStyle( TextFeld::Style::Text & ~TextFeld::Style::Sichtbar );
  43. fehler->setPosition( 10, 60 );
  44. fehler->setSize( 480, 312 );
  45. fehler->setSchriftFarbe( 0xFFFFFFFF );
  46. fehler->setSchriftZ( zS->getThis() );
  47. fehler->setText( "Fehler beim Laden der Seite!\n" );
  48. zB->addMember( fehler->getThis() );
  49. // Startwerte Initialisieren
  50. screen = zB->getThis();
  51. schrift = zS->getThis();
  52. // DLL Datei Laden
  53. ksgsDll = LoadLibrary( "data/bin/KSGScript.dll" );
  54. if( !ksgsDll )
  55. { // Error
  56. fehler->addZeile( "Die DLL Datei 'data/bin/KSGScript.dll' wurde nicht gefunden." );
  57. fehler->addStyle( TextFeld::Style::Sichtbar );
  58. laden->setSichtbar( 0 );
  59. screen->setOnTop( 0 );
  60. run = 0;
  61. return;
  62. }
  63. KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress( ksgsDll, KSGS_START_FUNKTION );
  64. if( !getKSGSZeichnung )
  65. { // Error
  66. fehler->addZeile( "Die Funktion '" KSGS_START_FUNKTION "' wurde in der\nDLL Datei 'data/bil/KSGScript.dll' nicht gefunden." );
  67. fehler->addStyle( TextFeld::Style::Sichtbar );
  68. laden->setSichtbar( 0 );
  69. screen->setOnTop( 0 );
  70. run = 0;
  71. return;
  72. }
  73. frame = getKSGSZeichnung();
  74. if( !frame )
  75. { // Error
  76. fehler->addZeile( "Unbekannter Fehler." );
  77. fehler->addStyle( TextFeld::Style::Sichtbar );
  78. laden->setSichtbar( 0 );
  79. screen->setOnTop( 0 );
  80. run = 0;
  81. return;
  82. }
  83. frame->setSchriftZ( schrift->getThis() );
  84. frame->setBildschirmZ( screen->getThis() );
  85. frame->setPosition( 10, 60 );
  86. frame->setSize( 480, 312 );
  87. frame->setRückrufParam( this );
  88. frame->setRückrufFunktion( KSGSRückruf );
  89. screen->addMember( frame->getThis() );
  90. scriptName = new Text( "Patcher/Start" );
  91. // Lade Thread starten
  92. start();
  93. }
  94. // Destruktor
  95. News::~News()
  96. {
  97. if( client )
  98. {
  99. client->trenne( 1 );
  100. client->release();
  101. }
  102. if( frame )
  103. {
  104. frame->zurücksetzen();
  105. frame->setBildschirmZ( 0 );
  106. screen->removeMember( frame );
  107. frame->release();
  108. }
  109. if( ksgsDll )
  110. FreeLibrary( ksgsDll );
  111. if( scriptName )
  112. scriptName->release();
  113. laden->release();
  114. screen->release();
  115. fehler->release();
  116. schrift->release();
  117. }
  118. // nicht constant
  119. void News::rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
  120. {
  121. if( isRunning() )
  122. return;
  123. KSGSVariable *bef = parameter->z( 0 );
  124. if( !bef )
  125. return;
  126. Text *sn = bef->getText();
  127. if( !sn || !sn->getLength() )
  128. {
  129. if( sn )
  130. sn->release();
  131. return;
  132. }
  133. scriptName->setText( sn->getText() );
  134. sn->release();
  135. start();
  136. }
  137. void News::thread()
  138. {
  139. screen->setOnTop( 1 );
  140. laden->setSichtbar( 1 );
  141. frame->zurücksetzen();
  142. // KSGScript Seite Herunterladen
  143. if( client )
  144. {
  145. if( !client->verbinde() )
  146. {
  147. fehler->addZeile( "Fehler beim verbinden mit dem News-Server." );
  148. fehler->addStyle( TextFeld::Style::Sichtbar );
  149. laden->setSichtbar( 0 );
  150. screen->setOnTop( 0 );
  151. return;
  152. }
  153. if( !client->ladeSeite( scriptName->getText() ) )
  154. {
  155. client->trenne( 0 );
  156. fehler->addZeile( "Die Seite konnte nicht herruntergeladen werden." );
  157. fehler->addStyle( TextFeld::Style::Sichtbar );
  158. laden->setSichtbar( 0 );
  159. screen->setOnTop( 0 );
  160. return;
  161. }
  162. client->trenne( 0 );
  163. }
  164. else
  165. {
  166. fehler->addZeile( "Es steht kein News Client zur Verfügung." );
  167. fehler->addStyle( TextFeld::Style::Sichtbar );
  168. laden->setSichtbar( 0 );
  169. screen->setOnTop( 0 );
  170. return;
  171. }
  172. // KSGScript Laden
  173. Text *pfad = new Text( "data/tmp/news/" );
  174. pfad->append( scriptName->getText() );
  175. pfad->append( "/seite.ksgs" );
  176. frame->setScriptDatei( pfad );
  177. if( !frame->neuLaden() )
  178. { // error
  179. fehler->addZeile( "Es befindet sich ein Scriptfehler auf dieser Seite." );
  180. fehler->addStyle( TextFeld::Style::Sichtbar );
  181. laden->setSichtbar( 0 );
  182. screen->setOnTop( 0 );
  183. run = 0;
  184. return;
  185. }
  186. laden->setSichtbar( 0 );
  187. screen->setOnTop( 0 );
  188. run = 0;
  189. }
  190. // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
  191. Thread *News::release()
  192. {
  193. if( ref == 2 && run )
  194. warteAufThread( INFINITE );
  195. return Thread::release();
  196. }