KarteEditor.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. #include "KarteEditor.h"
  2. #include <Datei.h>
  3. #include <DateiSystem.h>
  4. #include <Bild.h>
  5. #include <Zeit.h>
  6. #include "KsgsBeschreibung.h"
  7. #include "KsgsShopSeite.h"
  8. #include <unistd.h>
  9. #define Sleep( x ) usleep( (x) * 1000 )
  10. #include <dlfcn.h>
  11. #define LoadLibrary( x ) dlopen( (x), RTLD_LAZY )
  12. #define GetProcAddress dlsym
  13. #define FreeLibrary dlclose
  14. typedef ESEditorV*( *DllStart )( );
  15. // Inhalt der KarteEditor Klasse aus KarteEditor.h
  16. // Konstruktor
  17. KarteEditor::KarteEditor( int id, EdSDatenbank *datenbank, char *pf, InitDatei *zIni )
  18. {
  19. this->id = id;
  20. db = datenbank;
  21. ini = zIni->getThis();
  22. pfad = new Text( pf );
  23. pfad->append( "/" );
  24. pfad->append( id );
  25. if( !DateiExistiert( *pfad ) )
  26. { // Karte erstellen
  27. // Client Daten
  28. Text dn = pfad->getText();
  29. dn += "/live/map/client/titel.ltdb";
  30. LTDBDatei bilder;
  31. bilder.setDatei( dn.getThis() );
  32. bilder.erstellen();
  33. Bild *bild = new Bild();
  34. bild->neuBild( 200, 100, 0x00000000 );
  35. bilder.speichern( 0, bild->getThis(), new Text( "titel" ) );
  36. dn = pfad->getText();
  37. dn += "/live/map/client/minimap.ltdb";
  38. bilder.setDatei( dn.getThis() );
  39. bilder.erstellen();
  40. bild->neuBild( 348, 348, 0x00000000 );
  41. bilder.speichern( 0, bild->getThis(), new Text( "vorschau" ) );
  42. dn = pfad->getText();
  43. dn += "/live/map/client/ladebild.ltdb";
  44. bilder.setDatei( dn.getThis() );
  45. bilder.erstellen();
  46. bild->neuBild( 1300, 900, 0x00000000 );
  47. bilder.speichern( 0, bild, new Text( "spielladen" ) );
  48. dn = pfad->getText();
  49. dn += "/live/map/client/beschreibung.ksgs";
  50. Datei d;
  51. d.setDatei( dn );
  52. d.erstellen();
  53. d.open( Datei::Style::schreiben );
  54. d.schreibe( (char*)_neu_karte_ksgs_beschreibung, textLength( _neu_karte_ksgs_beschreibung ) );
  55. d.close();
  56. dn = pfad->getText();
  57. dn += "/live/map/client/map/data/data.sts";
  58. d.setDatei( dn );
  59. d.erstellen();
  60. d.open( Datei::Style::schreiben );
  61. int i = 0;
  62. d.schreibe( (char*)&i, 4 );
  63. d.schreibe( (char*)&i, 4 );
  64. d.close();
  65. // Shop Seite
  66. dn = pfad->getText();
  67. dn += "/live/shop/seite/seite.ksgs";
  68. d.setDatei( dn );
  69. d.erstellen();
  70. d.open( Datei::Style::schreiben );
  71. d.schreibe( (char*)_neu_karte_ksgs_shop_seite, textLength( _neu_karte_ksgs_shop_seite ) );
  72. d.close();
  73. dn = pfad->getText();
  74. dn += "/live/shop/titelbg.ltdb";
  75. bilder.setDatei( dn.getThis() );
  76. bilder.erstellen();
  77. bild->neuBild( 200, 100, 0x00000000 );
  78. bilder.speichern( 0, bild->getThis(), new Text( "auswbg.jpg" ) );
  79. // Server Daten
  80. dn = pfad->getText();
  81. dn += "/live/map/server/sts.ltgd";
  82. d.setDatei( dn );
  83. d.erstellen();
  84. d.open( Datei::Style::schreiben );
  85. i = 0;
  86. d.schreibe( (char*)&i, 4 );
  87. d.schreibe( (char*)&i, 4 );
  88. d.close();
  89. dn = pfad->getText();
  90. dn += "/live/map/server/...";
  91. }
  92. shop = new SSEditor( pfad->getText() );
  93. beschreibung = new BeschreibungEditor( pfad->getText() );
  94. teams = new TeamsEditor( id, pfad->getText(), db->getThis() );
  95. dateien = new DateienEditor( pfad->getText(), zIni );
  96. editor = 0;
  97. editorDll = 0;
  98. fehler = "";
  99. ref = 1;
  100. }
  101. // Destruktor
  102. KarteEditor::~KarteEditor()
  103. {
  104. shop->release();
  105. beschreibung->release();
  106. teams->release();
  107. dateien->release();
  108. db->release();
  109. pfad->release();
  110. if( editor )
  111. editor->release();
  112. if( editorDll )
  113. FreeLibrary( editorDll );
  114. ini->release();
  115. }
  116. // private
  117. int KarteEditor::findeDateien( char *pf, RCArray< Text > *pfad )
  118. {
  119. Datei d;
  120. d.setDatei( pf );
  121. if( d.existiert() && !d.istOrdner() )
  122. {
  123. pfad->add( new Text( pf ) );
  124. return 1;
  125. }
  126. if( d.istOrdner() )
  127. {
  128. RCArray< Text > *list = d.getDateiListe();
  129. int anz = list->getEintragAnzahl();
  130. int ret = 0;
  131. for( int i = 0; i < anz; i++ )
  132. {
  133. Text p = pf;
  134. p += "/";
  135. p += list->z( i )->getText();
  136. ret += findeDateien( p, pfad );
  137. }
  138. list->release();
  139. return ret;
  140. }
  141. return 0;
  142. }
  143. // nicht constant
  144. bool KarteEditor::getAbbildListe( RCArray< Text > *name, RCArray< Zeit > *datum )
  145. {
  146. name->leeren();
  147. datum->leeren();
  148. Text pf = pfad->getText();
  149. pf += "/abbilder";
  150. Datei d;
  151. d.setDatei( pf );
  152. if( !d.existiert() || !d.istOrdner() )
  153. return 1;
  154. RCArray< Text > *list = d.getDateiListe();
  155. if( !list )
  156. return 0;
  157. int anz = list->getEintragAnzahl();
  158. for( int i = 0; i < anz; i++ )
  159. {
  160. Text p = pf.getText();
  161. p += "/";
  162. p += list->z( i )->getText();
  163. d.setDatei( p );
  164. Zeit *z = d.getLastChange();
  165. if( z )
  166. {
  167. name->set( list->get( i ), i );
  168. datum->set( z, i );
  169. }
  170. }
  171. list->release();
  172. return 1;
  173. }
  174. int KarteEditor::getDateiUpdateListe( char *p, RCArray< Text > *pfad )
  175. {
  176. pfad->leeren();
  177. Text pf = this->pfad->getText();
  178. pf += "/live/";
  179. pf += p;
  180. RCArray< Text > *list = new RCArray< Text >();
  181. int anz = findeDateien( pf, list );
  182. for( int i = 0; i < anz; i++ )
  183. {
  184. list->z( i )->remove( pf.getText() );
  185. pfad->set( list->get( i ), i );
  186. }
  187. list->release();
  188. return anz;
  189. }
  190. bool KarteEditor::abbildErstellen( char *name )
  191. {
  192. Text pf = pfad->getText();
  193. pf += "/abbilder/";
  194. pf += name;
  195. if( DateiExistiert( pf ) )
  196. {
  197. fehler = "Es existiert bereits ein Abbild mit diesem Namen. Du musst es vorher remove, oder einen anderen Namen angeben.";
  198. return 0;
  199. }
  200. Text live = pfad->getText();
  201. live += "/live";
  202. RCArray< Text > *list = new RCArray< Text >();
  203. int anz = findeDateien( live, list );
  204. bool ret = 1;
  205. for( int i = 0; i < anz; i++ )
  206. {
  207. Datei alt;
  208. Datei neu;
  209. alt.setDatei( list->z( i )->getText() );
  210. Text pfNeu = pf.getText();
  211. pfNeu += ( list->z( i )->getText() + live.getLength() );
  212. neu.setDatei( pfNeu );
  213. neu.erstellen();
  214. ret &= alt.open( Datei::Style::lesen );
  215. ret &= neu.open( Datei::Style::schreiben );
  216. __int64 size = alt.getSize();
  217. char *buffer = new char[ 2048 ];
  218. while( size > 0 )
  219. {
  220. int l = size > 2048 ? 2048 : (int)size;
  221. alt.lese( buffer, l );
  222. neu.schreibe( buffer, l );
  223. size -= l;
  224. }
  225. delete[] buffer;
  226. alt.close();
  227. neu.close();
  228. }
  229. list->release();
  230. if( !ret )
  231. {
  232. DateiRemove( pf );
  233. fehler = "Es ist ein Fehler beim Lesen oder Schreiben einer Datei aufgetreten.";
  234. }
  235. return ret;
  236. }
  237. bool KarteEditor::abbildRemove( char *name )
  238. {
  239. Text pf = pfad->getText();
  240. pf += "/abbilder/";
  241. pf += name;
  242. if( !DateiRemove( pf ) )
  243. {
  244. fehler = "Es ist ein Fehler beim Löschen des Abbildes aufgetreten.";
  245. return 0;
  246. }
  247. return 1;
  248. }
  249. bool KarteEditor::abbildHerstellen( char *name )
  250. {
  251. if( inUpdate() )
  252. {
  253. fehler = "Die Karte wird momentan aktualisiert. Bitte haben sie Geduld, bis dieser Vorgang abgeschlossen ist.";
  254. return 0;
  255. }
  256. Text pf = pfad->getText();
  257. pf += "/abbilder/";
  258. pf += name;
  259. if( !DateiExistiert( pf ) )
  260. {
  261. fehler = "Es existiert kein Abbild mit dem angegebenen Namen.";
  262. return 0;
  263. }
  264. Text live = pfad->getText();
  265. live += "/live";
  266. if( !DateiRemove( live ) )
  267. {
  268. fehler = "Es ist ein Fehler beim Löschen der aktuellen Version aufgetreten.";
  269. return 0;
  270. }
  271. RCArray< Text > *list = new RCArray< Text >();
  272. int anz = findeDateien( pf, list );
  273. bool ret = 1;
  274. for( int i = 0; i < anz; i++ )
  275. {
  276. Datei alt;
  277. Datei neu;
  278. alt.setDatei( list->z( i )->getText() );
  279. Text pfNeu = live.getText();
  280. pfNeu += ( list->z( i )->getText() + pf.getLength() );
  281. neu.setDatei( pfNeu );
  282. neu.erstellen();
  283. ret |= alt.open( Datei::Style::lesen );
  284. ret |= neu.open( Datei::Style::schreiben );
  285. __int64 size = alt.getSize();
  286. char *buffer = new char[ 2048 ];
  287. while( size > 0 )
  288. {
  289. int l = size > 2048 ? 2048 : (int)size;
  290. alt.lese( buffer, l );
  291. neu.schreibe( buffer, l );
  292. size -= l;
  293. }
  294. delete[] buffer;
  295. alt.close();
  296. neu.close();
  297. }
  298. list->release();
  299. if( !ret )
  300. {
  301. DateiRemove( pf );
  302. fehler = "Es ist ein Fehler beim Lesen oder Schreiben einer Datei aufgetreten.";
  303. }
  304. return ret;
  305. }
  306. bool KarteEditor::startUpdate()
  307. {
  308. if( inUpdate() )
  309. {
  310. fehler = "Die Karte wird momentan aktualisiert. Bitte haben sie Geduld, bis dieser Vorgang abgeschlossen ist.";
  311. return 0;
  312. }
  313. if( !db->startKarteUpdate( id ) )
  314. {
  315. Text *t = db->getLetzterFehler();
  316. fehler = t->getText();
  317. t->release();
  318. return 0;
  319. }
  320. return 1;
  321. }
  322. bool KarteEditor::startShopUpdate()
  323. {
  324. if( !db->startShopUpdate( id ) )
  325. {
  326. Text *t = db->getLetzterFehler();
  327. fehler = t->getText();
  328. t->release();
  329. return 0;
  330. }
  331. return 1;
  332. }
  333. bool KarteEditor::prozessMessage( SKlient *zKlient )
  334. {
  335. char message = 0;
  336. zKlient->getNachrichtEncrypted( &message, 1 );
  337. switch( message )
  338. {
  339. case 0x1: // Abbild Erstellen
  340. {
  341. zKlient->sendeEncrypted( "\1", 1 );
  342. char l = 0;
  343. zKlient->getNachrichtEncrypted( &l, 1 );
  344. char *name = new char[ l + 1 ];
  345. name[ (int)l ] = 0;
  346. if( l )
  347. zKlient->getNachrichtEncrypted( name, l );
  348. if( !textLength( name ) )
  349. {
  350. delete[] name;
  351. fehler = "Du musst einen Namen angeben.";
  352. return 0;
  353. }
  354. if( !abbildErstellen( name ) )
  355. {
  356. delete[] name;
  357. return 0;
  358. }
  359. delete[] name;
  360. zKlient->sendeEncrypted( "\1", 1 );
  361. return 1;
  362. }
  363. case 0x2: // Abbild Löschen
  364. {
  365. zKlient->sendeEncrypted( "\1", 1 );
  366. char l = 0;
  367. zKlient->getNachrichtEncrypted( &l, 1 );
  368. char *name = new char[ l + 1 ];
  369. name[ (int)l ] = 0;
  370. if( l )
  371. zKlient->getNachrichtEncrypted( name, l );
  372. if( !textLength( name ) )
  373. {
  374. delete[] name;
  375. fehler = "Du musst einen Namen angeben.";
  376. return 0;
  377. }
  378. if( !abbildRemove( name ) )
  379. {
  380. delete[] name;
  381. return 0;
  382. }
  383. delete[] name;
  384. zKlient->sendeEncrypted( "\1", 1 );
  385. return 1;
  386. }
  387. case 0x3: // Abbild Herstellen
  388. {
  389. zKlient->sendeEncrypted( "\1", 1 );
  390. char l = 0;
  391. zKlient->getNachrichtEncrypted( &l, 1 );
  392. char *name = new char[ l + 1 ];
  393. name[ (int)l ] = 0;
  394. if( l )
  395. zKlient->getNachrichtEncrypted( name, l );
  396. if( !textLength( name ) )
  397. {
  398. delete[] name;
  399. fehler = "Du musst einen Namen angeben.";
  400. return 0;
  401. }
  402. if( !abbildHerstellen( name ) )
  403. {
  404. delete[] name;
  405. return 0;
  406. }
  407. delete[] name;
  408. zKlient->sendeEncrypted( "\1", 1 );
  409. return 1;
  410. }
  411. case 0x4: // Karte Veröffentlichen
  412. {
  413. zKlient->sendeEncrypted( "\1", 1 );
  414. if( !startUpdate() )
  415. return 0;
  416. else
  417. zKlient->sendeEncrypted( "\1", 1 );
  418. return 1;
  419. }
  420. case 0x5: // get Abbild Liste
  421. {
  422. zKlient->sendeEncrypted( "\1", 1 );
  423. RCArray< Text > *name = new RCArray< Text >();
  424. RCArray< Zeit > *datum = new RCArray< Zeit >();
  425. getAbbildListe( name, datum );
  426. int anz = name->getEintragAnzahl();
  427. zKlient->sendeEncrypted( (char*)&anz, 4 );
  428. for( int i = 0; i < anz; i++ )
  429. {
  430. Text n = name->z( i )->getText();
  431. char len = (char)n.getLength();
  432. zKlient->sendeEncrypted( &len, 1 );
  433. zKlient->sendeEncrypted( n, len );
  434. int d = datum->z( i )->zDatum()->getJahr();
  435. zKlient->sendeEncrypted( (char*)&d, 4 );
  436. d = datum->z( i )->zDatum()->getMonat();
  437. zKlient->sendeEncrypted( (char*)&d, 4 );
  438. d = datum->z( i )->zDatum()->getTag();
  439. zKlient->sendeEncrypted( (char*)&d, 4 );
  440. d = datum->z( i )->zUhrzeit()->getStunde();
  441. zKlient->sendeEncrypted( (char*)&d, 4 );
  442. d = datum->z( i )->zUhrzeit()->getMinute();
  443. zKlient->sendeEncrypted( (char*)&d, 4 );
  444. d = datum->z( i )->zUhrzeit()->getSekunde();
  445. zKlient->sendeEncrypted( (char*)&d, 4 );
  446. }
  447. name->release();
  448. datum->release();
  449. return 1;
  450. }
  451. case 0x6: // Shop Seite Veröffentlichen
  452. {
  453. zKlient->sendeEncrypted( "\1", 1 );
  454. if( !startShopUpdate() )
  455. return 0;
  456. else
  457. zKlient->sendeEncrypted( "\1", 1 );
  458. return 1;
  459. }
  460. case 0x7: // Shop Seite Nachricht
  461. {
  462. zKlient->sendeEncrypted( "\1", 1 );
  463. if( !shop->prozessMessage( zKlient ) )
  464. fehler = shop->getLetzterFehler();
  465. else
  466. return 1;
  467. return 0;
  468. }
  469. case 0x8: // Shop Seite herunterladen
  470. {
  471. zKlient->sendeEncrypted( "\1", 1 );
  472. RCArray< Text > *list = new RCArray< Text >();
  473. Text pf = pfad->getText();
  474. pf += "/live/shop";
  475. int anz = findeDateien( pf, list );
  476. zKlient->sendeEncrypted( (char*)&anz, 4 );
  477. for( int i = 0; i < anz; i++ )
  478. {
  479. Text p = list->z( i )->getText();
  480. char l = (char)( p.getLength() - pf.getLength() );
  481. zKlient->sendeEncrypted( &l, 1 );
  482. zKlient->sendeEncrypted( (char*)p + pf.getLength(), l );
  483. Datei d;
  484. d.setDatei( p );
  485. __int64 size = d.getSize();
  486. zKlient->sendeEncrypted( (char*)&size, 8 );
  487. d.open( Datei::Style::lesen );
  488. char *buffer = new char[ 2048 ];
  489. while( size > 0 )
  490. {
  491. int l = size > 2048 ? 2048 : (int)size;
  492. d.lese( buffer, l );
  493. zKlient->sende( buffer, l );
  494. size -= l;
  495. }
  496. delete[] buffer;
  497. d.close();
  498. }
  499. list->release();
  500. return 1;
  501. }
  502. case 0x9: // Shop Daten laden
  503. {
  504. int es = 0, tp = 0, vp = 0;
  505. if( !db->getKarteShopDaten( id, es, tp, vp ) )
  506. {
  507. fehler = "Fehler beim laden der Shop Informationen.";
  508. return 0;
  509. }
  510. zKlient->sendeEncrypted( "\1", 1 );
  511. zKlient->sendeEncrypted( (char*)&es, 4 );
  512. zKlient->sendeEncrypted( (char*)&tp, 4 );
  513. zKlient->sendeEncrypted( (char*)&vp, 4 );
  514. return 1;
  515. }
  516. case 0xA: // Set Shop Daten
  517. {
  518. zKlient->sendeEncrypted( "\1", 1 );
  519. int es = 0, tp = 0, vp = 0;
  520. zKlient->getNachrichtEncrypted( (char*)&es, 4 );
  521. zKlient->getNachrichtEncrypted( (char*)&tp, 4 );
  522. zKlient->getNachrichtEncrypted( (char*)&vp, 4 );
  523. if( db->setKarteShopDaten( id, es, tp, vp ) )
  524. {
  525. zKlient->sendeEncrypted( "\1", 1 );
  526. return 1;
  527. }
  528. fehler = "Fehler beim setzen der Shop Werte.";
  529. return 0;
  530. }
  531. case 0xB: // Beschreibung Nachricht
  532. {
  533. zKlient->sendeEncrypted( "\1", 1 );
  534. if( !beschreibung->prozessMessage( zKlient ) )
  535. fehler = beschreibung->getLetzterFehler();
  536. else
  537. return 1;
  538. return 0;
  539. }
  540. case 0xC: // Teams Nachricht
  541. {
  542. zKlient->sendeEncrypted( "\1", 1 );
  543. if( !teams->prozessMessage( zKlient ) )
  544. fehler = teams->getLetzterFehler();
  545. else
  546. return 1;
  547. return 0;
  548. }
  549. case 0xD: // Dateien Nachicht
  550. {
  551. zKlient->sendeEncrypted( "\1", 1 );
  552. if( !dateien->prozessMessage( zKlient ) )
  553. fehler = dateien->getLetzterFehler();
  554. else
  555. return 1;
  556. return 0;
  557. }
  558. case 0xE: // Init Editor
  559. {
  560. if( editorDll )
  561. {
  562. if( editor )
  563. editor = editor->release();
  564. FreeLibrary( editorDll );
  565. }
  566. if( !ini->wertExistiert( "spielePfad" ) )
  567. {
  568. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  569. fehler += __LINE__;
  570. return 0;
  571. }
  572. Text pf = ini->zWert( "spielePfad" )->getText();
  573. pf += "/";
  574. int said = db->getSpielArtId( id );
  575. if( !said )
  576. {
  577. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  578. fehler += __LINE__;
  579. return 0;
  580. }
  581. pf += said;
  582. pf += "/bin/game";
  583. #ifdef WIN32
  584. pf += ".dll";
  585. #else
  586. pf += ".so";
  587. #endif
  588. editorDll = LoadLibrary( pfad->getText() );
  589. if( !editorDll )
  590. {
  591. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  592. fehler += __LINE__;
  593. return 0;
  594. }
  595. pfad->release();
  596. DllStart getEditorKlasse = (DllStart)GetProcAddress( editorDll, "getEditorKlasse" );
  597. if( !getEditorKlasse )
  598. {
  599. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  600. fehler += __LINE__;
  601. FreeLibrary( editorDll );
  602. editorDll = 0;
  603. return 0;
  604. }
  605. editor = getEditorKlasse();
  606. if( !editor )
  607. {
  608. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  609. fehler += __LINE__;
  610. FreeLibrary( editorDll );
  611. editorDll = 0;
  612. return 0;
  613. }
  614. zKlient->sendeEncrypted( "\1", 1 );
  615. Text p = pf.getText();
  616. p += "/live";
  617. editor->setPfad( p );
  618. editor->open();
  619. return 1;
  620. }
  621. case 0xF:
  622. { // Editor Nachricht
  623. if( !editor )
  624. {
  625. fehler = "Der Editor wurde nicht initialisiert. Error Code: " __FILE__ ":";
  626. fehler += __LINE__;
  627. editorDll = 0;
  628. return 0;
  629. }
  630. zKlient->sendeEncrypted( "\1", 1 );
  631. if( !editor->nachricht( zKlient ) )
  632. fehler = editor->getLetzterFehler();
  633. else
  634. return 1;
  635. return 0;
  636. }
  637. default:
  638. fehler = "Unbekannte Nachricht. Eventuell ist der Client nicht auf dem neusten Stand.";
  639. }
  640. return 0;
  641. }
  642. void KarteEditor::removeError()
  643. {
  644. fehler = "";
  645. }
  646. // constant
  647. bool KarteEditor::inUpdate() const
  648. {
  649. return db->istKarteInUpdate( id );
  650. }
  651. bool KarteEditor::istOk() const
  652. {
  653. return fehler.getLength() == 0;
  654. }
  655. char *KarteEditor::getLetzterFehler() const
  656. {
  657. return fehler;
  658. }
  659. char *KarteEditor::getPfad() const
  660. {
  661. return pfad->getText();
  662. }
  663. // Reference Counting
  664. KarteEditor *KarteEditor::getThis()
  665. {
  666. ref++;
  667. return this;
  668. }
  669. KarteEditor *KarteEditor::release()
  670. {
  671. ref--;
  672. if( !ref )
  673. delete this;
  674. return 0;
  675. }