#define default_setting qApp->applicationDirPath().append("/setting.jst")
#define default_status_interval 3000
#define default_buffer_size 1024
+#define server_msg qDebug()<<"Server:"
+#define client_msg qDebug()<<"Client:"
typedef QPair<QHostAddress,quint16> AddressAndPort;
typedef QPair<QString,AddressAndPort> NameAndAddrPort;
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString">Desktop</value>
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Desktop</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Target.DesktopTarget</value>
<value key="ProjectExplorer.Target.ActiveBuildConfiguration" type="int">0</value>
+ <value key="ProjectExplorer.Target.ActiveDeployConfiguration" type="int">0</value>
<value key="ProjectExplorer.Target.ActiveRunConfiguration" type="int">0</value>
<valuemap key="ProjectExplorer.Target.BuildConfiguration.0" type="QVariantMap">
- <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
- <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
- <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
- <valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
+ <valuemap key="ProjectExplorer.BuildConfiguration.BuildStepList.0" type="QVariantMap">
+ <valuemap key="ProjectExplorer.BuildStepList.Step.0" type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
+ <valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
+ <value key="QtProjectManager.QMakeBuildStep.QMakeForced" type="bool">false</value>
+ </valuemap>
+ <valuemap key="ProjectExplorer.BuildStepList.Step.1" type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+ <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
+ <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
+ <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+ </valuemap>
+ <value key="ProjectExplorer.BuildStepList.StepsCount" type="int">2</value>
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString">Build</value>
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Build</value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
- <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.1" type="QVariantMap">
- <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
- <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
- <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
- <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
- <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+ <valuemap key="ProjectExplorer.BuildConfiguration.BuildStepList.1" type="QVariantMap">
+ <valuemap key="ProjectExplorer.BuildStepList.Step.0" type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+ <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
+ <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
+ <value type="QString">clean</value>
+ </valuelist>
+ <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+ </valuemap>
+ <value key="ProjectExplorer.BuildStepList.StepsCount" type="int">1</value>
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString">Clean</value>
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Clean</value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
- <value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">2</value>
- <valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
- <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
- <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
- <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
- <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
- <value type="QString">clean</value>
- </valuelist>
- <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
- </valuemap>
- <value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
+ <value key="ProjectExplorer.BuildConfiguration.BuildStepListCount" type="int">2</value>
<value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
<valuelist key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges" type="QVariantList"/>
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString">Release</value>
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Release</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration" type="int">0</value>
<value key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild" type="bool">true</value>
</valuemap>
<value key="ProjectExplorer.Target.BuildConfigurationCount" type="int">1</value>
+ <valuemap key="ProjectExplorer.Target.DeployConfiguration.0" type="QVariantMap">
+ <valuemap key="ProjectExplorer.BuildConfiguration.BuildStepList.0" type="QVariantMap">
+ <value key="ProjectExplorer.BuildStepList.StepsCount" type="int">0</value>
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString">Deploy</value>
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Deploy</value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">ProjectExplorer.BuildSteps.Deploy</value>
+ </valuemap>
+ <value key="ProjectExplorer.BuildConfiguration.BuildStepListCount" type="int">1</value>
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString">No deployment</value>
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">No deployment</value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">ProjectExplorer.DefaultDeployConfiguration</value>
+ </valuemap>
+ <value key="ProjectExplorer.Target.DeployConfigurationCount" type="int">1</value>
<valuemap key="ProjectExplorer.Target.RunConfiguration.0" type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName" type="QString">jasmine</value>
<value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">jasmine</value>
<value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4RunConfiguration</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase" type="int">2</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix" type="bool">false</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal" type="bool">false</value>
<valuelist key="Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges" type="QVariantList"/>
- <value key="Qt4ProjectManager.Qt4RunConfiguration.UserSetName" type="bool">false</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UserSetWorkingDirectory" type="bool">false</value>
<value key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory" type="QString"></value>
+ <value key="RunConfiguration.QmlDebugServerPort" type="uint">3768</value>
+ <value key="RunConfiguration.UseCppDebugger" type="bool">true</value>
+ <value key="RunConfiguration.UseQmlDebugger" type="bool">false</value>
</valuemap>
<value key="ProjectExplorer.Target.RunConfigurationCount" type="int">1</value>
</valuemap>
<value type="int">1</value>
</data>
<data>
+ <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
+ <value type="QString">{a39c6477-68bd-42e2-b34e-5002bf17ed02}</value>
+ </data>
+ <data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
- <value type="int">4</value>
+ <value type="int">8</value>
</data>
</qtcreator>
--- /dev/null
+<!DOCTYPE QtCreatorProject>
+<qtcreator>
+ <data>
+ <variable>ProjectExplorer.Project.ActiveTarget</variable>
+ <value type="int">0</value>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.EditorSettings</variable>
+ <valuemap type="QVariantMap">
+ <value key="EditorConfiguration.Codec" type="QByteArray">System</value>
+ </valuemap>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.Target.0</variable>
+ <valuemap type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Desktop</value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Target.DesktopTarget</value>
+ <value key="ProjectExplorer.Target.ActiveBuildConfiguration" type="int">0</value>
+ <value key="ProjectExplorer.Target.ActiveRunConfiguration" type="int">0</value>
+ <valuemap key="ProjectExplorer.Target.BuildConfiguration.0" type="QVariantMap">
+ <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
+ <valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
+ </valuemap>
+ <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.1" type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+ <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
+ <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
+ <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+ </valuemap>
+ <value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">2</value>
+ <valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+ <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
+ <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
+ <value type="QString">clean</value>
+ </valuelist>
+ <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+ </valuemap>
+ <value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
+ <value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
+ <valuelist key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges" type="QVariantList"/>
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Release</value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4BuildConfiguration</value>
+ <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration" type="int">0</value>
+ <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory" type="QString">/home/hyamamoto/Documents/Workspace/jasmine-build-desktop</value>
+ <value key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId" type="int">2</value>
+ <value key="Qt4ProjectManager.Qt4BuildConfiguration.ToolChain" type="int">0</value>
+ <value key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild" type="bool">true</value>
+ </valuemap>
+ <value key="ProjectExplorer.Target.BuildConfigurationCount" type="int">1</value>
+ <valuemap key="ProjectExplorer.Target.RunConfiguration.0" type="QVariantMap">
+ <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">jasmine</value>
+ <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4RunConfiguration</value>
+ <value key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase" type="int">2</value>
+ <valuelist key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments" type="QVariantList"/>
+ <value key="Qt4ProjectManager.Qt4RunConfiguration.ProFile" type="QString">jasmine.pro</value>
+ <value key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix" type="bool">false</value>
+ <value key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal" type="bool">false</value>
+ <valuelist key="Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges" type="QVariantList"/>
+ <value key="Qt4ProjectManager.Qt4RunConfiguration.UserSetName" type="bool">false</value>
+ <value key="Qt4ProjectManager.Qt4RunConfiguration.UserSetWorkingDirectory" type="bool">false</value>
+ <value key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory" type="QString"></value>
+ </valuemap>
+ <value key="ProjectExplorer.Target.RunConfigurationCount" type="int">1</value>
+ </valuemap>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.TargetCount</variable>
+ <value type="int">1</value>
+ </data>
+ <data>
+ <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+ <value type="int">4</value>
+ </data>
+</qtcreator>
this->senderName=senderName;
this->event=tcpSocket::Size;
connect(this,SIGNAL(readyRead()),SLOT(client_receive_flag()));
+ connect(this,SIGNAL(disconnected()),SLOT(deleteLater()));
+ connect(this,SIGNAL(error(QAbstractSocket::SocketError)),SLOT(error_occured(QAbstractSocket::SocketError)));
+#ifdef DEBUG
+ client_msg<<"TcpSocket for client has been constructed";
+ client_msg<<this;
+#endif
}
//Moving event
void tcpSocket::client_move_section(){
bool tcpSocket::client_process_event(){
bool result;
#ifdef DEBUG
- qDebug()<<"Client Event:"<<this->event;
+ client_msg<<"Event:"<<this->event;
#endif
switch(this->event){
case tcpSocket::Size:
this->write((char*)&size,sizeof(size));
if(!this->client_flush()) return false;
#ifdef DEBUG
- qDebug()<<"Client:size of header has been sent successfully. The size is:"<<size;
+ client_msg<<"size of header has been sent successfully. The size is:"<<size;
#endif
this->client_move_section();
return true;
this->write(this->tmp_buffer);
if(!this->client_flush()) return false;
#ifdef DEBUG
- qDebug()<<"Client:header has been sent successfully.";
+ client_msg<<"header has been sent successfully.";
#endif
this->client_move_section();
return true;
}
memoryStream.close();
#ifdef DEBUG
- qDebug()<<"Client:data has been sent successfully.";
+ client_msg<<"data has been sent successfully.";
#endif
this->client_move_section();
return true;
if(this->bytesAvailable()<4) return;
QByteArray data=this->readAll();
#ifdef DEBUG
- qDebug()<<"Client:received flag:"<<(Flag)data.toInt();
+ client_msg<<"received flag:"<<(Flag)data.toInt();
#endif
switch((Flag)data.toInt()){
case tcpSocket::accepted:
+ //this->client_move_section();
break;
case tcpSocket::refused:
this->setErrorString(tr("Access Refused"));
return (*this);
}
file.lock(QtLockedFile::ReadLock);
- while(this->write(file.read(this->buffer_size))>0&&!this->check_canceled_then_abort()){
+ while(this->write(file.read(this->buffer_size))>0&&!this->check_canceled()){
if(!this->flush())return (*this);
emit this->sending_file_progress(file.pos());
}
void tcpServer::incomingConnection(int handle){
threadedTcpSocket *socket=new threadedTcpSocket(this->buffersize,this);
+ connect(socket,SIGNAL(pending()),SLOT(socket_pending()));
socket->socketDescriptor(handle);
- if(! emit this->pending(*socket)){
- socket->exit(1);
- return;
- }
socket->start();
emit this->newConnection();
}
+bool tcpServer::socket_pending(){
+#ifdef DEBUG
+ server_msg<<"CALL:socket_pending";
+#endif
+ threadedTcpSocket *socket=qobject_cast<threadedTcpSocket *>(this->sender());
+ if(!emit this->pending(AddressAndPort(socket->peerAddr().first,socket->peerAddr().second))){
+#ifdef DEBUG
+ server_msg<<"A client accessed, but refused because user didn't accept.";
+#endif
+ return false;
+ }
+ emit this->socket_accepted(*socket);
+ return true;
+}
//Tcp socket implementation
tcpSocket::tcpSocket(const quint64 buffersize, QObject *parent):QTcpSocket(parent){
this->event=tcpSocket::Size;
connect(this,SIGNAL(readyRead()),SLOT(read_data()));
connect(this,SIGNAL(bytesWritten(qint64)),SLOT(move_next_section(const qint64)));
+ connect(this,SIGNAL(disconnected()),SLOT(deleteLater()));
+ connect(this,SIGNAL(error(QAbstractSocket::SocketError)),SLOT(error_occured(QAbstractSocket::SocketError)));
#ifdef DEBUG
- qDebug()<<"Server:tcpSocket is constructed.";
- qDebug()<<"Server:blocked:"<<this->signalsBlocked();
+ server_msg<<"tcpSocket is constructed.";
+ server_msg<<this;
+ server_msg<<"blocked:"<<this->signalsBlocked();
#endif
}
void tcpSocket::read_data(){
/*TODO: remove this loop*/
while(this->bytesAvailable()>=0){
#ifdef DEBUG
- qDebug()<<"Server:server Event Mode:"<<this->event;
- qDebug()<<"Server:server Available bytes:"<<this->bytesAvailable();
+ server_msg<<"server Event Mode:"<<this->event;
+ server_msg<<"server Available bytes:"<<this->bytesAvailable();
#endif
switch(this->event){
case tcpSocket::Size: this->size_event(); break;
return;
}
#ifdef DEBUG
- qDebug()<<"Server:the flag:"<<flag<<" has been sent.";
+ server_msg<<"the flag:"<<flag<<" has been sent.";
#endif
}
read_count=(this->head_data.datasize()-final_readsize)/this->buffer_size;
QByteArray msg;
for(quint64 count=0;count<read_count;count++){
- if(this->check_canceled_then_abort())return;
+ if(this->check_canceled())return;
msg+=this->read(this->buffer_size);
}
- if(this->check_canceled_then_abort())return;
+ if(this->check_canceled())return;
msg+=this->read(final_readsize);
rmd6 generator;
this->where_to_save=emit this->fileStream_openFailed(file.error(),file.errorString());
goto streamopen;
}
- for(quint64 count=0;count<read_count&&!this->check_canceled_then_abort();count++){
- if(this->check_canceled_then_abort())return;
+ for(quint64 count=0;count<read_count&&!this->check_canceled();count++){
+ if(this->check_canceled())return;
file.write(this->read(this->buffer_size));
emit this->file_receive_progress(file.pos());
}
- if(this->check_canceled_then_abort())return;
+ if(this->check_canceled())return;
file.write(this->read(final_readsize));
emit this->file_receive_progress(file.pos());
file.close();
this->canceled=true;
QTcpSocket::disconnectFromHost();
}
-bool tcpSocket::check_canceled_then_abort(){
+bool tcpSocket::check_canceled(){
if(this->canceled){
this->setErrorString(tr("The process has been canceled by user."));
emit this->error(QAbstractSocket::UnknownSocketError);
- this->abort();
return true;
}
return false;
}
+void tcpSocket::error_occured(const QAbstractSocket::SocketError err){
+ Q_UNUSED(err)
+ qDebug()<<"Error("<<this<<")"<<this->errorString();
+ this->abort();
+
+}
void tcpSocket::cancel(){this->canceled=true;}
QString tcpSocket::path_to_save() const{return this->where_to_save;}
header tcpSocket::header_data() const{return this->head_data;}
#ifdef DEBUG
qDebug()<<"threadedTcpSocket has been created and running.";
#endif
+ qRegisterMetaType<QAbstractSocket::SocketState>("SocketState");
+ qRegisterMetaType<QAbstractSocket::SocketError>("SocketError");
+
this->locks[threadedTcpSocket::BufferSize].lockForRead();
this->locks[threadedTcpSocket::SenderName].lockForRead();
tcpSocket *socket=
this->locks[threadedTcpSocket::BufferSize].unlock();
this->locks[threadedTcpSocket::SenderName].unlock();
/*Common signals*/
- connect(socket,SIGNAL(error(QAbstractSocket::SocketError)),
- SLOT(error_occured(QAbstractSocket::SocketError)),
- Qt::BlockingQueuedConnection);
connect(socket,SIGNAL(connected()),SLOT(host_connected()),Qt::BlockingQueuedConnection);
connect(socket,SIGNAL(connected()),SIGNAL(connected()));
+#ifdef DEBUG
+ connect(socket,SIGNAL(disconnected()),SLOT(host_disconnected()));
+#endif
connect(socket,SIGNAL(disconnected()),SIGNAL(disconnected()));
- connect(socket,SIGNAL(disconnected()),SLOT(host_disconnected()),
- Qt::BlockingQueuedConnection);
+
connect(socket,SIGNAL(hostFound()),SIGNAL(hostFound()));
connect(socket,SIGNAL(proxyAuthenticationRequired(const QNetworkProxy &,QAuthenticator*)),
SIGNAL(proxyAuthenticationRequired(const QNetworkProxy &,QAuthenticator*)));
connect(socket,SIGNAL(file_saved()),SIGNAL(file_saved()));
connect(socket,SIGNAL(file_saved()),SLOT(quit()));
connect(socket,SIGNAL(header_received()),SLOT(header_received()));
- if(!socket->setSocketDescriptor(descriptor)){
- this->_error=socket->errorString();
- emit this->error(socket->error());
- }
+ socket->setSocketDescriptor(descriptor);
this->_addrPort.first=socket->peerAddress();
this->_addrPort.second=socket->peerPort();
+ if(!emit this->pending()) socket->disconnectFromHost();
break;
}
this->locks[threadedTcpSocket::Mode].unlock();
//Cleanup
socket->abort();
}
+
void threadedTcpSocket::host_connected(){
tcpSocket *socket=qobject_cast<tcpSocket *>(this->sender());
#ifdef DEBUG
qDebug()<<"Client:"<<socket->peerAddress().toString()<<"has been connected properly.";
#endif
this->locks[threadedTcpSocket::Msg].lockForRead();
- bool r=this->_msg.isNull();
- this->locks[threadedTcpSocket::Msg].unlock();
- if(r){
+ if(this->_msg.isNull()){
this->locks[threadedTcpSocket::File].lockForRead();
(*socket)<<this->_file;
this->locks[threadedTcpSocket::File].unlock();
(*socket)<<this->_msg;
this->locks[threadedTcpSocket::Msg].unlock();
}
+ this->locks[threadedTcpSocket::Msg].unlock();
}
-void threadedTcpSocket::host_disconnected(){
- tcpSocket *socket=qobject_cast<tcpSocket *>(this->sender());
- socket->close();
+
#ifdef DEBUG
+void threadedTcpSocket::host_disconnected(){
+ this->locks[threadedTcpSocket::Mode].lockForRead();
qDebug()<<"Socket("<<((this->mode==threadedTcpSocket::Session)?"Session":"Client")<<"):Connection closed successful.";
-#endif
- socket->deleteLater();
-}
-
-void threadedTcpSocket::error_occured(const QAbstractSocket::SocketError error){
- tcpSocket *socket=(tcpSocket*)this->sender();
- this->locks[threadedTcpSocket::Error].lockForWrite();
- this->_error=socket->errorString();
- this->locks[threadedTcpSocket::Error].unlock();
- this->exit(1);
- emit this->error(error);
-}
-QString threadedTcpSocket::errorString(){
- this->locks[threadedTcpSocket::Error].lockForRead();
- QString str=this->_error;
- this->locks[threadedTcpSocket::Error].unlock();
- return str;
+ this->locks[threadedTcpSocket::Mode].unlock();
}
+#endif
public:
tcpServer(quint64 buffersize=default_bandwidth,QObject *parent=NULL);
signals:
- bool pending(threadedTcpSocket &) const;
+ bool pending(const AddressAndPort &) const;
void socket_error(const threadedTcpSocket &) const;
+ void socket_accepted(const threadedTcpSocket &) const;
protected:
void incomingConnection(int handle);
private:
quint64 buffersize;
+ private slots:
+ bool socket_pending();
};
class threadedTcpSocket:public QThread{
void readWriteMode(const QIODevice::OpenMode);
void to(const AddressAndPort &);
QIODevice::OpenMode readWriteMode();
- QString errorString();
threadedTcpSocket &operator<<(const QString &);
threadedTcpSocket &operator<<(const QFileInfo &);
private:
enum Mode{Session,Client} mode;
enum lockID{
- Mode =0,
- BufferSize =1,
- SenderName =2,
- Msg =3,
- File =4,
- Descriptor =5,
- RWMode =6,
- Error =7,
- AddrAndPort =8,
- HeaderData =9
+ Mode =0,
+ BufferSize =1,
+ SenderName =2,
+ Msg =3,
+ File =4,
+ Descriptor =5,
+ RWMode =6,
+ AddrAndPort =7,
+ HeaderData =8,
};
void run();
QIODevice::OpenMode open_mode;
- QReadWriteLock locks[10];
+ QReadWriteLock locks[9];
int _descriptor;
quint64 _buffersize;
- QString _senderName,_msg,_error;
+ QString _senderName,_msg;
QFileInfo _file;
AddressAndPort _addrPort;
header _header;
private slots:
void header_received();
- void error_occured(const QAbstractSocket::SocketError);
void host_connected();
+#ifdef DEBUG
void host_disconnected();
+#endif
signals:
QString file_pending() const;
QString fileStream_openFailed(const QFile::FileError &,const QString &) const;
void file_receive_progress(const quint64 streamPos) const;
void file_saved() const;
+ bool pending() const;
void sentData();
void file_header_sent();
void connected();
void disconnected();
- void error(const QAbstractSocket::SocketError);
void hostFound();
void proxyAuthenticationRequired(const QNetworkProxy &,QAuthenticator *);
void stateChanged(QAbstractSocket::SocketState);
};
-
class tcpSocket:public QTcpSocket{
Q_OBJECT
public:
void header_event();
void msg_event();
void file_event();
- bool check_canceled_then_abort();
+ bool check_canceled();
void client_move_section();
bool client_process_event();
void move_next_section(const qint64);
void send_flag(const Flag flag);
void cancel();
+ void error_occured(const QAbstractSocket::SocketError);
void client_receive_flag();
};
}
+Q_DECLARE_METATYPE(QAbstractSocket::SocketState)
+Q_DECLARE_METATYPE(QAbstractSocket::SocketError)
connect(this->sendTextEditor,SIGNAL(invalidLink(const QString &)),SLOT(invalidLink(const QString &)));
connect(this->sendTextEditor,SIGNAL(sendTriggered()),this->sendButton,SLOT(click()));
- connect(this->mainServer,SIGNAL(pending(threadedTcpSocket &)),
- SLOT(tcpserver_pending(threadedTcpSocket &)));
+ connect(this->mainServer,SIGNAL(pending(const AddressAndPort &)),
+ SLOT(tcpserver_pending(const AddressAndPort &)));
+ connect(this->mainServer,SIGNAL(socket_accepted(const threadedTcpSocket &)),
+ SLOT(tcpserver_accepted(const threadedTcpSocket &)));
}
mainWindow::~mainWindow(){}
void mainWindow::closeEvent(QCloseEvent *event){
for(int index=0;index<addressList.size();index++){
threadedTcpSocket *client=new threadedTcpSocket(
addressList[index],this->setting.name(),default_buffer_size,this);
- connect(client,SIGNAL(error(const QAbstractSocket::SocketError &)),SLOT(tcpclient_error(const QAbstractSocket::SocketError &)));
connect(client,SIGNAL(sentData()),SLOT(sentData()));
(*client)<<this->sendTextEditor->html();
}
}
-void mainWindow::tcpclient_error(const QAbstractSocket::SocketError &error){
- Q_UNUSED(error);
- threadedTcpSocket *client=qobject_cast<threadedTcpSocket *>(this->sender());
-#ifdef DEBUG
- qDebug()<<"Error:"<<client->errorString();
-#endif
- client->exit(1);
-}
void mainWindow::on_sendFileAction_triggered(){
//TODO:Send files
settings mainWindow::app_setting() const{return this->setting;}
//Main server
-bool mainWindow::tcpserver_pending(threadedTcpSocket &socket){
+bool mainWindow::tcpserver_pending(const AddressAndPort &addr){
#ifdef DEBUG
- qDebug()<<"Pending:"<<socket.peerAddr().first.toString()<<" Port:"<<socket.peerAddr().second;
+ qDebug()<<"Pending:"<<addr.first.toString()<<" Port:"<<addr.second;
#endif
- if(this->memberList->isInMember(socket.peerAddr(),true)<0) return false;
+ return this->memberList->isInMember(addr,true)>=0;
+}
+void mainWindow::tcpserver_accepted(const threadedTcpSocket &socket){
connect(&socket,
SIGNAL(msg_received(const QString &)),
SLOT(tcpserver_msg_received(const QString &)));
- connect(&socket,SIGNAL(error(const QAbstractSocket::SocketError &)),
- SLOT(tcpserver_error(const QAbstractSocket::SocketError &)));
- return true;
-}
-void mainWindow::tcpserver_error(const QAbstractSocket::SocketError &error){
- Q_UNUSED(error);
- threadedTcpSocket *sender=qobject_cast<threadedTcpSocket *>(this->sender());
-#ifdef DEBUG
- qDebug()<<"Receive aborted:"<<sender->errorString();
-#endif
- sender->exit(1);
}
void mainWindow::tcpserver_msg_received(const QString &msg){
void invalidLink(const QString &);
void selectedLink(const QUrl &);
//These functions are for tcpclient.
- void tcpclient_error(const QAbstractSocket::SocketError &error);
void sentData();
//These functions are for tcpserver.
- bool tcpserver_pending(threadedTcpSocket &);
+ bool tcpserver_pending(const AddressAndPort &);
+ void tcpserver_accepted(const threadedTcpSocket &);
void tcpserver_msg_received(const QString &);
- void tcpserver_error(const QAbstractSocket::SocketError &);
public slots:
//These are for opening stuff.
void openConfig(const QString &);
close_warning_title(QObject::tr("Data will be lost!")),
saving_member_warning_when_closing_body(QObject::tr("The modification of your memberlist will be lost without saving it. Save it?")),
- saving_setting_warning_when_closing_body(QObject::tr("The modification of your memberlist will be lost witout saving it. Save it?")),
+ saving_setting_warning_when_closing_body(QObject::tr("The modification of your memberlist will be lost without saving it. Save it?")),
open_memberlist_title(open_prefix.arg(QObject::tr("memberlist"))),
open_setting_title(open_prefix.arg(QObject::tr("settings"))),