Skip to content

Commit

Permalink
[iptux-src#140] fix crash on TransWindow::TerminateTransTask.
Browse files Browse the repository at this point in the history
  • Loading branch information
lidaobing committed Feb 9, 2018
1 parent 698aec3 commit c75e13d
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 19 deletions.
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* [#119] check the return code of `setsockopt`.
* [#?] switch to GTK+3, and use `GtkApplication`.
* [#125] fix crash on UdpData::SomeoneSendmsg.
* [#140] fix crash on TransWindow::TerminateTransTask.
* [#132] fix file accepted when cancel the directory chooser dialog.

### refactor
Expand Down
12 changes: 7 additions & 5 deletions src/iptux/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -752,22 +752,24 @@ GtkTreeModel *MainWindow::CreatePallistModel() {
/**
* 文件传输树(trans-tree)底层数据结构.
* 14,0 status,1 task,2 peer,3 ip,4 filename,5 filelength,6 finishlength,7
* progress, 8 pro-text,9 cost,10 remain,11 rate,12,pathname,13 data,14 para \n
* progress, 8 pro-text,9 cost,10 remain,11 rate,12,pathname,13 data,14 para, 15 finished
*
* 任务状态;任务类型;任务对端;文件名(如果当前是文件夹,该项指正在传输的文件夹内单个文件,
* 整个文件夹传输完成后,该项指向当前是文件夹);文件长度;完成长度;完成进度;
* 进度串;已花费时间;任务剩余时间;传输速度;带路径文件名(不显示);文件传输类;参数指针值
* \n
*
* @return trans-model
*/
GtkTreeModel *MainWindow::CreateTransModel() {
GtkListStore *model;

model = gtk_list_store_new(15, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
model = gtk_list_store_new(16,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER);

G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER,
G_TYPE_BOOLEAN);
return GTK_TREE_MODEL(model);
}

Expand Down
4 changes: 2 additions & 2 deletions src/iptux/RecvFileData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ void RecvFileData::UpdateUIParaToOver() {
.setRate("");
file->finishedsize = file->filesize;
}
para.setData(nullptr);
para.finish();
}

} // namespace iptux
} // namespace iptux
2 changes: 1 addition & 1 deletion src/iptux/SendFileData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ void SendFileData::UpdateUIParaToOver() {
.setRemain("")
.setRate("");
}
para.setData(nullptr);
para.finish();
}

} // namespace iptux
20 changes: 19 additions & 1 deletion src/iptux/TransFileModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
#include <glib.h>

namespace iptux {

TransFileModel::TransFileModel()
: fileLength(0),
finishedLength(0),
finished(false),
data(nullptr) {
}

TransFileModel& TransFileModel::setStatus(const std::string& value) {
status = value;
return *this;
Expand Down Expand Up @@ -60,10 +68,16 @@ TransFileModel& TransFileModel::setFilePath(const std::string& value) {
}

TransFileModel& TransFileModel::setData(TransAbstract* value) {
g_assert_nonnull(value);
data = value;
return *this;
}

void TransFileModel::finish() {
finished = true;
data = nullptr;
}

const std::string& TransFileModel::getStatus() const {
return status;
}
Expand Down Expand Up @@ -133,4 +147,8 @@ int64_t TransFileModel::getFileLength() const {
return fileLength;
}

}
bool TransFileModel::isFinished() const {
return finished;
}

}
11 changes: 11 additions & 0 deletions src/iptux/TransFileModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ class TransAbstract;

class TransFileModel {
public:
TransFileModel();

TransFileModel &setStatus(const std::string &value);
TransFileModel &setTask(const std::string &value);
TransFileModel &setPeer(const std::string &value);
Expand All @@ -20,7 +22,14 @@ class TransFileModel {
TransFileModel &setRemain(const std::string &value);
TransFileModel &setRate(const std::string &value);
TransFileModel &setFilePath(const std::string &value);

/**
*
* @param value not null
* @return
*/
TransFileModel &setData(TransAbstract *value);
void finish();

const std::string &getStatus() const;
const std::string &getTask() const;
Expand All @@ -37,6 +46,7 @@ class TransFileModel {
const std::string &getRate() const;
const std::string &getFilePath() const;
TransAbstract *getData() const;
bool isFinished() const;
private:
std::string status;
std::string task;
Expand All @@ -49,6 +59,7 @@ class TransFileModel {
std::string remain;
std::string rate;
std::string filePath;
bool finished;
TransAbstract *data;
};

Expand Down
32 changes: 22 additions & 10 deletions src/iptux/TransWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "iptux/deplib.h"
#include "iptux/TransAbstract.h"
#include "iptux/UiUtils.h"
#include "output.h"

#define IPTUX_PRIVATE "iptux-private"

Expand Down Expand Up @@ -314,13 +315,26 @@ static void TerminateTransTask(GtkTreeModel *model) {
GtkTreePath *path;
GtkTreeIter iter;
TransAbstract *trans;
gboolean finished;

if (!(path = (GtkTreePath *)(g_object_get_data(G_OBJECT(model),
"selected-path"))))
return;
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_model_get(model, &iter, 12, &trans, -1);
if (trans) trans->TerminateTrans();
gtk_tree_model_get(model, &iter,
13, &trans,
15, &finished,
-1);
if(finished) {
return;
}

if(!trans) {
LOG_WARN("task not finished but trans is not null");
return;
}

trans->TerminateTrans();
}


Expand Down Expand Up @@ -369,35 +383,33 @@ GtkWidget *CreateTransPopupMenu(GtkTreeModel *model) {

GtkTreePath *path;
GtkTreeIter iter;
gchar *remaining;
gboolean sensitive = TRUE;
bool finished;

if (!(path = (GtkTreePath *)(g_object_get_data(G_OBJECT(model),
"selected-path"))))
return NULL;
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_model_get(model, &iter, 10, &remaining, -1);

if (g_strcmp0(remaining, "")) sensitive = FALSE;
gtk_tree_model_get(model, &iter, 15, &finished, -1);

menu = gtk_menu_new();

menuitem = gtk_menu_item_new_with_label(_("Open This File"));
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
g_signal_connect_swapped(menuitem, "activate", G_CALLBACK(OpenThisFile),
model);
gtk_widget_set_sensitive(GTK_WIDGET(menuitem), sensitive);
gtk_widget_set_sensitive(GTK_WIDGET(menuitem), finished);

menuitem = gtk_menu_item_new_with_label(_("Open Containing Folder"));
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
g_signal_connect_swapped(menuitem, "activate",
G_CALLBACK(OpenContainingFolder), model);
gtk_widget_set_sensitive(GTK_WIDGET(menuitem), sensitive);
gtk_widget_set_sensitive(GTK_WIDGET(menuitem), finished);

menuitem = gtk_menu_item_new_with_label(_("Terminate Task"));
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
g_signal_connect_swapped(menuitem, "activate", G_CALLBACK(TerminateTransTask),
model);
gtk_widget_set_sensitive(GTK_WIDGET(menuitem), !finished);

menuitem = gtk_menu_item_new_with_label(_("Terminate All"));
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
Expand Down Expand Up @@ -475,4 +487,4 @@ TransWindowPrivate &getPriv(TransWindow *window) {
return *((TransWindowPrivate*)g_object_get_data(G_OBJECT(window), IPTUX_PRIVATE));
}

}
}
1 change: 1 addition & 0 deletions src/iptux/UiUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ void UiUtils::applyTransFileModel2GtkListStore(
11, para.getRate().c_str(),
12, para.getFilePath().c_str(),
13, para.getData(),
15, para.isFinished(),
-1);
}
}

0 comments on commit c75e13d

Please sign in to comment.