]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blob - src/dialogs/RequestsDialog.cpp
2ed1ba43036c097b2a3b35f6c7a53fec925676a8
[PrivacyBrowserPC.git] / src / dialogs / RequestsDialog.cpp
1 /*
2  * Copyright 2024 Soren Stoutner <soren@stoutner.com>.
3  *
4  * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc/>.
5  *
6  * Privacy Browser PC is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Privacy Browser PC is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Privacy Browser PC.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 // Application headers.
21 #include "RequestsDialog.h"
22 #include "GlobalVariables.h"
23 #include "RequestDetailDialog.h"
24 #include "ui_RequestsDialog.h"
25
26 // Qt toolkit headers.
27 #include <QDebug>
28
29 // KDE Frameworks headers.
30 #include <KColorScheme>
31
32 // Construct the class.
33 RequestsDialog::RequestsDialog(QWidget *parentWidgetPointer, QList<RequestStruct *> *requestsListPointer) : QDialog(parentWidgetPointer)
34 {
35     // Set the window title.
36     setWindowTitle(i18nc("The requests dialog window title", "Requests"));
37
38     // Set the window modality.
39     setWindowModality(Qt::WindowModality::ApplicationModal);
40
41     // Instantiate the requests dialog UI.
42     Ui::RequestsDialog requestsDialogUi;
43
44     // Setup the UI.
45     requestsDialogUi.setupUi(this);
46
47     // Get handles for the views.
48     tableWidgetPointer = requestsDialogUi.tableWidget;
49     QDialogButtonBox *dialogButtonBoxPointer = requestsDialogUi.dialogButtonBox;
50
51     // Create the columns.
52     tableWidgetPointer->setColumnCount(5);
53
54     // Create the table headers.
55     QTableWidgetItem *dispositionHeaderItemPointer = new QTableWidgetItem(i18nc("Request disposition header", "Disposition"));
56     QTableWidgetItem *requestMethodHeaderItemPointer = new QTableWidgetItem(i18nc("Request method header", "Request Method"));
57     QTableWidgetItem *navigationTypeHeaderItemPointer = new QTableWidgetItem(i18nc("Navigation type header", "Navigation Type"));
58     QTableWidgetItem *resourceTypeHeaderItemPointer = new QTableWidgetItem(i18nc("Resource type header", "Resource Type"));
59     QTableWidgetItem *requestUrlHeaderItemPointer = new QTableWidgetItem(i18nc("Request URL header", "Request URL"));
60
61     // Set the horizontal headers.
62     tableWidgetPointer->setHorizontalHeaderItem(0, dispositionHeaderItemPointer);
63     tableWidgetPointer->setHorizontalHeaderItem(1, requestMethodHeaderItemPointer);
64     tableWidgetPointer->setHorizontalHeaderItem(2, navigationTypeHeaderItemPointer);
65     tableWidgetPointer->setHorizontalHeaderItem(3, resourceTypeHeaderItemPointer);
66     tableWidgetPointer->setHorizontalHeaderItem(4, requestUrlHeaderItemPointer);
67
68     // Create the palette.
69     QPalette negativePalette = QPalette();
70     QPalette positivePalette = QPalette();
71
72     // Adjust the background colors of the palettes.
73     KColorScheme::adjustBackground(negativePalette, KColorScheme::NegativeBackground);
74     KColorScheme::adjustBackground(positivePalette, KColorScheme::PositiveBackground);
75
76     // Prepare the background brushes.
77     QBrush negativeBackgroundBrush = negativePalette.base();
78     QBrush positiveBackgroundBrush = positivePalette.base();
79
80     // Initialize the row counter.
81     int rowCounter = 0;
82
83     for (RequestStruct *requestStructPointer : *requestsListPointer)
84     {
85         // Add a new row.
86         tableWidgetPointer->insertRow(rowCounter);
87
88         // Create the entry items.
89         QTableWidgetItem *dispositionItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getDispositionString(requestStructPointer->dispositionInt));
90         QTableWidgetItem *requestMethodItemPointer = new QTableWidgetItem(requestStructPointer->requestMethodString);
91         QTableWidgetItem *navigationTypeItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getNavigationTypeString(requestStructPointer->navigationTypeInt));
92         QTableWidgetItem *resourceTypeItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getResourceTypeString(requestStructPointer->resourceTypeInt));
93         QTableWidgetItem *requestUrlItemPointer = new QTableWidgetItem(requestStructPointer->urlString);
94
95         // Create a request struct byte array.
96         QByteArray *requestStructByteArrayPointer = new QByteArray();
97
98         // Create a request struct data stream.
99         QDataStream requestStructDataStream(requestStructByteArrayPointer, QIODevice::WriteOnly);
100
101         // Populate the request struct data stream.
102         requestStructDataStream << requestStructPointer->dispositionInt;
103         requestStructDataStream << requestStructPointer->entryStruct.originalEntry;
104         requestStructDataStream << requestStructPointer->entryStruct.originalFilterOptions;
105         requestStructDataStream << requestStructPointer->entryStruct.appliedEntryList;
106         requestStructDataStream << requestStructPointer->entryStruct.appliedFilterOptionsList;
107         requestStructDataStream << requestStructPointer->entryStruct.domainList;
108         requestStructDataStream << requestStructPointer->entryStruct.finalMatch;
109         requestStructDataStream << requestStructPointer->entryStruct.hasRequestOptions;
110         requestStructDataStream << requestStructPointer->entryStruct.initialMatch;
111         requestStructDataStream << requestStructPointer->entryStruct.domain;
112         requestStructDataStream << requestStructPointer->entryStruct.font;
113         requestStructDataStream << requestStructPointer->entryStruct.image;
114         requestStructDataStream << requestStructPointer->entryStruct.mainFrame;
115         requestStructDataStream << requestStructPointer->entryStruct.media;
116         requestStructDataStream << requestStructPointer->entryStruct.object;
117         requestStructDataStream << requestStructPointer->entryStruct.other;
118         requestStructDataStream << requestStructPointer->entryStruct.ping;
119         requestStructDataStream << requestStructPointer->entryStruct.script;
120         requestStructDataStream << requestStructPointer->entryStruct.styleSheet;
121         requestStructDataStream << requestStructPointer->entryStruct.subFrame;
122         requestStructDataStream << requestStructPointer->entryStruct.thirdParty;
123         requestStructDataStream << requestStructPointer->entryStruct.xmlHttpRequest;
124         requestStructDataStream << requestStructPointer->filterListTitle;
125         requestStructDataStream << requestStructPointer->isThirdPartyRequest;
126         requestStructDataStream << requestStructPointer->matchedUrlType;
127         requestStructDataStream << requestStructPointer->navigationTypeInt;
128         requestStructDataStream << requestStructPointer->requestMethodString;
129         requestStructDataStream << requestStructPointer->resourceTypeInt;
130         requestStructDataStream << requestStructPointer->sublistInt;
131         requestStructDataStream << requestStructPointer->truncatedUrlString;
132         requestStructDataStream << requestStructPointer->truncatedUrlStringWithSeparators;
133         requestStructDataStream << requestStructPointer->urlString;
134         requestStructDataStream << requestStructPointer->urlStringWithSeparators;
135         requestStructDataStream << requestStructPointer->webPageUrlString;
136
137         // Add the request struct to the disposition item.
138         dispositionItemPointer->setData(Qt::UserRole, *requestStructByteArrayPointer);
139
140         // Colorize the background according to the disposition.
141         if (requestStructPointer->dispositionInt == FilterListHelper::BLOCKED)  // The request was blocked.
142         {
143             // Set the background to be red.
144             dispositionItemPointer->setBackground(negativeBackgroundBrush);
145             requestMethodItemPointer->setBackground(negativeBackgroundBrush);
146             navigationTypeItemPointer->setBackground(negativeBackgroundBrush);
147             resourceTypeItemPointer->setBackground(negativeBackgroundBrush);
148             requestUrlItemPointer->setBackground(negativeBackgroundBrush);
149         }
150         else if (requestStructPointer->dispositionInt == FilterListHelper::ALLOWED)  // The request was allowed.
151         {
152             // Set the background to be green.
153             dispositionItemPointer->setBackground(positiveBackgroundBrush);
154             requestMethodItemPointer->setBackground(positiveBackgroundBrush);
155             navigationTypeItemPointer->setBackground(positiveBackgroundBrush);
156             resourceTypeItemPointer->setBackground(positiveBackgroundBrush);
157             requestUrlItemPointer->setBackground(positiveBackgroundBrush);
158         }
159
160         // Add the entries to the table.
161         tableWidgetPointer->setItem(rowCounter, 0, dispositionItemPointer);
162         tableWidgetPointer->setItem(rowCounter, 1, requestMethodItemPointer);
163         tableWidgetPointer->setItem(rowCounter, 2, navigationTypeItemPointer);
164         tableWidgetPointer->setItem(rowCounter, 3, resourceTypeItemPointer);
165         tableWidgetPointer->setItem(rowCounter, 4, requestUrlItemPointer);
166
167         // Increment the row counter.
168         ++rowCounter;
169     }
170
171     // Select an entire row at a time.
172     tableWidgetPointer->setSelectionBehavior(QAbstractItemView::SelectRows);
173
174     // Get the table header view.
175     QHeaderView *headerViewPointer = tableWidgetPointer->horizontalHeader();
176
177     // Resize the header to fit the contents.
178     headerViewPointer->resizeSections(QHeaderView::ResizeToContents);
179
180     // Connect changes in the sort order.
181     connect(headerViewPointer, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(sortTable(int, Qt::SortOrder)));
182
183     // Connect the buttons.
184     connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(close()));
185
186     // Open the request detail dialog when a cell is clicked.
187     connect(tableWidgetPointer, SIGNAL(cellClicked(int, int)), this, SLOT(showRequestDetailDialog(int)));
188 }
189
190 void RequestsDialog::showRequestDetailDialog(int row)
191 {
192     // Instantiate the request details dialog.
193     RequestDetailDialog *requestDetailDialogPointer = new RequestDetailDialog(this, tableWidgetPointer, row);
194
195     // Show the dialog.
196     requestDetailDialogPointer->show();
197 }
198
199 void RequestsDialog::sortTable(int column, Qt::SortOrder sortOrder) const
200 {
201     // Sort the table.
202     tableWidgetPointer->sortItems(column, sortOrder);
203 }