Skip to content

Commit

Permalink
修改编辑状态方法
Browse files Browse the repository at this point in the history
  • Loading branch information
coderlxn committed May 22, 2014
1 parent 48fcd98 commit b21ba22
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 44 deletions.
88 changes: 49 additions & 39 deletions src/wizDocumentEditStatus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#include "sync/apientry.h"
#include "share/wizmisc.h"
#include "rapidjson/document.h"
#include <QtNetWork>
#include <QtNetwork>
#include <QDebug>


Expand Down Expand Up @@ -34,6 +34,11 @@ QString WizKMGetDocumentEditStatusURL()
}

wizDocumentEditStatusSyncThread::wizDocumentEditStatusSyncThread(QObject* parent) : QThread(parent)
{
connect(&m_timer, SIGNAL(timeout()), SLOT(start()));
}

wizDocumentEditStatusSyncThread::~wizDocumentEditStatusSyncThread()
{
}

Expand All @@ -45,13 +50,12 @@ void wizDocumentEditStatusSyncThread::addEditingDocument(const QString& strUserA
QString strObjID = strKbGUID + "/" + strGUID;

m_mutext.lock();
m_editingList.insert(strObjID, strUserAlias);
m_editingObj.strObjID = strObjID;
m_editingObj.strUserName = strUserAlias;
m_mutext.unlock();

if (!isRunning())
start();

emit sendEditStatusRequest();
}

void wizDocumentEditStatusSyncThread::addDoneDocument(const QString& strKbGUID, const QString& strGUID)
Expand All @@ -62,63 +66,74 @@ void wizDocumentEditStatusSyncThread::addDoneDocument(const QString& strKbGUID,
QString strObjID = strKbGUID + "/" + strGUID;

m_mutext.lock();
if (m_editingList.contains(strObjID))
//
if (m_editingObj.strObjID == strObjID)
{
m_doneList.insert(strObjID, m_editingList.value(strObjID));
m_editingList.remove(strObjID);
m_doneObj.strObjID = strObjID;
m_doneObj.strUserName = m_editingObj.strUserName;
m_editingObj.clear();
}
m_mutext.unlock();

if (!isRunning())
start();

emit sendEditStatusRequest();
}

void wizDocumentEditStatusSyncThread::setAllDocumentDone()
{
m_mutext.lock();
QMap<QString, QString>::iterator i;
for (i = m_editingList.begin(); i != m_editingList.end(); i++)
{
m_doneList.insert(i.key(), i.value());
}
m_editingList.clear();
m_doneObj = m_editingObj;
m_editingObj.clear();
m_mutext.unlock();

if (!isRunning())
start();
}

emit sendEditStatusRequest();
void wizDocumentEditStatusSyncThread::stop()
{
m_timer.stop();
}

void wizDocumentEditStatusSyncThread::run()
{
while (true)
sendEditingMessage();
sendDoneMessage();

m_mutext.lock();
if (!m_editingObj.strObjID.isEmpty())
{
sendEditingMessage();
sendDoneMessage();
m_timer.start(30 * 1000);
}
else
{
m_timer.stop();
}
m_mutext.unlock();
}

QEventLoop eventLoop;
connect(this, SIGNAL(sendEditStatusRequest()), &eventLoop, SLOT(quit()));
QTimer::singleShot(30 * 1000, &eventLoop, SLOT(quit()));
eventLoop.exec();
void wizDocumentEditStatusSyncThread::sendAllDoneMessage()
{
m_mutext.lock();
if (!m_editingObj.strObjID.isEmpty())
{
m_doneObj = m_editingObj;
m_editingObj.clear();
}
m_mutext.unlock();

sendDoneMessage();
}

void wizDocumentEditStatusSyncThread::sendEditingMessage()
{
m_mutext.lock();
QMap<QString, QString> editingList = m_editingList;
EditStatusObj editingObj = m_editingObj;
m_mutext.unlock();

while(!editingList.isEmpty())
if (!editingObj.strObjID.isEmpty() && !editingObj.strUserName.isEmpty())
{
QString strGUID = editingList.begin().key();
QString strUserID = editingList.value(strGUID);
editingList.remove(strGUID);

sendEditingMessage(strUserID, strGUID);
sendEditingMessage(editingObj.strUserName, editingObj.strObjID);
}
}

Expand All @@ -142,18 +157,14 @@ void wizDocumentEditStatusSyncThread::sendEditingMessage(const QString& strUserA
void wizDocumentEditStatusSyncThread::sendDoneMessage()
{
m_mutext.lock();
QMap<QString, QString> doneList = m_doneList;
EditStatusObj doneObj = m_doneObj;
// send done message just once
m_doneList.clear();
m_doneObj.clear();
m_mutext.unlock();

while(!doneList.isEmpty())
if (!doneObj.strObjID.isEmpty() && !doneObj.strUserName.isEmpty())
{
QString strGUID = doneList.begin().key();
QString strUserID = doneList.value(strGUID);
doneList.remove(strGUID);

sendDoneMessage(strUserID, strGUID);
sendDoneMessage(doneObj.strUserName, doneObj.strObjID);
}
}

Expand Down Expand Up @@ -189,7 +200,6 @@ void wizDocumentEditStatusCheckThread::checkEditStatus(const QString& strKbGUID,

void wizDocumentEditStatusCheckThread::downloadData(const QString& strUrl)
{
qDebug() << "wizDocumentEditStatusCheckThread start download data";
QNetworkAccessManager net;
QNetworkReply* reply = net.get(QNetworkRequest(strUrl));

Expand Down
23 changes: 20 additions & 3 deletions src/wizDocumentEditStatus.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,53 @@
#include <QWeakPointer>
#include <QMap>
#include <QPointer>
#include <QTimer>

class QNetworkAccessManager;



class wizDocumentEditStatusSyncThread : public QThread
{
Q_OBJECT
public:
wizDocumentEditStatusSyncThread(QObject* parent = 0);
~wizDocumentEditStatusSyncThread();
void addEditingDocument(const QString& strUserAlias,const QString& strKbGUID ,const QString& strGUID);
void addDoneDocument(const QString& strKbGUID, const QString& strGUID);
void setAllDocumentDone();
void stop();

signals:
void sendEditStatusRequest();
//void sendEditStatusRequest();

protected:
void run();

private:
//
void sendAllDoneMessage();
void sendEditingMessage();
void sendEditingMessage(const QString& strUserAlias, const QString& strObjID);
void sendDoneMessage();
void sendDoneMessage(const QString& strUserAlias, const QString& strObjID);
private:
struct EditStatusObj{
//key : ObjID, value : UserID
QMap<QString, QString> m_editingList;
QMap<QString, QString> m_doneList;
QString strObjID;
QString strUserName;

void clear(){
strObjID.clear();
strUserName.clear();
}
};

EditStatusObj m_editingObj;
EditStatusObj m_doneObj;
QMutex m_mutext;
QPointer<QNetworkAccessManager> m_netManager;
QTimer m_timer;
};

class wizDocumentEditStatusCheckThread : public QThread
Expand Down
16 changes: 14 additions & 2 deletions src/wizDocumentView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,13 @@ CWizDocumentView::CWizDocumentView(CWizExplorerApp& app, QWidget* parent)

connect(Core::ICore::instance(), SIGNAL(closeNoteRequested(Core::INoteView*)),
SLOT(onCloseNoteRequested(Core::INoteView*)));

connect(m_web, SIGNAL(focusIn()), SLOT(on_webView_focus_changed()));
}

CWizDocumentView::~CWizDocumentView()
{
m_editStatusSyncThread->stop();
m_web->saveDocument(m_note, false);
}

Expand Down Expand Up @@ -390,7 +393,7 @@ void CWizDocumentView::loadNote(const WIZDOCUMENTDATA& doc)
//
m_noteLoaded = true;

if (m_bEditingMode)
if (m_bEditingMode && m_web->hasFocus())
{
QString strUserAlias = m_dbMgr.db(m_note.strKbGUID).getUserAlias();
m_editStatusSyncThread->addEditingDocument(strUserAlias, m_note.strKbGUID, m_note.strGUID);
Expand Down Expand Up @@ -462,7 +465,6 @@ void CWizDocumentView::on_document_data_modified(const WIZDOCUMENTDATA& data)

void Core::CWizDocumentView::on_checkEditStatus_finished(QString strGUID, QStringList editors)
{
qDebug() << "wizDocumentEditStatusCheckThread download down";
//
QString strCurrentUser = m_dbMgr.db(m_note.strKbGUID).getUserAlias();
editors.removeAll(strCurrentUser);
Expand All @@ -480,3 +482,13 @@ void Core::CWizDocumentView::on_checkEditStatus_finished(QString strGUID, QStrin
checker->quit();

}

void CWizDocumentView::on_webView_focus_changed()
{
if (m_web->hasFocus())
{
QString strUserAlias = m_dbMgr.db(m_note.strKbGUID).getUserAlias();
m_editStatusSyncThread->addEditingDocument(strUserAlias, m_note.strKbGUID, m_note.strGUID);
}
}

2 changes: 2 additions & 0 deletions src/wizDocumentView.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ public Q_SLOTS:

//
void on_checkEditStatus_finished(QString strGUID, QStringList editors);
void on_webView_focus_changed();

private:
void loadNote(const WIZDOCUMENTDATA &doc);
};
Expand Down

0 comments on commit b21ba22

Please sign in to comment.