DateienEditor.cpp 26 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(const 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. const char* DateienEditor::getLetzterFehler() const
  1060. {
  1061. return fehler;
  1062. }