DateienEditor.cpp 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. #include "DateienEditor.h"
  2. #include <Datei.h>
  3. #include <DateiSystem.h>
  4. #include <Bild.h>
  5. #include <M2Datei.h>
  6. #include <iostream>
  7. #include "GSLDateiV.h"
  8. #include <Model2D.h>
  9. #include <unistd.h>
  10. #define Sleep( x ) usleep( (x) * 1000 )
  11. #include <dlfcn.h>
  12. #define LoadLibrary( x ) dlopen( (x), RTLD_LAZY )
  13. #define GetProcAddress dlsym
  14. #define FreeLibrary dlclose
  15. #define HMODULE void*
  16. typedef GSL::GSLDateiV *( *GetGSLDatei )( );
  17. class DownloadSound : public GSL::GSLSoundV
  18. {
  19. private:
  20. bool istM;
  21. int sample;
  22. __int64 len;
  23. SKlient *k;
  24. bool ok;
  25. public:
  26. // Konstruktor
  27. DownloadSound( SKlient *zK )
  28. : ReferenceCounter()
  29. {
  30. k = zK;
  31. ok = 0;
  32. }
  33. // nicht constant
  34. // GSL
  35. void playSound() override
  36. {}
  37. void setPause( bool p ) override
  38. {}
  39. void stopSound() override
  40. {}
  41. void warteAufSound( int zeit ) override
  42. {}
  43. // Lautstärke: 0 - 0xFFFF
  44. void setVolume( unsigned int links, unsigned int rechts ) override
  45. {}
  46. // zum Speichern
  47. void open() override
  48. {
  49. ok = 1;
  50. k->sendeEncrypted( "\1", 1 );
  51. char m = 0;
  52. k->getNachrichtEncrypted( &m, 1 );
  53. istM = ( m == 1 );
  54. sample = 0;
  55. k->getNachrichtEncrypted( (char *)&sample, 4 );
  56. len = 0;
  57. k->getNachrichtEncrypted( (char *)&len, 8 );
  58. }
  59. int getDaten( char *buffer, int len ) override
  60. {
  61. int l = len < this->len ? len : (int)this->len;
  62. if( !l )
  63. return -1;
  64. k->getNachricht( buffer, l );
  65. this->len -= l;
  66. return l;
  67. }
  68. void close() override
  69. {}
  70. bool istMono() const override
  71. {
  72. return istM;
  73. }
  74. int getSampleRate() const override
  75. {
  76. return sample;
  77. }
  78. __int64 getDatLength() const override
  79. {
  80. return len;
  81. }
  82. bool istOk() const
  83. {
  84. return ok;
  85. }
  86. };
  87. // Inhalt der DateienEditor Klasse aus DateienEditor.h
  88. // Konstruktor
  89. DateienEditor::DateienEditor( char *pf, InitDatei *zIni )
  90. : ReferenceCounter()
  91. {
  92. this->ini = dynamic_cast<InitDatei *>( zIni->getThis() );
  93. pfad = pf;
  94. pfad += "/live/map/client/map/files";
  95. workPfad = "";
  96. fehler = "";
  97. }
  98. // Destruktor
  99. DateienEditor::~DateienEditor()
  100. {
  101. ini->release();
  102. }
  103. // nicht constant
  104. bool DateienEditor::prozessMessage( SKlient *zKlient )
  105. {
  106. char message = 0;
  107. zKlient->getNachrichtEncrypted( &message, 1 );
  108. switch( message )
  109. {
  110. case 0x1: // Neue Datei erstellen
  111. {
  112. zKlient->sendeEncrypted( "\1", 1 );
  113. char typ = 0;
  114. zKlient->getNachrichtEncrypted( &typ, 1 );
  115. unsigned char len = 0;
  116. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  117. char *name = new char[ len + 1 ];
  118. if( len )
  119. zKlient->getNachrichtEncrypted( name, len );
  120. name[ (int)len ] = 0;
  121. if( !len )
  122. {
  123. delete[] name;
  124. fehler = "Du musst einen Dateinamen angeben.";
  125. return 0;
  126. }
  127. Text n = name;
  128. delete[] name;
  129. if( n.hat( "/" ) || n.hat( "." ) )
  130. {
  131. fehler = "Du musst einen gültigen Dateinamen angeben.";
  132. return 0;
  133. }
  134. Text p = pfad.getText();
  135. p += workPfad.getText();
  136. p += "/";
  137. p += n;
  138. if( typ == 0 )
  139. {
  140. p += "/tmp";
  141. if( !DateiPfadErstellen( p ) )
  142. {
  143. fehler = "Fehler beim erstellen der Datei.";
  144. return 0;
  145. }
  146. DateiRemove( p );
  147. p.remove( p.getLength() - 4, p.getLength() );
  148. p.ersetzen( p.positionVon( "map/client" ), p.positionVon( "map/client" ) + textLength( "map/client" ), "map/server" );
  149. if( !DateiPfadErstellen( p ) )
  150. {
  151. fehler = "Fehler beim erstellen der Datei.";
  152. return 0;
  153. }
  154. DateiRemove( p );
  155. p.remove( p.getLength() - 4, p.getLength() );
  156. zKlient->sendeEncrypted( "\1", 1 );
  157. return 1;
  158. }
  159. if( typ == 1 )
  160. {
  161. p += ".ltdb";
  162. if( !DateiPfadErstellen( p ) )
  163. {
  164. fehler = "Fehler beim erstellen der Datei.";
  165. return 0;
  166. }
  167. zKlient->sendeEncrypted( "\1", 1 );
  168. return 1;
  169. }
  170. if( typ == 2 )
  171. {
  172. p += ".m2";
  173. if( !DateiPfadErstellen( p ) )
  174. {
  175. fehler = "Fehler beim erstellen der Datei.";
  176. return 0;
  177. }
  178. p.ersetzen( p.positionVon( "map/client" ), p.positionVon( "map/client" ) + textLength( "map/client" ), "map/server" );
  179. if( !DateiPfadErstellen( p ) )
  180. {
  181. fehler = "Fehler beim erstellen der Datei.";
  182. return 0;
  183. }
  184. zKlient->sendeEncrypted( "\1", 1 );
  185. return 1;
  186. }
  187. if( typ == 3 )
  188. {
  189. p += ".gsl";
  190. if( !DateiPfadErstellen( p ) )
  191. {
  192. fehler = "Fehler beim erstellen der Datei.";
  193. return 0;
  194. }
  195. zKlient->sendeEncrypted( "\1", 1 );
  196. return 1;
  197. }
  198. fehler = "Ungültiger Dateityp.";
  199. return 0;
  200. }
  201. case 0x2: // Ordner open
  202. {
  203. zKlient->sendeEncrypted( "\1", 1 );
  204. unsigned char len = 0;
  205. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  206. char *name = new char[ len + 1 ];
  207. name[ (int)len ] = 0;
  208. if( len )
  209. zKlient->getNachrichtEncrypted( name, len );
  210. if( Text( ".." ).istGleich( name ) )
  211. {
  212. if( workPfad.getLength() )
  213. {
  214. int anz = workPfad.anzahlVon( "/" );
  215. if( anz )
  216. workPfad.remove( workPfad.positionVon( "/", anz - 1 ), workPfad.getLength() );
  217. else
  218. workPfad = "";
  219. }
  220. delete[] name;
  221. zKlient->sendeEncrypted( "\1", 1 );
  222. return 1;
  223. }
  224. else
  225. {
  226. Text p = pfad.getText();
  227. p += workPfad.getText();
  228. p += "/";
  229. p += name;
  230. Datei d;
  231. d.setDatei( p );
  232. if( !d.existiert() )
  233. {
  234. delete[] name;
  235. fehler = "Die Datei konnte nicht gefunden werden.";
  236. return 0;
  237. }
  238. else
  239. {
  240. if( d.istOrdner() )
  241. {
  242. workPfad += "/";
  243. workPfad += name;
  244. }
  245. delete[] name;
  246. zKlient->sendeEncrypted( "\1", 1 );
  247. return 1;
  248. }
  249. }
  250. }
  251. case 0x3: // Bild laden
  252. {
  253. zKlient->sendeEncrypted( "\1", 1 );
  254. unsigned char len = 0;
  255. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  256. char *dName = new char[ len + 1 ];
  257. dName[ (int)len ] = 0;
  258. if( len )
  259. zKlient->getNachrichtEncrypted( dName, len );
  260. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  261. char *bName = new char[ len + 1 ];
  262. bName[ (int)len ] = 0;
  263. if( len )
  264. zKlient->getNachrichtEncrypted( bName, len );
  265. if( !textLength( dName ) || !textLength( bName ) )
  266. {
  267. delete[] dName;
  268. delete[] bName;
  269. fehler = "Du musst ein Bild und eine Datei angeben.";
  270. return 0;
  271. }
  272. Text p = pfad.getText();
  273. p += workPfad.getText();
  274. p += "/";
  275. p += dName;
  276. delete[] dName;
  277. if( !DateiExistiert( p ) )
  278. {
  279. delete[] bName;
  280. fehler = "Die Datei wurde nicht gefunden.";
  281. return 0;
  282. }
  283. LTDBDatei dat;
  284. dat.setDatei( dynamic_cast<Text *>( p.getThis() ) );
  285. dat.leseDaten( 0 );
  286. Bild *b = dat.laden( 0, new Text( bName ) );
  287. delete[] bName;
  288. if( !b )
  289. {
  290. fehler = "Das Bild wurde nicht gefunden.";
  291. return 0;
  292. }
  293. zKlient->sendeEncrypted( "\1", 1 );
  294. int br = b->getBreite();
  295. int hi = b->getHeight();
  296. zKlient->sendeEncrypted( (char *)&br, 4 );
  297. zKlient->sendeEncrypted( (char *)&hi, 4 );
  298. char *buffer = (char *)b->getBuffer();
  299. __int64 gr = br * hi * 4;
  300. for( int i = 0, l = gr > 2048 ? 2048 : (int)gr; gr > 0; i += l, gr -= l, l = gr > 2048 ? 2048 : (int)gr )
  301. zKlient->sende( &( buffer[ i ] ), l );
  302. b->release();
  303. return 1;
  304. }
  305. case 0x4: // Datei remove
  306. {
  307. zKlient->sendeEncrypted( "\1", 1 );
  308. unsigned char len = 0;
  309. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  310. char *name = new char[ len + 1 ];
  311. name[ (int)len ] = 0;
  312. if( len )
  313. zKlient->getNachrichtEncrypted( name, len );
  314. if( Text( name ).istGleich( ".." ) )
  315. {
  316. fehler = "Du kannst diese Datei nicht remove.";
  317. return 0;
  318. }
  319. Text p = pfad.getText();
  320. p += workPfad.getText();
  321. if( !Text( "." ).istGleich( name ) )
  322. {
  323. p += "/";
  324. p += name;
  325. }
  326. else
  327. {
  328. int anz = workPfad.anzahlVon( "/" );
  329. if( anz )
  330. workPfad.remove( workPfad.positionVon( "/", anz - 1 ), workPfad.getLength() );
  331. else
  332. workPfad = "";
  333. }
  334. delete[] name;
  335. if( !DateiExistiert( p ) )
  336. {
  337. fehler = "Die Datei wurde nicht gefunden.";
  338. return 0;
  339. }
  340. if( !DateiRemove( p ) )
  341. {
  342. fehler = "Fehler beim remove der Datei.";
  343. return 0;
  344. }
  345. p.ersetzen( p.positionVon( "map/client" ), p.positionVon( "map/client" ) + textLength( "map/client" ), "map/server" );
  346. if( !DateiRemove( p ) )
  347. {
  348. fehler = "Fehler beim remove der Datei.";
  349. return 0;
  350. }
  351. zKlient->sendeEncrypted( "\1", 1 );
  352. return 1;
  353. }
  354. case 0x5: // Bild remove
  355. {
  356. zKlient->sendeEncrypted( "\1", 1 );
  357. unsigned char len = 0;
  358. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  359. char *dName = new char[ len + 1 ];
  360. dName[ (int)len ] = 0;
  361. if( len )
  362. zKlient->getNachrichtEncrypted( dName, len );
  363. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  364. char *bName = new char[ len + 1 ];
  365. bName[ (int)len ] = 0;
  366. if( len )
  367. zKlient->getNachrichtEncrypted( bName, len );
  368. if( !textLength( dName ) || !textLength( bName ) )
  369. {
  370. delete[] dName;
  371. delete[] bName;
  372. fehler = "Du musst ein Bild und eine Datei angeben.";
  373. return 0;
  374. }
  375. Text p = pfad.getText();
  376. p += workPfad.getText();
  377. p += "/";
  378. p += dName;
  379. delete[] dName;
  380. if( !DateiExistiert( p ) )
  381. {
  382. delete[] bName;
  383. fehler = "Die Datei wurde nicht gefunden.";
  384. return 0;
  385. }
  386. LTDBDatei dat;
  387. dat.setDatei( dynamic_cast<Text *>( p.getThis() ) );
  388. dat.leseDaten( 0 );
  389. dat.remove( 0, new Text( bName ) );
  390. delete[] bName;
  391. zKlient->sendeEncrypted( "\1", 1 );
  392. return 1;
  393. }
  394. case 0x6: // Bild erstellen
  395. {
  396. zKlient->sendeEncrypted( "\1", 1 );
  397. unsigned char len = 0;
  398. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  399. char *dName = new char[ len + 1 ];
  400. dName[ (int)len ] = 0;
  401. if( len )
  402. zKlient->getNachrichtEncrypted( dName, len );
  403. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  404. char *bName = new char[ len + 1 ];
  405. bName[ (int)len ] = 0;
  406. if( len )
  407. zKlient->getNachrichtEncrypted( bName, len );
  408. if( !textLength( dName ) || !textLength( bName ) )
  409. {
  410. delete[] dName;
  411. delete[] bName;
  412. fehler = "Du musst ein Bild und eine Datei angeben.";
  413. return 0;
  414. }
  415. Text p = pfad.getText();
  416. p += workPfad.getText();
  417. p += "/";
  418. p += dName;
  419. delete[] dName;
  420. if( !DateiExistiert( p ) )
  421. {
  422. delete[] bName;
  423. fehler = "Die Datei wurde nicht gefunden.";
  424. return 0;
  425. }
  426. zKlient->sendeEncrypted( "\1", 1 );
  427. int br = 0;
  428. int hi = 0;
  429. zKlient->getNachrichtEncrypted( (char *)&br, 4 );
  430. zKlient->getNachrichtEncrypted( (char *)&hi, 4 );
  431. __int64 gr = br * hi * 4;
  432. Bild *b = new Bild();
  433. b->neuBild( br, hi, 0 );
  434. char *buffer = (char *)b->getBuffer();
  435. for( int i = 0, l = gr > 2048 ? 2048 : (int)gr; gr > 0; i += l, gr -= l, l = gr > 2048 ? 2048 : (int)gr )
  436. zKlient->getNachricht( &( buffer[ i ] ), l );
  437. LTDBDatei dat;
  438. dat.setDatei( dynamic_cast<Text *>( p.getThis() ) );
  439. dat.leseDaten( 0 );
  440. dat.remove( 0, new Text( bName ) );
  441. if( dat.speichern( 0, b, new Text( bName ) ) < 0 )
  442. {
  443. delete[] bName;
  444. fehler = "Fehler beim speichern des Bildes.";
  445. return 0;
  446. }
  447. delete[] bName;
  448. zKlient->sendeEncrypted( "\1", 1 );
  449. return 1;
  450. }
  451. case 0x7: // Datei Liste herunterladen
  452. {
  453. Datei d;
  454. d.setDatei( Text( pfad.getText() ) += workPfad.getText() );
  455. RCArray< Text > *list = d.getDateiListe();
  456. zKlient->sendeEncrypted( "\1", 1 );
  457. int anz = list ? list->getEintragAnzahl() : 0;
  458. if( workPfad.getLength() )
  459. anz++;
  460. zKlient->sendeEncrypted( (char *)&anz, 4 );
  461. if( workPfad.getLength() )
  462. {
  463. zKlient->sendeEncrypted( "\2", 1 );
  464. zKlient->sendeEncrypted( "..", 2 );
  465. anz--;
  466. }
  467. for( int i = 0; i < anz; i++ )
  468. {
  469. char len = (char)list->z( i )->getLength();
  470. zKlient->sendeEncrypted( &len, 1 );
  471. zKlient->sendeEncrypted( list->z( i )->getText(), len );
  472. }
  473. if( list )
  474. list->release();
  475. return 1;
  476. }
  477. case 0x8: // Bild Liste herunterladen
  478. {
  479. zKlient->sendeEncrypted( "\1", 1 );
  480. unsigned char len = 0;
  481. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  482. char *name = new char[ len + 1 ];
  483. name[ (int)len ] = 0;
  484. if( len )
  485. zKlient->getNachrichtEncrypted( name, len );
  486. if( !textLength( name ) )
  487. {
  488. delete[] name;
  489. fehler = "Du musst eine Datei angeben.";
  490. return 0;
  491. }
  492. Text p = pfad.getText();
  493. p += workPfad.getText();
  494. p += "/";
  495. p += name;
  496. delete[] name;
  497. if( !DateiExistiert( p ) )
  498. {
  499. fehler = "Die Datei wurde nicht gefunden.";
  500. return 0;
  501. }
  502. zKlient->sendeEncrypted( "\1", 1 );
  503. LTDBDatei dat;
  504. dat.setDatei( dynamic_cast<Text *>( p.getThis() ) );
  505. dat.leseDaten( 0 );
  506. int anz = dat.getBildAnzahl();
  507. zKlient->sendeEncrypted( (char *)&anz, 4 );
  508. for( int i = 0; i < anz; i++ )
  509. {
  510. char len = (char)dat.zBildListe()->z( i )->getLength();
  511. zKlient->sendeEncrypted( &len, 1 );
  512. zKlient->sendeEncrypted( dat.zBildListe()->z( i )->getText(), len );
  513. }
  514. return 1;
  515. }
  516. case 0x9: // Modell Liste herunterladen
  517. {
  518. zKlient->sendeEncrypted( "\1", 1 );
  519. unsigned char len = 0;
  520. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  521. char *name = new char[ len + 1 ];
  522. name[ (int)len ] = 0;
  523. if( len )
  524. zKlient->getNachrichtEncrypted( name, len );
  525. if( !textLength( name ) )
  526. {
  527. delete[] name;
  528. fehler = "Du musst eine Datei angeben.";
  529. return 0;
  530. }
  531. Text p = pfad.getText();
  532. p += workPfad.getText();
  533. p += "/";
  534. p += name;
  535. delete[] name;
  536. if( !DateiExistiert( p ) )
  537. {
  538. fehler = "Die Datei wurde nicht gefunden.";
  539. return 0;
  540. }
  541. zKlient->sendeEncrypted( "\1", 1 );
  542. M2Datei dat;
  543. dat.setPfad( p );
  544. dat.leseDaten();
  545. int anz = dat.getModelAnzahl();
  546. zKlient->sendeEncrypted( (char *)&anz, 4 );
  547. for( int i = 0; i < anz; i++ )
  548. {
  549. char len = (char)dat.zModelName( i )->getLength();
  550. zKlient->sendeEncrypted( &len, 1 );
  551. zKlient->sendeEncrypted( dat.zModelName( i )->getText(), len );
  552. }
  553. return 1;
  554. }
  555. case 0xA: // Sound Liste herunterlaen
  556. {
  557. zKlient->sendeEncrypted( "\1", 1 );
  558. unsigned char len = 0;
  559. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  560. char *name = new char[ len + 1 ];
  561. name[ (int)len ] = 0;
  562. if( len )
  563. zKlient->getNachrichtEncrypted( name, len );
  564. if( !textLength( name ) )
  565. {
  566. delete[] name;
  567. fehler = "Du musst eine Datei angeben.";
  568. return 0;
  569. }
  570. Text p = pfad.getText();
  571. p += workPfad.getText();
  572. p += "/";
  573. p += name;
  574. delete[] name;
  575. if( !DateiExistiert( p ) )
  576. {
  577. fehler = "Die Datei wurde nicht gefunden.";
  578. return 0;
  579. }
  580. HMODULE gslDLL = LoadLibrary( ini->zWert( "gslPfad" )->getText() );
  581. if( !gslDLL )
  582. {
  583. fehler = "Interner Server Fehler.";
  584. std::cout << "EdS: Fehler beim laden von '" << ini->zWert( "gslPfad" )->getText() << "'.\n";
  585. return 0;
  586. }
  587. GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( gslDLL, "getGSLDatei" );
  588. if( !getGSLDatei )
  589. {
  590. fehler = "Interner Server Fehler.";
  591. std::cout << "EdS: Der Einstiegspunkt 'getGSLDatei' wurde in der Datei '" << ini->zWert( "gslPfad" )->getText() << "' nicht gefunden.\n";
  592. return 0;
  593. }
  594. GSL::GSLDateiV *gslDatei = getGSLDatei();
  595. zKlient->sendeEncrypted( "\1", 1 );
  596. gslDatei->setDatei( p );
  597. gslDatei->leseDaten();
  598. int anz = gslDatei->getSoundAnzahl();
  599. zKlient->sendeEncrypted( (char *)&anz, 4 );
  600. for( int i = 0; i < anz; i++ )
  601. {
  602. Text *n = gslDatei->getSoundName( i );
  603. char len = (char)n->getLength();
  604. zKlient->sendeEncrypted( &len, 1 );
  605. zKlient->sendeEncrypted( n->getText(), len );
  606. n->release();
  607. }
  608. gslDatei->release();
  609. FreeLibrary( gslDLL );
  610. return 1;
  611. }
  612. case 0xB: // Modell remove
  613. {
  614. zKlient->sendeEncrypted( "\1", 1 );
  615. unsigned char len = 0;
  616. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  617. char *name = new char[ len + 1 ];
  618. name[ (int)len ] = 0;
  619. if( len )
  620. zKlient->getNachrichtEncrypted( name, len );
  621. if( !textLength( name ) )
  622. {
  623. delete[] name;
  624. fehler = "Du musst eine Datei angeben.";
  625. return 0;
  626. }
  627. Text p = pfad.getText();
  628. p += workPfad.getText();
  629. p += "/";
  630. p += name;
  631. delete[] name;
  632. if( !DateiExistiert( p ) )
  633. {
  634. fehler = "Die Datei wurde nicht gefunden.";
  635. return 0;
  636. }
  637. zKlient->sendeEncrypted( "\1", 1 );
  638. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  639. name = new char[ len + 1 ];
  640. name[ (int)len ] = 0;
  641. if( len )
  642. zKlient->getNachrichtEncrypted( name, len );
  643. M2Datei dat;
  644. dat.setPfad( p );
  645. dat.leseDaten();
  646. if( !textLength( name ) || !dat.removeModel( name ) )
  647. {
  648. delete[] name;
  649. fehler = "Das Modell wurde nicht gefunden.";
  650. return 0;
  651. }
  652. p.ersetzen( p.positionVon( "map/client" ), p.positionVon( "map/client" ) + textLength( "map/client" ), "map/server" );
  653. dat.setPfad( p );
  654. dat.leseDaten();
  655. if( !textLength( name ) || !dat.removeModel( name ) )
  656. {
  657. delete[] name;
  658. fehler = "Das Modell wurde nicht gefunden.";
  659. return 0;
  660. }
  661. zKlient->sendeEncrypted( "\1", 1 );
  662. delete[] name;
  663. return 1;
  664. }
  665. case 0xC: // Sound remove
  666. {
  667. zKlient->sendeEncrypted( "\1", 1 );
  668. unsigned char len = 0;
  669. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  670. char *name = new char[ len + 1 ];
  671. name[ (int)len ] = 0;
  672. if( len )
  673. zKlient->getNachrichtEncrypted( name, len );
  674. if( !textLength( name ) )
  675. {
  676. delete[] name;
  677. fehler = "Du musst eine Datei angeben.";
  678. return 0;
  679. }
  680. Text p = pfad.getText();
  681. p += workPfad.getText();
  682. p += "/";
  683. p += name;
  684. delete[] name;
  685. if( !DateiExistiert( p ) )
  686. {
  687. fehler = "Die Datei wurde nicht gefunden.";
  688. return 0;
  689. }
  690. zKlient->sendeEncrypted( "\1", 1 );
  691. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  692. name = new char[ len + 1 ];
  693. name[ (int)len ] = 0;
  694. if( len )
  695. zKlient->getNachrichtEncrypted( name, len );
  696. HMODULE gslDLL = LoadLibrary( ini->zWert( "gslPfad" )->getText() );
  697. if( !gslDLL )
  698. {
  699. fehler = "Interner Server Fehler.";
  700. std::cout << "EdS: Fehler beim laden von '" << ini->zWert( "gslPfad" )->getText() << "'.\n";
  701. return 0;
  702. }
  703. GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( gslDLL, "getGSLDatei" );
  704. if( !getGSLDatei )
  705. {
  706. fehler = "Interner Server Fehler.";
  707. std::cout << "EdS: Der Einstiegspunkt 'getGSLDatei' wurde in der Datei '" << ini->zWert( "gslPfad" )->getText() << "' nicht gefunden.\n";
  708. return 0;
  709. }
  710. GSL::GSLDateiV *gslDatei = getGSLDatei();
  711. gslDatei->setDatei( p );
  712. gslDatei->leseDaten();
  713. if( !textLength( name ) || !gslDatei->removeSound( name ) )
  714. {
  715. fehler = "Das Modell wurde nicht gefunden.";
  716. delete[] name;
  717. gslDatei->release();
  718. FreeLibrary( gslDLL );
  719. return 0;
  720. }
  721. zKlient->sendeEncrypted( "\1", 1 );
  722. delete[] name;
  723. gslDatei->release();
  724. FreeLibrary( gslDLL );
  725. return 1;
  726. }
  727. case 0xD: // Modell laden
  728. {
  729. zKlient->sendeEncrypted( "\1", 1 );
  730. unsigned char len = 0;
  731. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  732. char *name = new char[ len + 1 ];
  733. name[ (int)len ] = 0;
  734. if( len )
  735. zKlient->getNachrichtEncrypted( name, len );
  736. if( !textLength( name ) )
  737. {
  738. delete[] name;
  739. fehler = "Du musst eine Datei angeben.";
  740. return 0;
  741. }
  742. Text p = pfad.getText();
  743. p += workPfad.getText();
  744. p += "/";
  745. p += name;
  746. delete[] name;
  747. if( !DateiExistiert( p ) )
  748. {
  749. fehler = "Die Datei wurde nicht gefunden.";
  750. return 0;
  751. }
  752. zKlient->sendeEncrypted( "\1", 1 );
  753. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  754. name = new char[ len + 1 ];
  755. name[ (int)len ] = 0;
  756. if( len )
  757. zKlient->getNachrichtEncrypted( name, len );
  758. M2Datei dat;
  759. dat.setPfad( p );
  760. dat.leseDaten();
  761. Model2DData *mdl;
  762. if( !textLength( name ) || !( mdl = dat.ladeModel( name ) ) )
  763. {
  764. delete[] name;
  765. fehler = "Das Modell wurde nicht gefunden.";
  766. return 0;
  767. }
  768. zKlient->sendeEncrypted( "\1", 1 );
  769. int anz = mdl->polygons ? mdl->polygons->getEintragAnzahl() : 0;
  770. zKlient->sendeEncrypted( (char *)&anz, 4 );
  771. for( int i = 0; i < anz; i++ )
  772. {
  773. Polygon2D pol = mdl->polygons->get( i );
  774. zKlient->sendeEncrypted( (char *)&pol.transparent, 1 );
  775. char nLen = (char)pol.name->getLength();
  776. zKlient->sendeEncrypted( &nLen, 1 );
  777. if( nLen )
  778. zKlient->sendeEncrypted( pol.name->getText(), nLen );
  779. int anz2 = pol.vertex ? pol.vertex->getEintragAnzahl() : 0;
  780. zKlient->sendeEncrypted( (char *)&anz2, 4 );
  781. for( int j = 0; j < anz2; j++ )
  782. {
  783. float var = pol.vertex->get( j ).x;
  784. zKlient->sendeEncrypted( (char *)&var, 4 );
  785. var = pol.vertex->get( j ).y;
  786. zKlient->sendeEncrypted( (char *)&var, 4 );
  787. var = ( pol.tKordinaten && pol.tKordinaten->hat( j ) ) ? pol.tKordinaten->get( j ).x : 0;
  788. zKlient->sendeEncrypted( (char *)&var, 4 );
  789. var = ( pol.tKordinaten && pol.tKordinaten->hat( j ) ) ? pol.tKordinaten->get( j ).y : 0;
  790. zKlient->sendeEncrypted( (char *)&var, 4 );
  791. }
  792. }
  793. mdl->release();
  794. delete[] name;
  795. return 1;
  796. }
  797. case 0xE: // Sound laden
  798. {
  799. zKlient->sendeEncrypted( "\1", 1 );
  800. unsigned char len = 0;
  801. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  802. char *name = new char[ len + 1 ];
  803. name[ (int)len ] = 0;
  804. if( len )
  805. zKlient->getNachrichtEncrypted( name, len );
  806. if( !textLength( name ) )
  807. {
  808. delete[] name;
  809. fehler = "Du musst eine Datei angeben.";
  810. return 0;
  811. }
  812. Text p = pfad.getText();
  813. p += workPfad.getText();
  814. p += "/";
  815. p += name;
  816. delete[] name;
  817. if( !DateiExistiert( p ) )
  818. {
  819. fehler = "Die Datei wurde nicht gefunden.";
  820. return 0;
  821. }
  822. zKlient->sendeEncrypted( "\1", 1 );
  823. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  824. name = new char[ len + 1 ];
  825. name[ (int)len ] = 0;
  826. if( len )
  827. zKlient->getNachrichtEncrypted( name, len );
  828. HMODULE gslDLL = LoadLibrary( ini->zWert( "gslPfad" )->getText() );
  829. if( !gslDLL )
  830. {
  831. fehler = "Interner Server Fehler.";
  832. std::cout << "EdS: Fehler beim laden von '" << ini->zWert( "gslPfad" )->getText() << "'.\n";
  833. return 0;
  834. }
  835. GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( gslDLL, "getGSLDatei" );
  836. if( !getGSLDatei )
  837. {
  838. fehler = "Interner Server Fehler.";
  839. std::cout << "EdS: Der Einstiegspunkt 'getGSLDatei' wurde in der Datei '" << ini->zWert( "gslPfad" )->getText() << "' nicht gefunden.\n";
  840. return 0;
  841. }
  842. GSL::GSLDateiV *gslDatei = getGSLDatei();
  843. gslDatei->setDatei( p );
  844. gslDatei->leseDaten();
  845. GSL::GSLSoundV *sound;
  846. if( !textLength( name ) || !( sound = gslDatei->getSound( name ) ) )
  847. {
  848. delete[] name;
  849. gslDatei->release();
  850. FreeLibrary( gslDLL );
  851. fehler = "Das Modell wurde nicht gefunden.";
  852. return 0;
  853. }
  854. zKlient->sendeEncrypted( "\1", 1 );
  855. char channels = sound->istMono() ? 1 : 2;
  856. zKlient->sendeEncrypted( &channels, 1 );
  857. int sample = sound->getSampleRate();
  858. zKlient->sendeEncrypted( (char *)&sample, 4 );
  859. __int64 length = sound->getDatLength();
  860. zKlient->sendeEncrypted( (char *)&length, 8 );
  861. sound->open();
  862. char *buffer = new char[ 2048 ];
  863. while( length > 0 )
  864. {
  865. int l = length > 2048 ? 2048 : (int)length;
  866. sound->getDaten( buffer, l );
  867. zKlient->sende( buffer, l );
  868. length -= l;
  869. }
  870. delete[] buffer;
  871. sound->close();
  872. sound->release();
  873. gslDatei->release();
  874. FreeLibrary( gslDLL );
  875. delete[] name;
  876. return 1;
  877. }
  878. case 0xF: // Modell erstellen
  879. {
  880. zKlient->sendeEncrypted( "\1", 1 );
  881. unsigned char len = 0;
  882. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  883. char *name = new char[ len + 1 ];
  884. name[ (int)len ] = 0;
  885. if( len )
  886. zKlient->getNachrichtEncrypted( name, len );
  887. if( !textLength( name ) )
  888. {
  889. delete[] name;
  890. fehler = "Du musst eine Datei angeben.";
  891. return 0;
  892. }
  893. Text p = pfad.getText();
  894. p += workPfad.getText();
  895. p += "/";
  896. p += name;
  897. delete[] name;
  898. if( !DateiExistiert( p ) )
  899. {
  900. fehler = "Die Datei wurde nicht gefunden.";
  901. return 0;
  902. }
  903. zKlient->sendeEncrypted( "\1", 1 );
  904. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  905. name = new char[ len + 1 ];
  906. name[ (int)len ] = 0;
  907. if( len )
  908. zKlient->getNachrichtEncrypted( name, len );
  909. M2Datei dat;
  910. dat.setPfad( p );
  911. dat.leseDaten();
  912. dat.removeModel( name );
  913. if( !textLength( name ) )
  914. {
  915. delete[] name;
  916. fehler = "Du musst einen Namen eingeben.";
  917. return 0;
  918. }
  919. zKlient->sendeEncrypted( "\1", 1 );
  920. Model2DData *mdl = new Model2DData();
  921. Array< Polygon2D > *data = new Array< Polygon2D >();
  922. int anz = 0;
  923. zKlient->getNachrichtEncrypted( (char *)&anz, 4 );
  924. for( int i = 0; i < anz; i++ )
  925. {
  926. Polygon2D pol;
  927. pol.schwerpunkt = 0;
  928. pol.vertex = new Array< Vertex >();
  929. pol.tKordinaten = new Array< Vertex >();
  930. zKlient->getNachrichtEncrypted( (char *)&pol.transparent, 1 );
  931. unsigned char nLen = 0;
  932. zKlient->getNachrichtEncrypted( (char *)&nLen, 1 );
  933. char *txt = new char[ nLen + 1 ];
  934. if( nLen )
  935. zKlient->getNachrichtEncrypted( txt, nLen );
  936. txt[ (int)nLen ] = 0;
  937. pol.name = new Text( txt );
  938. delete[] txt;
  939. int anz2 = 0;
  940. zKlient->getNachrichtEncrypted( (char *)&anz2, 4 );
  941. for( int j = 0; j < anz2; j++ )
  942. {
  943. Vertex v;
  944. Vertex p;
  945. zKlient->getNachrichtEncrypted( (char *)&v.x, 4 );
  946. zKlient->getNachrichtEncrypted( (char *)&v.y, 4 );
  947. zKlient->getNachrichtEncrypted( (char *)&p.x, 4 );
  948. zKlient->getNachrichtEncrypted( (char *)&p.y, 4 );
  949. pol.vertex->add( v );
  950. pol.tKordinaten->add( p );
  951. }
  952. data->add( pol );
  953. }
  954. if( !mdl->erstelleModell( data ) || !dat.saveModel( mdl, name ) )
  955. {
  956. mdl->release();
  957. delete[] name;
  958. fehler = "Fehler beim speichern des Modells.";
  959. return 0;
  960. }
  961. p.ersetzen( p.positionVon( "map/client" ), p.positionVon( "map/client" ) + textLength( "map/client" ), "map/server" );
  962. dat.setPfad( p );
  963. dat.leseDaten();
  964. dat.removeModel( name );
  965. if( !dat.saveModel( mdl, name ) )
  966. {
  967. mdl->release();
  968. delete[] name;
  969. fehler = "Fehler beim speichern des Modells.";
  970. return 0;
  971. }
  972. mdl->release();
  973. zKlient->sendeEncrypted( "\1", 1 );
  974. delete[] name;
  975. return 1;
  976. }
  977. case 0x10: // Sound erstellen
  978. {
  979. zKlient->sendeEncrypted( "\1", 1 );
  980. unsigned char len = 0;
  981. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  982. char *name = new char[ len + 1 ];
  983. name[ (int)len ] = 0;
  984. if( len )
  985. zKlient->getNachrichtEncrypted( name, len );
  986. if( !textLength( name ) )
  987. {
  988. delete[] name;
  989. fehler = "Du musst eine Datei angeben.";
  990. return 0;
  991. }
  992. Text p = pfad.getText();
  993. p += workPfad.getText();
  994. p += "/";
  995. p += name;
  996. delete[] name;
  997. if( !DateiExistiert( p ) )
  998. {
  999. fehler = "Die Datei wurde nicht gefunden.";
  1000. return 0;
  1001. }
  1002. zKlient->sendeEncrypted( "\1", 1 );
  1003. zKlient->getNachrichtEncrypted( (char *)&len, 1 );
  1004. name = new char[ len + 1 ];
  1005. name[ (int)len ] = 0;
  1006. if( len )
  1007. zKlient->getNachrichtEncrypted( name, len );
  1008. HMODULE gslDLL = LoadLibrary( ini->zWert( "gslPfad" )->getText() );
  1009. if( !gslDLL )
  1010. {
  1011. fehler = "Interner Server Fehler.";
  1012. std::cout << "EdS: Fehler beim laden von '" << ini->zWert( "gslPfad" )->getText() << "'.\n";
  1013. return 0;
  1014. }
  1015. GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( gslDLL, "getGSLDatei" );
  1016. if( !getGSLDatei )
  1017. {
  1018. fehler = "Interner Server Fehler.";
  1019. std::cout << "EdS: Der Einstiegspunkt 'getGSLDatei' wurde in der Datei '" << ini->zWert( "gslPfad" )->getText() << "' nicht gefunden.\n";
  1020. return 0;
  1021. }
  1022. GSL::GSLDateiV *gslDatei = getGSLDatei();
  1023. gslDatei->setDatei( p );
  1024. gslDatei->leseDaten();
  1025. gslDatei->removeSound( name );
  1026. if( !textLength( name ) )
  1027. {
  1028. delete[] name;
  1029. gslDatei->release();
  1030. FreeLibrary( gslDLL );
  1031. fehler = "Du musst einen Namen eingeben.";
  1032. return 0;
  1033. }
  1034. DownloadSound dws( zKlient );
  1035. gslDatei->speicherSound( &dws, name );
  1036. if( !dws.istOk() )
  1037. {
  1038. delete[] name;
  1039. gslDatei->release();
  1040. FreeLibrary( gslDLL );
  1041. fehler = "Es ist ein Fehler beim speichern aufgetreten.";
  1042. return 0;
  1043. }
  1044. gslDatei->release();
  1045. FreeLibrary( gslDLL );
  1046. delete[] name;
  1047. return 1;
  1048. }
  1049. case 0x11: // reset work path
  1050. workPfad = "";
  1051. zKlient->sendeEncrypted( "\1", 1 );
  1052. return 1;
  1053. default:
  1054. fehler = "Unbekannte Nachricht. Eventuell ist der Client nicht auf dem neusten Stand.";
  1055. }
  1056. return 0;
  1057. }
  1058. // constant
  1059. char *DateienEditor::getLetzterFehler() const
  1060. {
  1061. return fehler;
  1062. }