|
// =====================================================================================
|
|
//
|
|
// Filename: FileUploadItem.C
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Version: 1.0
|
|
// Created: 2010年07月19日 17时06分53秒
|
|
// Revision: none
|
|
// Compiler: g++
|
|
//
|
|
// Author: 宋志民 (Song Zhi-Min), cszhmsong@gmail.com
|
|
// Company: 希科系统开发小组(CxServer Development Team)
|
|
//
|
|
// =====================================================================================
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#ifndef WIN32
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#include <WCssDecorationStyle>
|
|
#include <WApplication>
|
|
#include <WLogger>
|
|
|
|
#include "FileUploadItem.h"
|
|
#include "../utils/ComUtil.h"
|
|
|
|
FileUploadItem::FileUploadItem(FilesUpload *container, WContainerWidget *parent)
|
|
: container_(container),
|
|
upload_(),
|
|
cancel_(),
|
|
uploaded_(),
|
|
remove_(),
|
|
error_(),
|
|
uploadFailed_(false),
|
|
WContainerWidget(parent) {
|
|
|
|
upload_ = new WFileUpload(this);
|
|
upload_->setFileTextSize(40);
|
|
upload_->decorationStyle().font().setSize(WFont::XSmall);
|
|
|
|
cancel_ = new Option("b_upload_item_cancel", this);
|
|
cancel_->setMargin(5, Left);
|
|
cancel_->item()->clicked().connect(SLOT(this, WWidget::hide));
|
|
cancel_->item()->clicked().connect(SLOT(this, FileUploadItem::cancel));
|
|
|
|
uploaded_ = new Text("", "main", this);
|
|
uploaded_->hide();
|
|
|
|
// remove after spooling
|
|
remove_ = new Option("b_upload_item_remove", this);
|
|
remove_->setMargin(5, Left);
|
|
remove_->item()->clicked().connect(SLOT(this, WWidget::hide));
|
|
remove_->item()->clicked().connect(SLOT(this, FileUploadItem::remove));
|
|
remove_->hide();
|
|
|
|
error_ = new Text("", "error", this);
|
|
error_->setMargin(WLength(5), Left);
|
|
|
|
upload_->changed().connect(SLOT(upload_, WFileUpload::upload));
|
|
upload_->changed().connect(SLOT(this, FileUploadItem::hideCancel));
|
|
upload_->uploaded().connect(SLOT(this, FileUploadItem::uploaded));
|
|
upload_->fileTooLarge().connect(SLOT(this, FileUploadItem::fileTooLarge));
|
|
}
|
|
|
|
bool FileUploadItem::uploadNow() {
|
|
|
|
if(upload_) {
|
|
|
|
if(upload_->canUpload()) {
|
|
upload_->upload();
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
|
|
void FileUploadItem::uploaded() {
|
|
|
|
if (!upload_->emptyFileName()) {
|
|
|
|
// /var/www-like
|
|
std::string root_dir = ComUtil::ReadConfig("RootDir");
|
|
// /cx-like
|
|
std::string app_dir = ComUtil::ReadConfig("AppDir");
|
|
|
|
fileName_ = ComUtil::SplitFileName(upload_->clientFileName().toUTF8());
|
|
wApp->log("notice") << "FileUploadItem::uploaded(): fileName_:" << fileName_;
|
|
|
|
tmpFileName_ = upload_->spoolFileName() + fileName_;
|
|
wApp->log("notice") << "FileUploadItem::uploaded(): tmpFileName_:" << tmpFileName_;
|
|
|
|
spoolDirFileName_ = root_dir + app_dir + tmpFileName_;
|
|
wApp->log("notice") << "FileUploadItem::uploaded(): spoolDirFileName_:" << spoolDirFileName_;
|
|
|
|
contentDescription_ = upload_->contentDescription();
|
|
|
|
upload_->stealSpooledFile();
|
|
link(upload_->spoolFileName().c_str(), spoolDirFileName_.c_str());
|
|
unlink(upload_->spoolFileName().c_str());
|
|
|
|
delete upload_;
|
|
upload_ = 0;
|
|
delete cancel_;
|
|
cancel_ = 0;
|
|
|
|
error_->setText("");
|
|
remove_->show();
|
|
|
|
struct stat buf;
|
|
stat(spoolDirFileName_.c_str(), &buf);
|
|
std::string size;
|
|
|
|
if (buf.st_size < 1024)
|
|
size = ComUtil::toString((int)(buf.st_size)) + " bytes";
|
|
else
|
|
size = ComUtil::toString((int)(buf.st_size / 1024)) + "kb";
|
|
|
|
uploaded_->setText(WString(ComUtil::href(tmpFileName_, fileName_)) +
|
|
L" (<i>" + contentDescription_ + L"</i>) " + size);
|
|
uploaded_->show();
|
|
|
|
uploadFailed_ = false;
|
|
}
|
|
else {
|
|
|
|
error_->setKeyText("e_upload_item_empty");
|
|
uploadFailed_ = true;
|
|
}
|
|
}
|
|
|
|
void FileUploadItem::hideCancel() { cancel_->setHidden(true); }
|
|
|
|
void FileUploadItem::fileTooLarge(int size) {
|
|
|
|
error_->setKeyText("e_upload_item_toolarge");
|
|
uploadFailed_ = true;
|
|
cancel_->show();
|
|
}
|
|
|
|
void FileUploadItem::cancel() { container_->cancelFileItem(this); }
|
|
|
|
void FileUploadItem::remove() { container_->removeFileItem(this); }
|
|
|
|
File FileUploadItem::file() {
|
|
return File(fileName_, contentDescription_, spoolDirFileName_);
|
|
}
|
|
|