News.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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 );
  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 );
  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 );
  90. scriptName = new Text( "Patcher/Start" );
  91. // Lade Thread starten
  92. start();
  93. }
  94. // Destruktor
  95. News::~News()
  96. {
  97. warteAufThread( INFINITE );
  98. if( client )
  99. {
  100. client->trenne( 1 );
  101. client->release();
  102. }
  103. if( frame )
  104. {
  105. frame->zurücksetzen();
  106. frame->release();
  107. }
  108. if( ksgsDll )
  109. FreeLibrary( ksgsDll );
  110. if( scriptName )
  111. scriptName->release();
  112. laden->release();
  113. screen->release();
  114. fehler->release();
  115. schrift->release();
  116. }
  117. // nicht constant
  118. void News::rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
  119. {
  120. if( isRunning() )
  121. return;
  122. KSGSVariable *bef = parameter->z( 0 );
  123. if( !bef )
  124. return;
  125. Text *sn = bef->getText();
  126. if( !sn || !sn->getLength() )
  127. {
  128. if( sn )
  129. sn->release();
  130. return;
  131. }
  132. scriptName->setText( sn->getText() );
  133. sn->release();
  134. start();
  135. }
  136. void News::thread()
  137. {
  138. screen->setOnTop( 1 );
  139. laden->setSichtbar( 1 );
  140. frame->zurücksetzen();
  141. // KSGScript Seite Herunterladen
  142. if( client )
  143. {
  144. if( !client->verbinde() )
  145. {
  146. fehler->addZeile( "Fehler beim verbinden mit dem News-Server." );
  147. fehler->addStyle( TextFeld::Style::Sichtbar );
  148. laden->setSichtbar( 0 );
  149. screen->setOnTop( 0 );
  150. return;
  151. }
  152. if( !client->ladeSeite( scriptName->getText() ) )
  153. {
  154. client->trenne( 0 );
  155. fehler->addZeile( "Die Seite konnte nicht herruntergeladen werden." );
  156. fehler->addStyle( TextFeld::Style::Sichtbar );
  157. laden->setSichtbar( 0 );
  158. screen->setOnTop( 0 );
  159. return;
  160. }
  161. client->trenne( 0 );
  162. }
  163. else
  164. {
  165. fehler->addZeile( "Es steht kein News Client zur Verfügung." );
  166. fehler->addStyle( TextFeld::Style::Sichtbar );
  167. laden->setSichtbar( 0 );
  168. screen->setOnTop( 0 );
  169. return;
  170. }
  171. // KSGScript Laden
  172. Text *pfad = new Text( "data/tmp/news/" );
  173. pfad->append( scriptName->getText() );
  174. pfad->append( "/seite.ksgs" );
  175. frame->setScriptDatei( pfad );
  176. if( !frame->neuLaden() )
  177. { // error
  178. fehler->addZeile( "Es befindet sich ein Scriptfehler auf dieser Seite." );
  179. fehler->addStyle( TextFeld::Style::Sichtbar );
  180. laden->setSichtbar( 0 );
  181. screen->setOnTop( 0 );
  182. run = 0;
  183. return;
  184. }
  185. laden->setSichtbar( 0 );
  186. screen->setOnTop( 0 );
  187. run = 0;
  188. }
  189. // Reference Counting
  190. News *News::getThis()
  191. {
  192. ref++;
  193. return this;
  194. }
  195. News *News::release()
  196. {
  197. ref--;
  198. if( !ref )
  199. delete this;
  200. return 0;
  201. }