Autor Beitrag
Xelos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Fr 25.10.02 10:51 
Hi,
ich möchte ein Proggi schreiben, welches die Server mit dem Port 4661 aus der server.met herrausfiltert und eine neue Server.met erstellt. (Wegen Portfreigaben des Router / LOW-ID).

Nun meine Fragen:

Weiss jemand, was diese Datei für ein Format hat?
ocbmaurice.dyndns.or.../server.met?download

Wie bekomme ich die eingelesen, so das man auch was mit anfangen kann *g*.

Wie kann man die wieder schreiben?

Ich hoffe mir kann jemand helfen, hab schon das halbe Web nach einer Beschreibung dafür durchsucht.

Thxi für die Mühe

Gruss
Xelos
mars
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Sa 26.10.02 11:14 
www.schrevel.com/edonkey/

da steht glaub ich alles, was du brauchst!!!

greets
Xelos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 26.10.02 15:26 
ja, da steht schon mal das Format ;)

Und wie liest man sowas aus und schreibt es wieder?

Gruss
Xelos
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: So 27.10.02 02:35 
Hi!

Diese Seite nimmt Dir doch schon die ganze Arbeit ab!! 8)
Du packst also die ganzen Daten von der Seite in records und ab geht's...

Hier mal ein kleines Bsp. wie man den Header auslesen könnte:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
  TeDonkeyHeader = packed record
    Version: Byte;
    NumOfServers: LongWord;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ServMetFileName: String;
  ServMet: TFileStream;
  eDonkeyHeader: TeDonkeyHeader;
begin
  if OpenDialog.Execute then
  begin
    ServMetFileName := OpenDialog.FileName;
    ServMet := TFileStream.Create(ServMetFileName, fmOpenRead);
    ServMet.Seek(0, soFromBeginning);
    ServMet.Read(eDonkeyHeader, SizeOf(eDonkeyHeader));
    ShowMessage('Version: ' + IntToStr(eDonkeyHeader.Version) + ' entspricht: $' + IntToHex(eDonkeyHeader.Version, 2));
    ShowMessage('Number Of Servers: ' + IntToStr(eDonkeyHeader.NumOfServers));
    ServMet.Free;
  end;
end;


Gruß,
Markus
Xelos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: So 27.10.02 16:27 
Schon mal Thxi, das hat mich schon ein ganzes Stück weitergebracht.

Nun schaffe ich es auch die erste ServerIP und den Port auszulesen.
Danach kommen aber diese Meta Tags. Da komm ich nicht weiter.
Wie kann man die handhaben?

Der Code sieht so aus im Moment:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
type 
  TeDonkeyHeader = packed record 
    Version: Byte; 
    NumOfServers: LongWord; 
  end; 
type
Teserver=packed record
   ip1:byte;
   ip2:byte;
   ip3:byte;
   ip4:byte;
   port:word;
   meta:longword;
 end;


procedure TForm1.Button1Click(Sender: TObject);
var 
  ServMetFileName: String; 
  ServMet: TFileStream;
  eDonkeyHeader: TeDonkeyHeader;
  eserver:teserver;
begin
  if OpenDialog1.Execute then
  begin 
    ServMetFileName := OpenDialog1.FileName;
    ServMet := TFileStream.Create(ServMetFileName, fmOpenRead); 
    ServMet.Seek(0, soFromBeginning); 
    //header auslesen
    ServMet.Read(eDonkeyHeader, SizeOf(eDonkeyHeader));
    ShowMessage('Version: ' + IntToStr(eDonkeyHeader.Version) + ' entspricht: $' + IntToHex(eDonkeyHeader.Version, 2));
    ShowMessage('Number Of Servers: ' + IntToStr(eDonkeyHeader.NumOfServers));
    //ersten Server auslesen
    servMet.read(eserver,SizeOf(eserver));
    ShowMessage('serverip: ' + IntToStr(eserver.ip1)+'.'+IntToStr(eserver.ip2)+'.'+IntToStr(eserver.ip3)+'.'+IntToStr(eserver.ip4));
    ShowMessage('serverport: ' + IntToStr(eserver.port));
    ShowMessage('numberofmeta: ' + IntToStr(eserver.meta));
    //zweiten Server auslesen (zum testen ob der erste komplett ausgelesen wurde)
    servMet.read(eserver,SizeOf(eserver));
    ShowMessage('serverip: ' + IntToStr(eserver.ip1)+'.'+IntToStr(eserver.ip2)+'.'+IntToStr(eserver.ip3)+'.'+IntToStr(eserver.ip4));
    ShowMessage('serverport: ' + IntToStr(eserver.port));
    ShowMessage('numberofmeta: ' + IntToStr(eserver.meta));

    ServMet.Free;
  end; 
 end;


Auf Hilfe hoffend *g*
Xelos
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Mo 28.10.02 00:30 
Hi.

Das Problem an der Sache (ich war wohl mit meinem 1. Post etwas zu voreilig :( ) ist, dass der special tag nicht bekannt ist. Zumindest ist er auf der oben genannten Seite nicht vollständig!
Bei meinen Tests kamen aber so gut wie nur diese genannten special tags vor :?
Mit meinem Code wirst Du deshalb wohl nicht viel anfangen können. Ich poste in trotzdem mal:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
type
  TeDonkeyHeader = packed record
    Version: Byte;
    NumOfServers: LongWord;
  end;

  TeDonkeyServer = packed record
    IP: Array[0..3] of Byte;
    Port: Word;
    NumOfMetaTags: LongWord;
  end;

  TeDonkeyMetaTagHeader = packed record
    TagType: Byte;
    NameLength: Word;
    NameValue: PChar;
  end;

  TeDonkeyMetaTag2 = packed record
    ValueLength: Word;
    Value: PChar;
  end;

  TeDonkeyMetaTag3 = packed record
    Value: LongWord;
  end;

  TeDonkeyMetaTagSpecial = packed record
    NameValue1: String;
    NameValue11: String;
    NameValue13: Word; (*???*)
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ServMet: TFileStream;
  eDonkeyHeader: TeDonkeyHeader;
  eDonkeyServer: TeDonkeyServer;
  eDonkeyMetaTagHeader: TeDonkeyMetaTagHeader;
  eDonkeyMetaTag2: TeDonkeyMetaTag2;
  eDonkeyMetaTag3: TeDonkeyMetaTag3;
//  iNumOfServers: Integer;
  iNumOfMetaTags: Integer;
begin
  if OpenDialog.Execute then
  begin
    ServMet := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
    try
      ServMet.Seek(0, soFromBeginning);
      ServMet.Read(eDonkeyHeader, SizeOf(eDonkeyHeader));
      ShowMessage('Version: ' + IntToStr(eDonkeyHeader.Version) + ' entspricht: $' + IntToHex(eDonkeyHeader.Version, 2));
      ShowMessage('Number Of Servers: ' + IntToStr(eDonkeyHeader.NumOfServers));
//      for iNumOfServers := 1 to eDonkeyHeader.NumOfServers do
      begin
        ServMet.Read(eDonkeyServer, SizeOf(eDonkeyServer));
        ShowMessage('IP: ' + IntToStr(eDonkeyServer.IP[0]) + '.' + IntToStr(eDonkeyServer.IP[1]) + '.' + IntToStr(eDonkeyServer.IP[2]) + '.' + IntToStr(eDonkeyServer.IP[3]));
        ShowMessage('Port: ' + IntToStr(eDonkeyServer.Port));
        ShowMessage('Number Of MetaTags: ' + IntToStr(eDonkeyServer.NumOfMetaTags));
        for iNumOfMetaTags := 1 to eDonkeyServer.NumOfMetaTags do
        begin
          ServMet.Read(eDonkeyMetaTagHeader, SizeOf(Byte) + SizeOf(Word));
          ShowMessage('Tag Type: ' + IntToStr(eDonkeyMetaTagHeader.TagType));
          ShowMessage('Name Length: ' + IntToStr(eDonkeyMetaTagHeader.NameLength));
          GetMem(eDonkeyMetaTagHeader.NameValue, eDonkeyMetaTagHeader.NameLength);
          ServMet.Read(eDonkeyMetaTagHeader.NameValue^, eDonkeyMetaTagHeader.NameLength);
          ShowMessage('Name Value: ' + eDonkeyMetaTagHeader.NameValue);
          // special tag
          if (eDonkeyMetaTagHeader.NameLength = 1) then
          begin
            ShowMessage('not yet implemented');
            break;
          end else
          begin
            // tag type 2
            if (eDonkeyMetaTagHeader.TagType = 2) then
            begin
              ServMet.Read(eDonkeyMetaTag2, SizeOf(Word));
              ShowMessage('Value Length: ' + IntToStr(eDonkeyMetaTag2.ValueLength));
              FreeMem(eDonkeyMetaTagHeader.NameValue);
              GetMem(eDonkeyMetaTag2.Value, eDonkeyMetaTag2.ValueLength);
              ServMet.Read(eDonkeyMetaTag2.Value^, eDonkeyMetaTag2.ValueLength);
              ShowMessage('Name Value: ' + eDonkeyMetaTag2.Value);
              FreeMem(eDonkeyMetaTag2.Value);
            end else
            // tag type 3
            begin
              ServMet.Read(eDonkeyMetaTag3, SizeOf(eDonkeyMetaTag3));
              ShowMessage('Value: ' + IntToStr(eDonkeyMetaTag3.Value));
            end;
          end;
        end;
      end;
    finally
      ServMet.Free;
    end;
  end;
end;


Gruß,
Markus

PS: Vielleicht treibst Du ja die nötigen Informationen noch auf. Wenn Du sie hast kannst Dich ja mal bei mir melden. Vielen Dank im Voraus!
Xelos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mo 28.10.02 04:46 
Wow, erstmal danke, das du dich damit überhaupt beschäftigst. Ist ja doch schon ein richtiges Projekt geworden und nicht nur eine kleine Hilfe.

Ich habe folgenden QBasic Code gefunden, der es tatsächlich schafft, eine Server.met auszulesen. Wenn man nun QBasic kann (was ich nicht so hinbekomme) dann könnte man das portieren.

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
DECLARE FUNCTION int2str$ (var!)
DECLARE FUNCTION getByte! ()
DECLARE SUB readServers ()

DIM SHARED longer AS LONG
DIM SHARED cases$(20)
DIM SHARED pref$(20)
DIM SHARED serverCount, servers, readCount AS DOUBLE

FOR i = 1 TO 20: cases$(i) = "n/a": NEXT

cases$(1) = "name":cases$(11) = "desc":cases$(12) = "ping":cases$(13) = "hist":cases$(14) = "pref":cases$(15) = "port":cases$(16) = "IP"
pref$(0) = "normal":pref$(1) = "high":pref$(2) = "low"

CLS

PRINT :PRINT :PRINT "goto the directory where the server.met is located":PRINT "then enter 'exit' to begin":SHELL
OPEN "SERVER.MET" FOR BINARY LOCK READ AS #1

IF (getByte <> 14) THEN
        PRINT "invalid header !!!": END
END IF

servers = getByte + getByte * 256 + getByte * 256 ^ 2
PRINT : PRINT "found " + int2str(servers) + " edonkey2000 servers": PRINT : PRINT "press any key to begin server listening"

DO: LOOP WHILE INKEY$ = ""

CLS : readCount = 5

FOR serverCount = 1 TO servers
  readServers
NEXT

CLOSE

FUNCTION getByte

  DIM tmp AS STRING * 1

  readCount = readCount + 1
  GET 1, readCount, tmp

  getByte = ASC(tmp)

END FUNCTION

FUNCTION int2str$ (var)
                                
  int2str = LTRIM$(RTRIM$(STR$(var)))

END FUNCTION

SUB readServers

  serverIP$ = int2str(getByte) + "." + int2str(getByte) + "." + int2str(getByte) + "." + int2str(getByte)
  serverPORT$ = int2str(getByte + getByte * 256)

  PRINT : PRINT : PRINT "server (" + int2str(serverCount) + "/" + int2str(servers) + ") : " + serverIP$ + ":" + serverPORT$: PRINT : PRINT

  servertags = getByte + getByte * 256 + getByte * 256 ^ 2 + getByte * 256 ^ 3

  FOR tagcount = 1 TO servertags
    PRINT int2str(tagcount) + " -> ";

    varmode = getByte
    length = getByte + getByte * 256

    IF length > 1 THEN
      tag$ = "'"
      FOR i = 1 TO length
        tag$ = tag$ + CHR$(getByte)
      NEXT
      tag$ = tag$ + "'"
    ELSE
      dummy = getByte
      tag$ = STRING$(ABS(LEN(LTRIM$(RTRIM$(STR$(dummy)))) - 2), "0") + LTRIM$(RTRIM$(STR$(dummy))) + ">" + cases$(dummy)
    END IF

    SELECT CASE varmode
    CASE 2
      length = getByte + getByte * 256
      value$ = "'"
      FOR i = 1 TO length
        value$ = value$ + CHR$(getByte)
      NEXT
      value$ = value$ + "'"

    CASE 3
      SELECT CASE dummy
        CASE 14
          value$ = CHR$(34) + pref$(getByte + getByte * 256 + getByte * 256 ^ 2 + getByte ^ 3) + CHR$(34)
        CASE 16
          value$ = CHR$(34) + int2str(getByte) + "." + int2str(getByte) + "." + int2str(getByte) + "." + int2str(getByte) + CHR$(34)
        CASE ELSE
          longer = getByte + getByte * 256 + getByte * 256 ^ 2 + getByte ^ 3
          value$ = LTRIM$(RTRIM$(STR$(longer)))
      END SELECT
    END SELECT

    PRINT " value for tag " + tag$ + STRING$(8 - LEN(tag$), " ") + "is " + value$
      
  NEXT

  PRINT : PRINT : PRINT "press any key to show next server"
  DO: LOOP WHILE INKEY$ = ""
  CLS

END SUB


Gruss
Xelos
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Di 29.10.02 00:50 
Okay, bin dran...
Gelernt aus dem Basiccode haben wir, dass es im Prinzip nur ein meta tag 2 und ein meta tag 3 gibt.
Damit scheint es auch zu funktionieren.
Gegen Wochenende werde ich dann hier den aktuellen Stand posten.
Mal schauen wie weit ich komme, habe momentan leider viel um die Ohren :cry:

Gruß,
Markus
Xelos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Di 29.10.02 07:54 
:D :D :D

Danke

Gruss
Xelos
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Mi 30.10.02 18:59 
Hi Xelos.

Aktueller Stand:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
type
  TeDonkeyHeader = packed record
    Version: Byte;
    NumOfServers: LongWord;
  end;

  TeDonkeyServer = packed record
    IP: Array[0..3] of Byte;
    Port: Word;
    NumOfMetaTags: LongWord;
  end;

  TeDonkeyMetaTagHeader = packed record
    TagType: Byte;
    NameLength: Word;
    NameValue: String;
  end;

  TeDonkeyMetaTag2 = packed record
    ValueLength: Word;
    Value: String;
  end;

  TeDonkeyMetaTag3 = packed record
    Value: LongWord;
  end;

const
  TeDonkeyMetaTagSpecial: Array[0..21] of String =
                           ('unknown',     // 0x00
                            'Name',        // 0x01 String
                            'Size',        // 0x02
                            'MediaType',   // 0x03 String (Audio, Video, Image, Pro, Doc, Col)
                            'Format',      // 0x04 String (file extension)
                            'unknown',     // 0x05
                            'unknown',     // 0x06
                            'unknown',     // 0x07
                            'Copied',      // 0x08
                            'GapStart',    // 0x09 Data keeps number of gap as string
                            'GapEnd',      // 0x0A Data keeps number of gap as string
                            'Description', // 0x0B String
                            'Ping',        // 0x0C
                            'Fail',        // 0x0D
                            'Preference',  // 0x0E
                            'Port',        // 0x0F
                            'IP',          // 0x10
                            'Version',     // 0x11
                            'TempFile',    // 0x12 String
                            'Priority',    // 0x13
                            'Status',      // 0x14
                            'Availability' // 0x15
                           );
  TeDonkeyPreference: Array[0..2] of String = ('Normal', 'High', 'Low');

procedure TForm1.Button1Click(Sender: TObject);
var
  ServMet: TFileStream;
  eDonkeyHeader: TeDonkeyHeader;
  eDonkeyServer: TeDonkeyServer;
  eDonkeyMetaTagHeader: TeDonkeyMetaTagHeader;
  eDonkeyMetaTag2: TeDonkeyMetaTag2;
  eDonkeyMetaTag3: TeDonkeyMetaTag3;
  iNumOfServers: Integer;
  iNumOfMetaTags: Integer;
  iSpecialTag: Byte;
begin
  if OpenDialog.Execute then
  begin
    ServMet := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
    try
      ServMet.Seek(0, soFromBeginning);
      ServMet.Read(eDonkeyHeader, SizeOf(eDonkeyHeader));
      ShowMessage('Version: ' + IntToStr(eDonkeyHeader.Version) + ' entspricht: $' + IntToHex(eDonkeyHeader.Version, 2));
      ShowMessage('Number Of Servers: ' + IntToStr(eDonkeyHeader.NumOfServers));
      for iNumOfServers := 1 to eDonkeyHeader.NumOfServers do
      begin
        ServMet.Read(eDonkeyServer, SizeOf(eDonkeyServer));
        ShowMessage('IP: ' + IntToStr(eDonkeyServer.IP[0]) + '.' + IntToStr(eDonkeyServer.IP[1]) + '.' + IntToStr(eDonkeyServer.IP[2]) + '.' + IntToStr(eDonkeyServer.IP[3]));
        ShowMessage('Port: ' + IntToStr(eDonkeyServer.Port));
        for iNumOfMetaTags := 1 to eDonkeyServer.NumOfMetaTags do
        begin
          ServMet.Read(eDonkeyMetaTagHeader, SizeOf(Byte) + SizeOf(Word));
          if eDonkeyMetaTagHeader.NameLength = 1 then
          // special tag
          begin
            ServMet.Read(iSpecialTag, SizeOf(iSpecialTag));
            eDonkeyMetaTagHeader.NameValue := TeDonkeyMetaTagSpecial[iSpecialTag];
          end else
          // string
          begin
            SetLength(eDonkeyMetaTagHeader.NameValue, eDonkeyMetaTagHeader.NameLength);
            ServMet.Read(eDonkeyMetaTagHeader.NameValue[1], eDonkeyMetaTagHeader.NameLength);
          end;
          // tag type 2
          if (eDonkeyMetaTagHeader.TagType = 2) then
          begin
            ServMet.Read(eDonkeyMetaTag2, SizeOf(Word));
            SetLength(eDonkeyMetaTag2.Value, eDonkeyMetaTag2.ValueLength);
            ServMet.Read(eDonkeyMetaTag2.Value[1], eDonkeyMetaTag2.ValueLength);
            ShowMessage(eDonkeyMetaTagHeader.NameValue + ': ' + eDonkeyMetaTag2.Value);
          end else
          // tag type 3
          begin
            ServMet.Read(eDonkeyMetaTag3, SizeOf(eDonkeyMetaTag3));
            if eDonkeyMetaTagHeader.NameValue = 'Preference' then
            begin
              ShowMessage(eDonkeyMetaTagHeader.NameValue + ': ' + TeDonkeyPreference[eDonkeyMetaTag3.Value]);
            end else
            begin
              ShowMessage(eDonkeyMetaTagHeader.NameValue + ': ' + IntToStr(eDonkeyMetaTag3.Value));
            end;
          end;
        end;
      end;
      // EOF, if there's not a tail (28 unhandled bytes)
    finally
      ServMet.Free;
    end;
  end;
end;


Für die AboutBox (á la Internet Explorer): "Teile dieser Software basieren teilweise auf der Arbeit von yeahware software development"

Viel Spaß damit,
Markus
Xelos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Do 31.10.02 15:00 
Vielen vielen Dank DaFox :oops:
Ich sehe es als keinesfalls selbstverständlich an, so eine Hilfe bekommen zu haben.
Das was du da ausgearbeitet hast ist echt enorm und hat dich sicherlich viel Zeit gekostet.
Schlichtweg bin ich einfach baff, das es noch solche Leute wie dich gibt, die einem richtig weiterhelfen.

Ich kann nur nochmal sagen: Vielen DANK :))

Gruss
Xelos
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Do 31.10.02 22:14 
Gerne geschehen. :)