Project

General

Profile

Bug #663 » FileUploadItem.C

Zhimin Song, 01/01/2011 10:36 AM

 
// =====================================================================================
//
// 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_);
}

(3-3/5)