SSEditor.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. #include "SSEditor.h"
  2. #include "Datei.h"
  3. #include "DateiSystem.h"
  4. #include "Bild.h"
  5. // Inhalt der SSEditor Klasse aus SSEditor.h
  6. // Konstruktor
  7. SSEditor::SSEditor( char *pf )
  8. {
  9. pfad = pf;
  10. pfad += "/live/shop";
  11. workPfad = "";
  12. fehler = "";
  13. ref = 1;
  14. }
  15. // Destruktor
  16. SSEditor::~SSEditor()
  17. {}
  18. // nicht constant
  19. bool SSEditor::prozessMessage( SKlient *zKlient )
  20. {
  21. char message = 0;
  22. zKlient->getNachrichtEncrypted( &message, 1 );
  23. switch( message )
  24. {
  25. case 0x1: // Neue Datei erstellen
  26. {
  27. zKlient->sendeEncrypted( "\1", 1 );
  28. char typ = 0;
  29. zKlient->getNachrichtEncrypted( &typ, 1 );
  30. char len = 0;
  31. zKlient->getNachrichtEncrypted( &len, 1 );
  32. char *name = new char[ len + 1 ];
  33. if( len )
  34. zKlient->getNachrichtEncrypted( name, len );
  35. name[ (int)len ] = 0;
  36. if( !len )
  37. {
  38. delete[] name;
  39. fehler = "Du musst einen Dateinamen angeben.";
  40. return 0;
  41. }
  42. Text n = name;
  43. delete[] name;
  44. if( n.hat( "/" ) || n.hat( "." ) )
  45. {
  46. fehler = "Du musst einen gültigen Dateinamen angeben.";
  47. return 0;
  48. }
  49. Text p = pfad.getText();
  50. p += workPfad.getText();
  51. p += "/";
  52. p += n;
  53. if( typ == 1 )
  54. {
  55. p += ".ltdb";
  56. if( !DateiPfadErstellen( p ) )
  57. {
  58. fehler = "Fehler beim erstellen der Datei.";
  59. return 0;
  60. }
  61. zKlient->sendeEncrypted( "\1", 1 );
  62. return 1;
  63. }
  64. if( typ == 2 )
  65. {
  66. p += ".ksgs";
  67. if( !DateiPfadErstellen( p ) )
  68. {
  69. fehler = "Fehler beim erstellen der Datei.";
  70. return 0;
  71. }
  72. zKlient->sendeEncrypted( "\1", 1 );
  73. return 1;
  74. }
  75. if( typ == 0 )
  76. {
  77. p += "/tmp";
  78. if( !DateiPfadErstellen( p ) )
  79. {
  80. fehler = "Fehler beim erstellen der Datei.";
  81. return 0;
  82. }
  83. DateiRemove( p );
  84. p.remove( p.getLength() - 4, p.getLength() );
  85. zKlient->sendeEncrypted( "\1", 1 );
  86. return 1;
  87. }
  88. fehler = "Ungültiger Dateityp.";
  89. return 0;
  90. }
  91. case 0x2: // Ordner open
  92. {
  93. zKlient->sendeEncrypted( "\1", 1 );
  94. char len = 0;
  95. zKlient->getNachrichtEncrypted( &len, 1 );
  96. char *name = new char[ len + 1 ];
  97. name[ (int)len ] = 0;
  98. if( len )
  99. zKlient->getNachrichtEncrypted( name, len );
  100. if( Text( ".." ).istGleich( name ) )
  101. {
  102. if( workPfad.getLength() )
  103. {
  104. int anz = workPfad.anzahlVon( "/" );
  105. if( anz )
  106. workPfad.remove( workPfad.positionVon( "/", anz - 1 ), workPfad.getLength() );
  107. else
  108. workPfad = "";
  109. }
  110. delete[] name;
  111. zKlient->sendeEncrypted( "\1", 1 );
  112. return 1;
  113. }
  114. else
  115. {
  116. Text p = pfad.getText();
  117. p += workPfad.getText();
  118. p += "/";
  119. p += name;
  120. Datei d;
  121. d.setDatei( p );
  122. if( !d.existiert() )
  123. {
  124. delete[] name;
  125. fehler = "Die Datei konnte nicht gefunden werden.";
  126. return 0;
  127. }
  128. else
  129. {
  130. if( d.istOrdner() )
  131. {
  132. workPfad += "/";
  133. workPfad += name;
  134. }
  135. delete[] name;
  136. zKlient->sendeEncrypted( "\1", 1 );
  137. return 1;
  138. }
  139. }
  140. }
  141. case 0x3: // Bild laden
  142. {
  143. zKlient->sendeEncrypted( "\1", 1 );
  144. char len = 0;
  145. zKlient->getNachrichtEncrypted( &len, 1 );
  146. char *dName = new char[ len + 1 ];
  147. dName[ (int)len ] = 0;
  148. if( len )
  149. zKlient->getNachrichtEncrypted( dName, len );
  150. zKlient->getNachrichtEncrypted( &len, 1 );
  151. char *bName = new char[ len + 1 ];
  152. bName[ (int)len ] = 0;
  153. if( len )
  154. zKlient->getNachrichtEncrypted( bName, len );
  155. if( !textLength( dName ) || !textLength( bName ) )
  156. {
  157. delete[] dName;
  158. delete[] bName;
  159. fehler = "Du musst ein Bild und eine Datei angeben.";
  160. return 0;
  161. }
  162. Text p = pfad.getText();
  163. p += workPfad.getText();
  164. p += "/";
  165. p += dName;
  166. delete[] dName;
  167. if( !DateiExistiert( p ) )
  168. {
  169. delete[] bName;
  170. fehler = "Die Datei wurde nicht gefunden.";
  171. return 0;
  172. }
  173. LTDBDatei dat;
  174. dat.setDatei( p.getThis() );
  175. dat.leseDaten( 0 );
  176. Bild *b = dat.laden( 0, new Text( bName ) );
  177. delete[] bName;
  178. if( !b )
  179. {
  180. fehler = "Das Bild wurde nicht gefunden.";
  181. return 0;
  182. }
  183. zKlient->sendeEncrypted( "\1", 1 );
  184. int br = b->getBreite();
  185. int hi = b->getHeight();
  186. zKlient->sendeEncrypted( (char*)&br, 4 );
  187. zKlient->sendeEncrypted( (char*)&hi, 4 );
  188. char *buffer = (char*)b->getBuffer();
  189. __int64 gr = br * hi * 4;
  190. for( int i = 0, l = gr > 2048 ? 2048 : (int)gr; gr > 0; i += l, gr -= l, l = gr > 2048 ? 2048 : (int)gr )
  191. zKlient->sende( &( buffer[ i ] ), l );
  192. b->release();
  193. return 1;
  194. }
  195. case 0x4: // Datei remove
  196. {
  197. zKlient->sendeEncrypted( "\1", 1 );
  198. char len = 0;
  199. zKlient->getNachrichtEncrypted( &len, 1 );
  200. char *name = new char[ len + 1 ];
  201. name[ (int)len ] = 0;
  202. if( len )
  203. zKlient->getNachrichtEncrypted( name, len );
  204. if( Text( name ).istGleich( ".." ) )
  205. {
  206. fehler = "Du kannst diese Datei nicht remove.";
  207. return 0;
  208. }
  209. Text p = pfad.getText();
  210. p += workPfad.getText();
  211. if( !Text( "." ).istGleich( name ) )
  212. {
  213. p += "/";
  214. p += name;
  215. int anz = workPfad.anzahlVon( "/" );
  216. if( anz )
  217. workPfad.remove( workPfad.positionVon( "/", anz - 1 ), workPfad.getLength() );
  218. else
  219. workPfad = "";
  220. }
  221. delete[] name;
  222. if( !DateiExistiert( p ) )
  223. {
  224. fehler = "Die Datei wurde nicht gefunden.";
  225. return 0;
  226. }
  227. if( !DateiRemove( p ) )
  228. {
  229. fehler = "Fehler beim remove der Datei.";
  230. return 0;
  231. }
  232. zKlient->sendeEncrypted( "\1", 1 );
  233. return 1;
  234. }
  235. case 0x5: // Text speichern
  236. {
  237. zKlient->sendeEncrypted( "\1", 1 );
  238. char len = 0;
  239. zKlient->getNachrichtEncrypted( &len, 1 );
  240. char *name = new char[ len + 1 ];
  241. name[ (int)len ] = 0;
  242. if( len )
  243. zKlient->getNachrichtEncrypted( name, len );
  244. if( Text( name ).istGleich( ".." ) )
  245. {
  246. fehler = "Du kannst diese Datei nicht bearbeiten.";
  247. return 0;
  248. }
  249. Text p = pfad.getText();
  250. p += workPfad.getText();
  251. p += "/";
  252. p += name;
  253. delete[] name;
  254. if( !DateiExistiert( p ) )
  255. {
  256. fehler = "Die Datei wurde nicht gefunden.";
  257. return 0;
  258. }
  259. zKlient->sendeEncrypted( "\1", 1 );
  260. Datei d;
  261. d.setDatei( p );
  262. bool ok = d.open( Datei::Style::schreiben );
  263. char *buffer = new char[ 2048 ];
  264. int gr = 0;
  265. zKlient->getNachrichtEncrypted( (char*)&gr, 4 );
  266. while( gr > 0 )
  267. {
  268. int l = gr > 2048 ? 2048 : gr;
  269. zKlient->getNachricht( buffer, l );
  270. d.schreibe( buffer, l );
  271. gr -= l;
  272. }
  273. delete[] buffer;
  274. d.close();
  275. if( !ok )
  276. {
  277. fehler = "Es ist ein Fehler beim schreiben der Datei aufgetreten.";
  278. return 0;
  279. }
  280. zKlient->sendeEncrypted( "\1", 1 );
  281. return 1;
  282. }
  283. case 0x6: // Bild remove
  284. {
  285. zKlient->sendeEncrypted( "\1", 1 );
  286. char len = 0;
  287. zKlient->getNachrichtEncrypted( &len, 1 );
  288. char *dName = new char[ len + 1 ];
  289. dName[ (int)len ] = 0;
  290. if( len )
  291. zKlient->getNachrichtEncrypted( dName, len );
  292. zKlient->getNachrichtEncrypted( &len, 1 );
  293. char *bName = new char[ len + 1 ];
  294. bName[ (int)len ] = 0;
  295. if( len )
  296. zKlient->getNachrichtEncrypted( bName, len );
  297. if( !textLength( dName ) || !textLength( bName ) )
  298. {
  299. delete[] dName;
  300. delete[] bName;
  301. fehler = "Du musst ein Bild und eine Datei angeben.";
  302. return 0;
  303. }
  304. Text p = pfad.getText();
  305. p += workPfad.getText();
  306. p += "/";
  307. p += dName;
  308. delete[] dName;
  309. if( !DateiExistiert( p ) )
  310. {
  311. delete[] bName;
  312. fehler = "Die Datei wurde nicht gefunden.";
  313. return 0;
  314. }
  315. LTDBDatei dat;
  316. dat.setDatei( p.getThis() );
  317. dat.leseDaten( 0 );
  318. dat.remove( 0, new Text( bName ) );
  319. delete[] bName;
  320. zKlient->sendeEncrypted( "\1", 1 );
  321. return 1;
  322. }
  323. case 0x7: // Bild erstellen
  324. {
  325. zKlient->sendeEncrypted( "\1", 1 );
  326. char len = 0;
  327. zKlient->getNachrichtEncrypted( &len, 1 );
  328. char *dName = new char[ len + 1 ];
  329. dName[ (int)len ] = 0;
  330. if( len )
  331. zKlient->getNachrichtEncrypted( dName, len );
  332. zKlient->getNachrichtEncrypted( &len, 1 );
  333. char *bName = new char[ len + 1 ];
  334. bName[ (int)len ] = 0;
  335. if( len )
  336. zKlient->getNachrichtEncrypted( bName, len );
  337. if( !textLength( dName ) || !textLength( bName ) )
  338. {
  339. delete[] dName;
  340. delete[] bName;
  341. fehler = "Du musst ein Bild und eine Datei angeben.";
  342. return 0;
  343. }
  344. Text p = pfad.getText();
  345. p += workPfad.getText();
  346. p += "/";
  347. p += dName;
  348. delete[] dName;
  349. if( !DateiExistiert( p ) )
  350. {
  351. delete[] bName;
  352. fehler = "Die Datei wurde nicht gefunden.";
  353. return 0;
  354. }
  355. zKlient->sendeEncrypted( "\1", 1 );
  356. int br = 0;
  357. int hi = 0;
  358. zKlient->getNachrichtEncrypted( (char*)&br, 4 );
  359. zKlient->getNachrichtEncrypted( (char*)&hi, 4 );
  360. __int64 gr = br * hi * 4;
  361. Bild *b = new Bild();
  362. b->neuBild( br, hi, 0 );
  363. char *buffer = (char*)b->getBuffer();
  364. for( int i = 0, l = gr > 2048 ? 2048 : (int)gr; gr > 0; i += l, gr -= l, l = gr > 2048 ? 2048 : (int)gr )
  365. zKlient->getNachricht( &( buffer[ i ] ), l );
  366. LTDBDatei dat;
  367. dat.setDatei( p.getThis() );
  368. dat.leseDaten( 0 );
  369. dat.remove( 0, new Text( bName ) );
  370. if( dat.speichern( 0, b, new Text( bName ) ) < 0 )
  371. {
  372. delete[] bName;
  373. fehler = "Fehler beim speichern des Bildes.";
  374. return 0;
  375. }
  376. delete[] bName;
  377. zKlient->sendeEncrypted( "\1", 1 );
  378. return 1;
  379. }
  380. case 0x8: // Datei Liste herunterladen
  381. {
  382. Datei d;
  383. d.setDatei( Text( pfad.getText() ) += workPfad.getText() );
  384. RCArray< Text > *list = d.getDateiListe();
  385. if( !list )
  386. {
  387. fehler = "Es ist ein Fehler beim laden der Dateiliste aufgetreten.";
  388. return 0;
  389. }
  390. zKlient->sendeEncrypted( "\1", 1 );
  391. int anz = list->getEintragAnzahl();
  392. if( workPfad.getLength() )
  393. anz++;
  394. zKlient->sendeEncrypted( (char*)&anz, 4 );
  395. if( workPfad.getLength() )
  396. {
  397. zKlient->sendeEncrypted( "\2", 1 );
  398. zKlient->sendeEncrypted( "..", 2 );
  399. anz--;
  400. }
  401. for( int i = 0; i < anz; i++ )
  402. {
  403. char len = (char)list->z( i )->getLength();
  404. zKlient->sendeEncrypted( &len, 1 );
  405. zKlient->sendeEncrypted( list->z( i )->getText(), len );
  406. }
  407. list->release();
  408. return 1;
  409. }
  410. case 0x9: // Bild Liste herunterladen
  411. {
  412. zKlient->sendeEncrypted( "\1", 1 );
  413. char len = 0;
  414. zKlient->getNachrichtEncrypted( &len, 1 );
  415. char *name = new char[ len + 1 ];
  416. name[ (int)len ] = 0;
  417. if( len )
  418. zKlient->getNachrichtEncrypted( name, len );
  419. if( !textLength( name ) )
  420. {
  421. delete[] name;
  422. fehler = "Du musst ein Bild und eine Datei angeben.";
  423. return 0;
  424. }
  425. Text p = pfad.getText();
  426. p += workPfad.getText();
  427. p += "/";
  428. p += name;
  429. delete[] name;
  430. if( !DateiExistiert( p ) )
  431. {
  432. fehler = "Die Datei wurde nicht gefunden.";
  433. return 0;
  434. }
  435. zKlient->sendeEncrypted( "\1", 1 );
  436. LTDBDatei dat;
  437. dat.setDatei( p.getThis() );
  438. dat.leseDaten( 0 );
  439. int anz = dat.getBildAnzahl();
  440. zKlient->sendeEncrypted( (char*)&anz, 4 );
  441. for( int i = 0; i < anz; i++ )
  442. {
  443. char len = (char)dat.zBildListe()->z( i )->getLength();
  444. zKlient->sendeEncrypted( &len, 1 );
  445. zKlient->sendeEncrypted( dat.zBildListe()->z( i )->getText(), len );
  446. }
  447. return 1;
  448. }
  449. case 0xA: // Text laden
  450. {
  451. zKlient->sendeEncrypted( "\1", 1 );
  452. char len = 0;
  453. zKlient->getNachrichtEncrypted( &len, 1 );
  454. char *name = new char[ len + 1 ];
  455. name[ (int)len ] = 0;
  456. if( len )
  457. zKlient->getNachrichtEncrypted( name, len );
  458. if( Text( name ).istGleich( ".." ) )
  459. {
  460. fehler = "Du kannst diese Datei nicht bearbeiten.";
  461. return 0;
  462. }
  463. Text p = pfad.getText();
  464. p += workPfad.getText();
  465. p += "/";
  466. p += name;
  467. delete[] name;
  468. if( !DateiExistiert( p ) )
  469. {
  470. fehler = "Die Datei wurde nicht gefunden.";
  471. return 0;
  472. }
  473. zKlient->sendeEncrypted( "\1", 1 );
  474. Datei d;
  475. d.setDatei( p );
  476. bool ok = d.open( Datei::Style::lesen );
  477. char *buffer = new char[ 2048 ];
  478. int gr = (int)d.getSize();
  479. zKlient->sendeEncrypted( (char*)&gr, 4 );
  480. while( gr > 0 )
  481. {
  482. int l = gr > 2048 ? 2048 : gr;
  483. d.lese( buffer, l );
  484. zKlient->sende( buffer, l );
  485. gr -= l;
  486. }
  487. delete[] buffer;
  488. d.close();
  489. if( !ok )
  490. {
  491. fehler = "Es ist ein Fehler beim schreiben der Datei aufgetreten.";
  492. return 0;
  493. }
  494. zKlient->sendeEncrypted( "\1", 1 );
  495. return 1;
  496. }
  497. default:
  498. fehler = "Unbekannte Nachricht. Eventuell ist der Client nicht auf dem neusten Stand.";
  499. }
  500. return 0;
  501. }
  502. // constant
  503. char *SSEditor::getLetzterFehler() const
  504. {
  505. return fehler;
  506. }
  507. // Reference Counting
  508. SSEditor *SSEditor::getThis()
  509. {
  510. ref++;
  511. return this;
  512. }
  513. SSEditor *SSEditor::release()
  514. {
  515. ref--;
  516. if( !ref )
  517. delete this;
  518. return 0;
  519. }