Beispiel #1
0
	void Xep0313Manager::HandleHistoryQueryFinished (const QDomElement& iqElem)
	{
		const auto& setElem = iqElem.firstChildElement ("query").firstChildElement ("set");

		QXmppResultSetReply resultSet;
		resultSet.parse (setElem);

		if (!LastId2Jid_.contains (resultSet.last ()))
		{
			qWarning () << Q_FUNC_INFO
					<< "unknown `last`"
					<< resultSet.last ()
					<< "; clearing all fetched stuff";
			LastId2Jid_.clear ();
			Messages_.clear ();
			return;
		}

		const auto& jid = LastId2Jid_.take (resultSet.last ());
		auto messages = Messages_.take (jid);

		qDebug () << Q_FUNC_INFO << resultSet.first () << resultSet.last () << messages.size ();

		if (messages.first ().TS_ > messages.last ().TS_)
			std::reverse (messages.begin (), messages.end ());
		emit serverHistoryFetched (jid, resultSet.last (), messages);
	}
	void ServerHistoryManager::handleGotHistory ()
	{
		auto reply = qobject_cast<QNetworkReply*> (sender ());
		reply->deleteLater ();

		const auto& reqContext = MsgRequestState_.take (reply);

		const auto& data = reply->readAll ();
		bool ok = true;
		const auto& varmap = QJson::Parser {}.parse (data).toMap ();
		if (!ok)
		{
			qWarning () << Q_FUNC_INFO
					<< "cannot parse reply"
					<< data;
			return;
		}

		SrvHistMessages_t messages;
		for (const auto& var : varmap ["response"].toList ())
		{
			const auto& map = var.toMap ();
			if (map.isEmpty ())
				continue;

			const auto dir = map ["out"].toInt () ?
					IMessage::Direction::Out :
					IMessage::Direction::In;

			const auto& username = dir == IMessage::Direction::In ?
					reqContext.Index_.data (CustomHistRole::UserName).toString () :
					Acc_->GetSelf ()->GetEntryName ();

			messages.append ({
					dir,
					{},
					username,
					map ["body"].toString (),
					QDateTime::fromTime_t (map ["date"].toULongLong ()),
					{}
				});
		}

		for (int i = 0; i < messages.size (); ++i)
			messages [i].ID_ = QByteArray::number (reqContext.Offset_ + i);

		std::reverse (messages.begin (), messages.end ());

		emit serverHistoryFetched (reqContext.Index_,
				QByteArray::number (reqContext.Offset_), messages);
	}
	ServerHistoryWidget::ServerHistoryWidget (QObject *account, QWidget *parent)
	: QWidget { parent }
	, Toolbar_ { new QToolBar { this } }
	, AccObj_ { account }
	, IHSH_ { qobject_cast<IHaveServerHistory*> (account) }
	, ContactsFilter_ { new QSortFilterProxyModel { this } }
	{
		Ui_.setupUi (this);

		if (!IHSH_)
		{
			qWarning () << Q_FUNC_INFO
					<< "account doesn't implement IHaveServerHistory"
					<< account;
			return;
		}

		new Util::ClearLineEditAddon (Core::Instance ().GetProxy (), Ui_.ContactsFilter_);

		ContactsFilter_->setFilterCaseSensitivity (Qt::CaseInsensitive);

		const auto& sortParams = IHSH_->GetSortParams ();
		ContactsFilter_->setSortRole (sortParams.Role_);
		ContactsFilter_->setSortCaseSensitivity (Qt::CaseInsensitive);

		ContactsFilter_->setDynamicSortFilter (true);
		ContactsFilter_->setSourceModel (IHSH_->GetServerContactsModel ());

		Ui_.ContactsView_->setModel (ContactsFilter_);
		Ui_.ContactsView_->sortByColumn (sortParams.Column_, sortParams.Order_);

		connect (AccObj_,
				SIGNAL (serverHistoryFetched (QModelIndex, QByteArray, SrvHistMessages_t)),
				this,
				SLOT (handleFetched (QModelIndex, QByteArray, SrvHistMessages_t)));

		connect (Ui_.ContactsFilter_,
				SIGNAL (textChanged (QString)),
				ContactsFilter_,
				SLOT (setFilterFixedString (QString)));

		auto prevAct = Toolbar_->addAction (tr ("Previous page"),
				this, SLOT (navigatePrevious ()));
		prevAct->setProperty ("ActionIcon", "go-previous");

		auto nextAct = Toolbar_->addAction (tr ("Next page"),
				this, SLOT (navigateNext ()));
		nextAct->setProperty ("ActionIcon", "go-next");
	}
Beispiel #4
0
	void Xep0313Manager::HandleHistoryQueryFinished (const QDomElement& finElem)
	{
		const auto& setElem = finElem.firstChildElement ("set");

		QXmppResultSetReply resultSet;
		resultSet.parse (setElem);

		const auto& jid = QueryId2Jid_.take (finElem.attribute ("queryid"));
		auto messages = Messages_.take (jid);

		qDebug () << Q_FUNC_INFO << resultSet.first () << resultSet.last () << messages.size ();

		if (!messages.isEmpty () &&
				messages.first ().TS_ > messages.last ().TS_)
			std::reverse (messages.begin (), messages.end ());
		emit serverHistoryFetched (jid, resultSet.last (), messages);
	}
Beispiel #5
0
	void GlooxAccount::handleServerHistoryFetched (const QString& jid,
			const QString& id, SrvHistMessages_t messages)
	{
		const auto& index = Xep0313ModelMgr_->Jid2Index (jid);

		const auto& ourNick = GetOurNick ();

		const auto jidEntry = ClientConnection_->GetCLEntry (jid);
		const auto& otherNick = jidEntry ?
				qobject_cast<ICLEntry*> (jidEntry)->GetHumanReadableID () :
				jid;
		for (auto& message : messages)
			message.Nick_ = message.Dir_ == IMessage::Direction::DIn ?
					otherNick :
					ourNick;

		emit serverHistoryFetched (index, id.toUtf8 (), messages);
	}