src/ldproject.cpp

branch
projects
changeset 937
d5a58674ccd1
parent 936
aee883858c90
child 938
cc8920320184
equal deleted inserted replaced
936:aee883858c90 937:d5a58674ccd1
29 if (!fp) 29 if (!fp)
30 return LDProjectPtr(); 30 return LDProjectPtr();
31 31
32 archive* arc = archive_read_new(); 32 archive* arc = archive_read_new();
33 archive_read_support_filter_all (arc); 33 archive_read_support_filter_all (arc);
34 archive_read_support_format_all (arc); 34 archive_read_support_format_zip (arc);
35 // archive_read_support_format_zip (arc);
36 archive_entry* arcent;
37 int result = archive_read_open_filename (arc, filename.toLocal8Bit().constData(), 0x4000); 35 int result = archive_read_open_filename (arc, filename.toLocal8Bit().constData(), 0x4000);
38 36
39 if (result != ARCHIVE_OK) 37 if (result != ARCHIVE_OK)
40 { 38 {
41 fprint (fp, "unable to open argh.pk3 (%1)\n", archive_error_string (arc)); 39 fprint (fp, "unable to open argh.pk3 (%1)\n", archive_error_string (arc));
42 return LDProjectPtr(); 40 return LDProjectPtr();
43 } 41 }
44 42
45 while (archive_read_next_header(arc, &arcent) == ARCHIVE_OK) 43 for (archive_entry* arcent; archive_read_next_header(arc, &arcent) == ARCHIVE_OK;)
46 { 44 {
47 QString pathname = archive_entry_pathname (arcent); 45 QString pathname = archive_entry_pathname (arcent);
48 char buffer[1024]; 46 QVector<char> buffer;
49 int size = archive_read_data(arc, buffer, sizeof buffer); 47 buffer.resize (archive_entry_size (arcent));
48 int size = archive_read_data(arc, buffer.data(), buffer.size());
50 49
51 if (size < 0) 50 if (size >= 0)
52 fprint (fp, "Error reading entry %1: %2", pathname, archive_error_string (arc)); 51 {
52 if (pathname.startsWith ("dat/"))
53 loadBinaryDocument (pathname.right (4), QByteArray (buffer.constData(), buffer.size()));
54 }
53 else 55 else
54 fprint (fp, "%1 contains: %2 (%3 bytes)\n", pathname, static_cast<const char*>(buffer), size); 56 fprint (fp, "Unable to read %1: %2", pathname, archive_error_string (arc));
55 } 57 }
56 58
57 if ((result = archive_read_free(arc)) != ARCHIVE_OK) 59 if ((result = archive_read_free(arc)) != ARCHIVE_OK)
58 { 60 {
59 fprint (fp, "unable to close argh.pk3\n"); 61 fprint (fp, "unable to close argh.pk3\n");
60 return LDProjectPtr(); 62 return LDProjectPtr();
61 } 63 }
62 64
63 return LDProjectPtr(); 65 return LDProjectPtr();
66 }
67
68 #include "ldDocument.h"
69 void LDProject::loadBinaryDocument(const QString &name, const QByteArray &data)
70 {
71 QDataStream ds (&data, QIODevice::ReadOnly);
72 ds.setVersion (QDataStream::Qt_4_8);
73 enum { CurrentVersion = 0 };
74
75 quint16 version;
76 ds << version;
77
78 if (version > CurrentVersion)
79 return; // too new
80
81 qint8 header;
82 quint32 color;
83 LDDocumentPtr doc = LDDocument::createNew();
84 LDObjectPtr obj;
85 struct XYZ { double x, y, z; Vertex toVertex() const { return Vertex (x,y,z); }};
86 XYZ verts[4];
87
88 while ((ds << header) != -1)
89 {
90 switch (header)
91 {
92 case 0:
93 {
94 QString message;
95 ds >> message;
96 doc->addObject (LDSpawn<LDComment> (message));
97 }
98 break;
99
100 case 2:
101 obj = LDSpawn<LDLine>();
102 goto polyobject;
103
104 case 3:
105 obj = LDSpawn<LDTriangle>();
106 goto polyobject;
107
108 case 4:
109 obj = LDSpawn<LDQuad>();
110 goto polyobject;
111
112 case 5:
113 obj = LDSpawn<LDCondLine>();
114 polyobject:
115 ds >> color;
116 for (int i = 0; i < obj->numVertices(); ++i)
117 {
118 XYZ v;
119 ds >> v.x >> v.y >> v.z;
120 obj->setVertex (i, Vertex (v.x, v.y, v.z));
121 }
122
123 doc->addObject (obj);
124 break;
125 }
126 }
127
64 } 128 }
65 129
66 LDProjectPtr LDProject::NewProject() 130 LDProjectPtr LDProject::NewProject()
67 { 131 {
68 return LDProjectPtr (new LDProject()); 132 return LDProjectPtr (new LDProject());

mercurial