~grubng-dev/grubng/tools-arcexplorer

« back to all changes in this revision

Viewing changes to ArcExplorer.cpp

  • Committer: thindil
  • Date: 2009-09-30 07:13:48 UTC
  • Revision ID: thindil2@gmail.com-20090930071348-w4sroquzquwxp3h1
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//---------------------------------------------------------------------------
 
2
//
 
3
// Name:        ArcExplorer.cpp
 
4
// Author:      
 
5
// Created:     12/06/2008 11:48:50
 
6
// Description: ArcExplorer class implementation
 
7
//
 
8
//---------------------------------------------------------------------------
 
9
 
 
10
#include "ArcExplorer.h"
 
11
 
 
12
////Header Include Start
 
13
////Header Include End
 
14
 
 
15
//----------------------------------------------------------------------------
 
16
// ArcExplorer
 
17
//----------------------------------------------------------------------------
 
18
//Add Custom Events only in the appropriate block.
 
19
////Event Table Start
 
20
BEGIN_EVENT_TABLE(ArcExplorer,wxFrame)
 
21
        ////Manual Code Start
 
22
        ////Manual Code End
 
23
        
 
24
        EVT_CLOSE(ArcExplorer::OnClose)
 
25
        EVT_MENU(ID_MNU_OPEN_1007, ArcExplorer::MnuOpen_Click)
 
26
        EVT_MENU(ID_MNU_EXIT_1008, ArcExplorer::MnuExit_Click)
 
27
        EVT_MENU(ID_MNU_CONTENT_1014, ArcExplorer::MnuContent_Click)
 
28
        EVT_MENU(ID_MNU_WITHHEADERS_1012, ArcExplorer::MnuWithheaders_Click)
 
29
        EVT_MENU(ID_MNU_FULLENTRY_1011, ArcExplorer::MnuFullentry_Click)
 
30
        EVT_LISTBOX(ID_WXLISTBOX1,ArcExplorer::WxListBox1Selected)
 
31
END_EVENT_TABLE()
 
32
////Event Table End
 
33
 
 
34
ArcExplorer::ArcExplorer(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
 
35
: wxFrame(parent, id, title, position, size, style)
 
36
{
 
37
        CreateGUIControls();
 
38
}
 
39
 
 
40
ArcExplorer::~ArcExplorer()
 
41
{
 
42
}
 
43
 
 
44
void ArcExplorer::CreateGUIControls()
 
45
{
 
46
        #define wxALL (wxEXPAND | wxALL)
 
47
        ////GUI Items Creation Start
 
48
 
 
49
        WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
 
50
        this->SetSizer(WxBoxSizer1);
 
51
        this->SetAutoLayout(true);
 
52
 
 
53
        WxBoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
 
54
        WxBoxSizer1->Add(WxBoxSizer2, 1, wxALIGN_CENTER | wxALL, 5);
 
55
 
 
56
        wxArrayString arrayStringFor_WxListBox1;
 
57
        WxListBox1 = new wxListBox(this, ID_WXLISTBOX1, wxPoint(5,5), wxSize(200,110), arrayStringFor_WxListBox1, wxLB_SINGLE);
 
58
        WxBoxSizer2->Add(WxListBox1,1,wxALIGN_CENTER | wxALL,5);
 
59
 
 
60
        WxMemo1 = new wxTextCtrl(this, ID_WXMEMO1, wxT(""), wxPoint(215,5), wxSize(200,110), wxTE_MULTILINE, wxDefaultValidator, wxT("WxMemo1"));
 
61
        WxMemo1->SetMaxLength(0);
 
62
        WxMemo1->SetFocus();
 
63
        WxMemo1->SetInsertionPointEnd();
 
64
        WxBoxSizer2->Add(WxMemo1,1,wxALIGN_CENTER | wxALL,5);
 
65
 
 
66
        WxHtmlWindow1 = new wxHtmlWindow(this, ID_WXHTMLWINDOW1, wxPoint(15,135), wxSize(400,164));
 
67
        WxBoxSizer1->Add(WxHtmlWindow1,2,wxALIGN_CENTER | wxALL,5);
 
68
 
 
69
        WxOpenFileDialog1 =  new wxFileDialog(this, wxT("Choose a file"), wxT(""), wxT(""), wxT("*.arc"), wxOPEN);
 
70
 
 
71
        WxMenuBar1 = new wxMenuBar();
 
72
        wxMenu *ID_MNU_FILE_1006_Mnu_Obj = new wxMenu(0);
 
73
        ID_MNU_FILE_1006_Mnu_Obj->Append(ID_MNU_OPEN_1007, wxT("&Open"), wxT(""), wxITEM_NORMAL);
 
74
        ID_MNU_FILE_1006_Mnu_Obj->Append(ID_MNU_EXIT_1008, wxT("E&xit"), wxT(""), wxITEM_NORMAL);
 
75
        WxMenuBar1->Append(ID_MNU_FILE_1006_Mnu_Obj, wxT("&File"));
 
76
        
 
77
        wxMenu *ID_MNU_EXPORT_1009_Mnu_Obj = new wxMenu(0);
 
78
        ID_MNU_EXPORT_1009_Mnu_Obj->Append(ID_MNU_CONTENT_1014, wxT("&Content"), wxT(""), wxITEM_NORMAL);
 
79
        ID_MNU_EXPORT_1009_Mnu_Obj->Append(ID_MNU_WITHHEADERS_1012, wxT("With &headers"), wxT(""), wxITEM_NORMAL);
 
80
        ID_MNU_EXPORT_1009_Mnu_Obj->Append(ID_MNU_FULLENTRY_1011, wxT("&Full entry"), wxT(""), wxITEM_NORMAL);
 
81
        WxMenuBar1->Append(ID_MNU_EXPORT_1009_Mnu_Obj, wxT("&Export"));
 
82
        SetMenuBar(WxMenuBar1);
 
83
 
 
84
        SetTitle(wxT("ArcExplorer"));
 
85
        SetIcon(wxNullIcon);
 
86
        
 
87
        GetSizer()->Fit(this);
 
88
        GetSizer()->SetSizeHints(this);
 
89
        Center();
 
90
        
 
91
        ////GUI Items Creation End
 
92
        #undef wxALL
 
93
}
 
94
 
 
95
void ArcExplorer::OnClose(wxCloseEvent& event)
 
96
{
 
97
        Destroy();
 
98
}
 
99
 
 
100
/*
 
101
 * MnuExit_Click
 
102
 */
 
103
void ArcExplorer::MnuExit_Click(wxCommandEvent& event)
 
104
{
 
105
        Destroy();
 
106
}
 
107
 
 
108
/*
 
109
 * MnuOpen_Click
 
110
 */
 
111
void ArcExplorer::MnuOpen_Click(wxCommandEvent& event)
 
112
{
 
113
        if (WxOpenFileDialog1->ShowModal()== wxID_OK) {
 
114
        LoadArc( WxOpenFileDialog1->GetPath() ); 
 
115
    }
 
116
}
 
117
 
 
118
void ArcExplorer::LoadArc(const wxString& Filename) {
 
119
    char Buffer[4096];
 
120
    off_t len;
 
121
    off_t Offset;
 
122
    int a;
 
123
    int i=1;
 
124
    char* URL;
 
125
    
 
126
    this->Filename = Filename;
 
127
    FILE* File = fopen(Filename.c_str(), "rb");
 
128
    if (!File) {
 
129
        wxMessageDialog Message(this, "Couldn't load " + Filename, "Error loading ARC", wxOK, wxDefaultPosition);
 
130
        Message.ShowModal();
 
131
        return;
 
132
    }
 
133
    fgets(Buffer, sizeof(Buffer), File);
 
134
    strtok(Buffer, " "); //filedesc://dummy.arc.gz
 
135
    strtok(NULL, " "); //0.0.0.0
 
136
    strtok(NULL, " "); //20071005122244
 
137
    strtok(NULL, " "); //text/plain
 
138
    len = atol(strtok(NULL, " ")); //69
 
139
 
 
140
    while (!feof(File)) {
 
141
        //Skip description / content
 
142
        if ( fseek(File, len, SEEK_CUR) ) {
 
143
            wxMessageDialog Message(this, Filename + "ends unexpectedly", "Error loading ARC", wxOK, wxDefaultPosition);
 
144
            Message.ShowModal();
 
145
            break;
 
146
        }
 
147
 
 
148
        a = getc(File);
 
149
        if (a != '\n') {
 
150
            wxMessageDialog Message(this, "Malformed format on " + Filename + wxString::Format(" at offset %lu", ftell(File)), "Error loading ARC", wxOK, wxDefaultPosition);
 
151
            Message.ShowModal();
 
152
            break;
 
153
        }
 
154
 
 
155
        Offset = ftell(File);
 
156
 
 
157
        //Entry header
 
158
        if (!fgets(Buffer, sizeof(Buffer), File)) break;
 
159
        URL = strtok(Buffer, " "); //URL
 
160
        strtok(NULL, " "); //IP
 
161
        strtok(NULL, " "); //Time
 
162
        strtok(NULL, " "); //MIME
 
163
        len = atol(strtok(NULL, " ")); //length
 
164
        
 
165
        wxString Name;
 
166
        Name.Printf("%3d-%s", i++, URL);
 
167
        WxListBox1->Append(Name, (void*) Offset ); /*void* owned by the user, wxClientData* owned (and freed) by the control*/
 
168
    }
 
169
    fclose(File);
 
170
}
 
171
 
 
172
/*
 
173
 * WxListBox1Selected
 
174
 */
 
175
void ArcExplorer::WxListBox1Selected(wxCommandEvent& event)
 
176
{
 
177
    char Buffer[4096];
 
178
    wxString Text;
 
179
        off_t len;
 
180
        
 
181
        int index = WxListBox1->GetSelection();
 
182
        if ( wxNOT_FOUND == index ) {
 
183
        wxMessageDialog Message(this, "There's no item selected", "Error", wxOK, wxDefaultPosition);
 
184
        Message.ShowModal();
 
185
        return;
 
186
    }
 
187
        
 
188
        void* ClientData = WxListBox1->GetClientData(index);
 
189
    if (!ClientData) {        
 
190
            wxMessageDialog Message(this, "There's no client data", "Error", wxOK, wxDefaultPosition);
 
191
            Message.ShowModal();
 
192
            return;
 
193
    }
 
194
        
 
195
    FILE* File = fopen(Filename.c_str(), "rb");
 
196
    if (!File) {
 
197
        wxMessageDialog Message(this, "Couldn't open " + Filename, "Error opening ARC", wxOK, wxDefaultPosition);
 
198
        Message.ShowModal();
 
199
        return;
 
200
    }
 
201
    
 
202
    
 
203
        fseek(File, (off_t)ClientData, SEEK_SET);
 
204
        if (!fgets(Buffer, sizeof(Buffer), File)) {
 
205
        wxMessageDialog Message(this, "Error reading the entry", "Error reading ARC", wxOK, wxDefaultPosition);
 
206
        Message.ShowModal();
 
207
        fclose(File);
 
208
        return;
 
209
    }
 
210
 
 
211
        Text = "URL: ";
 
212
    Text += strtok(Buffer, " "); //URL
 
213
    
 
214
    Text += "\nIP: ";
 
215
    Text += strtok(NULL, " "); //IP
 
216
    
 
217
    Text += "\nDate: ";
 
218
    Text += strtok(NULL, " "); //Time
 
219
    
 
220
    Text += "\nMIME: ";
 
221
    Text += strtok(NULL, " "); //MIME
 
222
    
 
223
    len = atol(strtok(NULL, " ")); //length
 
224
    Text += "\nLength: ";
 
225
    Text += wxString::Format("%lu\n", len);
 
226
    
 
227
    WxMemo1->SetValue(Text);
 
228
    
 
229
    Text.Empty();
 
230
    while (len > 0) {
 
231
        int i = len < (signed)sizeof(Buffer) ? len : sizeof(Buffer);
 
232
        int j = fread(Buffer, 1, i, File);
 
233
        
 
234
        if (j != i) {
 
235
            wxMessageDialog Message(this, "Error reading the entry" + Filename, "Error reading ARC", wxOK, wxDefaultPosition);
 
236
            Message.ShowModal();
 
237
            break;
 
238
        }
 
239
        
 
240
        len -= j;
 
241
        Text.append(Buffer, j);
 
242
    }
 
243
    fclose(File);
 
244
    WxMemo1->AppendText("\n\n\n");
 
245
    WxMemo1->AppendText(Text);    
 
246
    WxMemo1->ShowPosition(0);
 
247
    
 
248
    int Position = Text.Find("\r\n\r\n");
 
249
    if (Position != wxNOT_FOUND) {
 
250
        WxHtmlWindow1->SetPage(Text.Right(Text.Len() - Position) );
 
251
    } else {
 
252
        WxHtmlWindow1->SetPage(Text);
 
253
    }
 
254
}
 
255
 
 
256
/*
 
257
 * MnuFullentry_Click
 
258
 */
 
259
void ArcExplorer::MnuFullentry_Click(wxCommandEvent& event)
 
260
{
 
261
        wxMessageDialog Message(this, "Unimplemented");
 
262
    Message.ShowModal(); 
 
263
}
 
264
 
 
265
/*
 
266
 * MnuWithheaders_Click
 
267
 */
 
268
void ArcExplorer::MnuWithheaders_Click(wxCommandEvent& event)
 
269
{
 
270
        wxMessageDialog Message(this, "Unimplemented");
 
271
    Message.ShowModal();
 
272
}
 
273
 
 
274
/*
 
275
 * MnuContent_Click
 
276
 */
 
277
void ArcExplorer::MnuContent_Click(wxCommandEvent& event)
 
278
{
 
279
        wxMessageDialog Message(this, "Unimplemented");
 
280
    Message.ShowModal();
 
281
}