Пример #1
0
int main(int argc, char **argv)
{
    if ( argc != 2 ) {
        qWarning( "usage: %s pofile", argv[0] );
        return -1;
    }

    MsgList translated;

    try {
        ifstream s(argv[1]);
        GettextLexer lexer(s);
        GettextParser parser(lexer);
        translated = parser.file();

    } catch(exception& e) {
        cerr << "exception: " << e.what() << endl;
        return 1;
    }

    for (MsgList::ConstIterator it = translated.constBegin();
         it != translated.constEnd(); ++it)
    {
        if ( !( *it ).msgstr.isEmpty() ) {
            outputMsg("msgid", (*it).msgstr);
            outputMsg("msgstr", (*it).msgid);
            cout << "\n";
        }
    }

}
Пример #2
0
//-------------------------------------------------------------------------------------------------
int ConsoleMenu::DeleteMsgs(tty_save_state& tty, MsgList& lst) const
{
	for (;;)
	{
		Message *msg(SelectFromMsg(lst));
		if (msg)
		{
			for (MsgList::iterator itr(lst.begin()); itr != lst.end(); ++itr)
			{
				if (*itr == msg)
				{
					if (get_yn("Delete msg? (y/n):", true))
					{
						delete *itr;
						lst.erase(itr);
					}
					break;
				}
			}
		}
		else
			break;
	}

	return lst.size();
}
Пример #3
0
void ChatControler::_getMesage(service::ErrorInfo &info, int64 targetId, std::vector<service::MsgPtr>msgPtr)
{
    qDebug() << Q_FUNC_INFO << msgPtr.size();
    MsgList msgList;
    //std::shared_ptr<service::Msg> msg;

    for(auto msg:msgPtr){
        if(msg->msgtype == 2||msg->msgtype == 8){
            std::shared_ptr<service::MsgText> msgText = std::dynamic_pointer_cast<service::MsgText>(msg);
            Msg item;
            item.activeType = QString::number(msgText->active_type);
            item.body = QString::fromStdString(utils::MsgUtils::getText(msgText->body));
            item.fromid = QString::number(msgText->fromid);
            item.localid = QString::number(msgText->localid);
            item.msgid = QString::number(msgText->msgid);
            item.msgProperties = QString::fromStdString(msgText->msg_properties);
            item.msgtype = QString::number(msgText->msgtype);
            item.relatedMsgid = QString::number(msgText->related_msgid);
            item.targetid = QString::number(msgText->targetid);
            item.time = QString::number(msgText->time);
            item.toid = QString::number(msgText->toid);
            msgList.insert(msgList.size(),item);
        }
   }
    if(!info.code()){
        emit getMessagesBack(true,targetId,msgList);
    }else{
        emit getMessagesBack(true,targetId,msgList);
    }
}
Пример #4
0
//-------------------------------------------------------------------------------------------------
int ConsoleMenu::DeleteAllMsgs(tty_save_state& tty, MsgList& lst) const
{
	if (lst.size() && get_yn("Delete all msgs? (y/n):", true))
	{
		for_each(lst.begin(), lst.end(), [](const Message *pp){ delete pp; pp = nullptr; });
		lst.clear();
	}

	return 0;
}
Пример #5
0
const char* CCrypto::GetMessage( EMsg eMsg, uint8 serverType )
{
	for ( MsgList::iterator iter = eMsgList.begin() ; iter != eMsgList.end() ; iter++ )
	{
		if ( iter->first == eMsg )
		{
			return iter->second->pchMsgName;
		}
	}

	return NULL;
}
Пример #6
0
//-------------------------------------------------------------------------------------------------
int ConsoleMenu::CreateMsgs(tty_save_state& tty, MsgList& lst) const
{
	for (;;)
	{
		const BaseMsgEntry *mc(SelectMsg());
		if (!mc)
			break;
		unique_ptr<Message> msg(mc->_create._do(true));
		const FieldTable::Pair *fld;
		while((fld = SelectField(msg.get())))
			EditMsg(tty, fld, msg.get());
		_os << endl << endl << *static_cast<MessageBase *>(msg.get()) << endl;
		if (get_yn("Add to list? (y/n):", true))
			lst.push_back(msg.release());
	}

	return static_cast<int>(lst.size());
}
Пример #7
0
//-------------------------------------------------------------------------------------------------
int ConsoleMenu::CreateMsgs(tty_save_state& tty, MsgList& lst) const
{
	for (;;)
	{
		const BaseMsgEntry *mc(SelectMsg());
		if (mc)
		{
			Message *msg(mc->_create());
			const FieldTable::Pair *fld;
			while((fld = SelectField(msg)))
				EditMsg(tty, fld, msg);
			_os << endl << endl << *static_cast<MessageBase *>(msg) << endl;
			if (get_yn("Add to list? (y/n):", true))
				lst.push_back(msg);
		}
		else
			break;
	}

	return lst.size();
}
Пример #8
0
bool UserMessages::InternalUnhook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew)
#endif
{
	MsgList *pList;
	MsgIter iter;
	ListenerInfo *pInfo;
	bool deleted = false;

	if (msg_id < 0 || msg_id >= 255)
	{
		return false;
	}

	pList = (intercept) ? &m_msgIntercepts[msg_id] : &m_msgHooks[msg_id];
	for (iter=pList->begin(); iter!=pList->end(); iter++)
	{
		pInfo = (*iter);
		if (pInfo->Callback == pListener && pInfo->IsNew == isNew)
		{
			if (pInfo->IsHooked)
			{
				pInfo->KillMe = true;
				return true;
			}
			pList->erase(iter);
			deleted = true;
			break;
		}
	}

	if (deleted)
	{
		_DecRefCounter();
	}

	return deleted;
}
Пример #9
0
void Log::_flushOutlist()
{
    MsgList *outlist = mOutlist;
    if (!outlist->empty())
    {
        char timeStr[32] = {0};
        const char *pTimeStr = 0;
        for (MsgList::iterator i = outlist->begin(); i != outlist->end(); ++i)
        {
            _MSG &msgnode = *i;

            if (msgnode.time)
            {
                struct tm *timeinfo = localtime(&msgnode.time);
                snprintf(timeStr, sizeof(timeStr), "[%04d/%02d/%d %02d:%02d:%02d]",
                         timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
                pTimeStr = timeStr;
            }
            else
            {
                pTimeStr = 0;
            }

            for (PrinterList::iterator it = mLogPrinter.begin(); it != mLogPrinter.end(); ++it)
            {
                ILogPrinter *obj = *it;
                if (obj->getLevel() & msgnode.level)
                {
                    obj->onPrint(msgnode.level, msgnode.time, pTimeStr, msgnode.msg.c_str());
                }
            }
        }

        outlist->clear();
    }
}
Пример #10
0
//-------------------------------------------------------------------------------------------------
int ConsoleMenu::EditMsgs(tty_save_state& tty, MsgList& lst) const
{
	for (;;)
	{
		Message *msg(SelectFromMsg(lst));
		if (!msg)
			break;
		const FieldTable::Pair *fld;
		while((fld = SelectField(msg)))
			EditMsg(tty, fld, msg);
		_os << endl << endl << *static_cast<MessageBase *>(msg) << endl;
	}

	return static_cast<int>(lst.size());
}
Пример #11
0
void UserMessages::OnMessageEnd_Post()
{
	if (!m_InHook || m_BlockEndPost)
	{
		RETURN_META(MRES_IGNORED);
	}

	MsgList *pList;
	MsgIter iter;
	ListenerInfo *pInfo;

	pList = &m_msgIntercepts[m_CurId];
	for (iter=pList->begin(); iter!=pList->end(); )
	{
		pInfo = (*iter);
		pInfo->IsHooked = true;
		pInfo->Callback->OnUserMessageSent(m_CurId);

		if (pInfo->KillMe)
		{
			iter = pList->erase(iter);
			m_FreeListeners.push(pInfo);
			_DecRefCounter();
			continue;
		}

		pInfo->IsHooked = false;
		iter++;
	}

	m_InHook = false;

	pList = &m_msgHooks[m_CurId];
	for (iter=pList->begin(); iter!=pList->end(); )
	{
		pInfo = (*iter);
		pInfo->IsHooked = true;
		pInfo->Callback->OnUserMessageSent(m_CurId);

		if (pInfo->KillMe)
		{
			iter = pList->erase(iter);
			m_FreeListeners.push(pInfo);
			_DecRefCounter();
			continue;
		}

		pInfo->IsHooked = false;
		iter++;
	}
}
Пример #12
0
CCrypto::~CCrypto()
{

	eMsgList.clear();

	if ( Encrypt_Detour )
	{
		Encrypt_Detour->Detach();
		delete Encrypt_Detour;
	}

	if ( Decrypt_Detour )
	{
		Decrypt_Detour->Detach();
		delete Decrypt_Detour;
	}
}
Пример #13
0
int Request::addParams(MsgList &ml) {
    Json::Value param;
    Json::Value arr;
    Json::Value msg;
    param["type"] = "MsgList";
    for (int i = 0; i != ml.size(); i++) {
        msg["srcID"] = ml[i].srcID;
        msg["targetID"] = ml[i].targetID;
        msg["msgText"] = ml[i].msgText;
        msg["postTime"] = (int)ml[i].postTime;
        msg["msgType"] = ml[i].msgType;
        arr.append(msg);
    }
    param["value"] = arr;
    root["params"].append(param);
    return 0;
}
Пример #14
0
void CDoodChatManagerModel::addHistoryMsgToListView(MsgList msgList)
{
    qDebug()<<Q_FUNC_INFO<<"msg size:"<<msgList.size();
    int len = msgList.size();
    bool isUpdate = false;
    if(msgList.size() <= 0){
        return;
    }

    for(int i = 0; i<len;++i){

        Msg msg = msgList.at(i);
        if(/*msg.msgtype.toInt() == MSG_TYPE_IMG || */msg.fromid =="0"||msg.fromid == ""){
            continue;
        }
        if(msg.localid == "" ||msg.localid == "0"){
            msg.localid = createLocalId();
        }

        if(msg.msgtype.toInt() == MEDIA_MSG_REVOKE && msgIsExitById(msg.revokeMsgId)){
            QStringList msgs;
            msgs.push_back(msg.revokeMsgId);
            emit deleteMessage(id(),msgs);
            removeItemByMsgId(msg.revokeMsgId);
        }

        if(!m_pChatMap.contains(msg.localid)&&!msgIsExitById(msg.msgid)) {

            QDateTime msgDate = QDateTime::fromString(msg.time, "yyyy-MM-dd hh:mm:ss");
            bool bShow = isJudageShowTime(msgDate);
            isUpdate = true;
            qDebug()<< Q_FUNC_INFO<<"msgTime:"<<msg.time;
            CDoodChatItem *pChatItem = new CDoodChatItem(this);
            pChatItem->setLocalId(msg.localid);
            pChatItem->setMsgType(msg.msgtype);
            pChatItem->setActiveType(msg.activeType);
            pChatItem->setMsgId(msg.msgid);
            pChatItem->setTargetId(msg.targetid);
            pChatItem->setFromId(msg.fromid);
            pChatItem->setToId(msg.toid);
            pChatItem->setName(msg.name);
            pChatItem->setTime(msgDate);
            pChatItem->setShowTime(bShow);
            pChatItem->setLoading(false);
            pChatItem->setContactThumbAvatar(msg.thumb_avatar);
            pChatItem->setIsMyselft(mAccountUserId == msg.fromid);
            if(msg.msgtype.toInt() == MSG_TYPE_FILE){
                pChatItem->setFileSize(msg.f_size.toLongLong());
                pChatItem->setProgress(0);
                pChatItem->setThumbAvatar(msg.f_url);
                pChatItem->setTar_thumbAvatar(msg.encrypt_user);
                pChatItem->setTextMsg(msg.filename);
                pChatItem->setBody(msg.encrypt_key);
                pChatItem->setFilePath("");
                pChatItem->mFileUrl = msg.f_url;
            }
            else if(msg.msgtype.toInt() == MSG_TYPE_IMG){
                if(msg.body != ""&& fileExistAtLocal(msg.body)){
                    msg.body = "file://"+msg.body;
                }else{
                    msg.body = "qrc:/res/control/defaultimage.png";
                }
                pChatItem->setBody(msg.body);
                pChatItem->setTar_thumbAvatar(msg.thumb_url);
                pChatItem->setTextMsg(msg.main_url);
                pChatItem->setBodyBig(msg.main_url);
                pChatItem->mImageMainUrl = msg.main_url;
                pChatItem->mImageThumbUrl = msg.thumb_url;
                pChatItem->setEncrypt_key(msg.encrypt_key);

            }else if(msg.msgtype.toInt() == MEDIA_MSG_REVOKE){
                pChatItem->setMsgType(QString::number(MSG_TYPE_TIP));
                if(msg.fromid == mAccountUserId){
                    pChatItem->setBody("您撤回了一条消息");
                }else{
                    pChatItem->setBody(msg.body+"撤回了一条消息");
                }
            }
            else{
                pChatItem->setBody(msg.body);
            }

            //addItem(pChatItem);
            qint64 pos = indexOfNewItem(pChatItem->time());
            if(pos>=0 &&pos<= m_pChatMap.size()){
                insertItem(pos,pChatItem);
            }

            m_pChatMap[msg.localid] = pChatItem;
            updateItemNameAndAvatar(msg.localid,msg.fromid);
            pChatItem->mEnkey = msg.encrypt_key;
            pChatItem->mEnkeyUser = msg.encrypt_user;
            if(msg.msgtype.toInt() == MSG_TYPE_IMG){
                if(msg.body == "qrc:/res/control/defaultimage.png"|| !fileExistAtLocal(msg.body)){
                    pChatItem->setLoading(true);
                    emit downloadImage(id(),msg.localid,msg.thumb_url,msg.encrypt_key);
                }
            }
        }
    }
    if(isUpdate){
        emit updateDataFinished();
    }
    if(_list->count()>0){
        QString msgid;
        msgid=qobject_cast<CDoodChatItem*>(_list->at(_list->count()-1))->msgId();
        emit setMsgRead(msgid);
    }
}
Пример #15
0
void LinkDoodService::onChatGetMessagesResult(bool code, int64 sessionId, MsgList msgList)
{
    qDebug() << Q_FUNC_INFO << msgList.size();
    emit getMessagesResult(code,QString::number(sessionId),msgList);
}
Пример #16
0
CCrypto::CCrypto()
	: Encrypt_Detour( NULL ), Decrypt_Detour( NULL )
{
	CSimpleScan steamClientScan( "steamclient.dll" );


	SymmetricEncryptWithIVFn pEncrypt = NULL;
	bool bEncrypt = steamClientScan.FindFunction(
		"\x53\x8B\xDC\x83\xEC\x08\x83\xE4\xF0\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x64\xA1\x00\x00\x00\x00",
		"xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
		(void **)&pEncrypt
	);

	Encrypt_Orig = pEncrypt;

	g_pLogger->LogConsole( "CCrypto::SymmetricEncryptWithIV = 0x%x\n", Encrypt_Orig );


	SymmetricDecryptRecoverIVFn pDecrypt = NULL;
	bool bDecrypt = steamClientScan.FindFunction(
		"\x55\x8B\xEC\x81\xEC\x04\x01\x00\x00\x83\x7D\x08\x00\x53",
		"xxxxxxxxxxxxxx",
		(void **)&pDecrypt
	);

	Decrypt_Orig = pDecrypt;

	g_pLogger->LogConsole( "CCrypto::SymmetricDecryptRecoverIV = 0x%x\n", Decrypt_Orig );


	char *pGetMessageList = NULL;
	bool bGetMessageList = steamClientScan.FindFunction(
		"\xA1\x00\x00\x00\x00\xA8\x01\x75\x00\x83\xC8\x01\xB9\x00\x00\x00\x00\x0056",
		"x????xxx?xxxx????x",
		(void **)&pGetMessageList
	);

	if (bGetMessageList)
	{
		const uint32 uMessageListStartPtrOffset = 38;
		const uint32 uMessageListEndPtrOffset = uMessageListStartPtrOffset + 26;

		MsgInfo_t *pInfos = *(MsgInfo_t **)( pGetMessageList + uMessageListStartPtrOffset );
		MsgInfo_t *pEndInfos = *(MsgInfo_t **)( pGetMessageList + uMessageListEndPtrOffset );
		uint16 numMessages = ( ( int )pEndInfos - ( int )pInfos ) / sizeof( MsgInfo_t );

		g_pLogger->LogConsole( "pGetMessageList = 0x%x\npInfos = 0x%x\nnumMessages = %d\n", pGetMessageList, pInfos, numMessages );


		for ( uint16 x = 0 ; x < numMessages; x++ )
		{
			eMsgList.insert( MsgPair( pInfos->eMsg, pInfos ) );

			pInfos++;
		}

		if ( eMsgList.size() != 0 )
		{
			// should only delete our existing files if we have something new to dump
			g_pLogger->DeleteFile( "emsg_list.txt", false );
			g_pLogger->DeleteFile( "emsg_list_detailed.txt", false );

			for ( MsgList::iterator iter = eMsgList.begin() ; iter != eMsgList.end() ; iter++ )
			{
				MsgInfo_t *pInfo = iter->second;

				g_pLogger->LogFile( "emsg_list.txt", false, "\t%s = %d,\r\n", pInfo->pchMsgName, pInfo->eMsg );
				g_pLogger->LogFile( "emsg_list_detailed.txt", false, "\t%s = %d, // flags: %d, server type: %d\r\n", pInfo->pchMsgName, pInfo->eMsg, pInfo->nFlags, pInfo->k_EServerTarget );
			}

			g_pLogger->LogConsole( "Dumped emsg list! (%d messages)\n", eMsgList.size() );
		}
		else
		{
			g_pLogger->LogConsole( "Unable to dump emsg list: No messages! (Offset changed?)\n" );
		} 
	}
	else
	{
		g_pLogger->LogConsole( "Unable to find GetMessageList.\n" );
	}

	SymmetricEncryptWithIVFn encrypt = CCrypto::SymmetricEncryptWithIV;
	SymmetricDecryptRecoverIVFn decrypt = CCrypto::SymmetricDecryptRecoverIV;

	if ( bEncrypt )
	{
		Encrypt_Detour = new CSimpleDetour((void **) &Encrypt_Orig, (void*) encrypt);
		Encrypt_Detour->Attach();

		g_pLogger->LogConsole( "Detoured SymmetricEncryptWithIV!\n" );
	}
	else
	{
		g_pLogger->LogConsole( "Unable to hook SymmetricEncryptWithIV: Func scan failed.\n" );
	}

	if ( bDecrypt )
	{
		Decrypt_Detour = new CSimpleDetour((void **) &Decrypt_Orig, (void*) decrypt);
		Decrypt_Detour->Attach();

		g_pLogger->LogConsole( "Detoured SymmetricDecryptRecoverIV!\n" );
	}
	else
	{
		g_pLogger->LogConsole( "Unable to hook SymmetricDecryptRecoverIV: Func scan failed.\n" );
	}
}
Пример #17
0
void UserMessages::OnMessageEnd_Pre()
{
	if (!m_InHook)
	{
		UM_RETURN_META(MRES_IGNORED);
	}

	MsgList *pList;
	MsgIter iter;
	ListenerInfo *pInfo;

	ResultType res;
	bool intercepted = false;
	bool handled = false;

	pList = &m_msgIntercepts[m_CurId];
	for (iter=pList->begin(); iter!=pList->end(); )
	{
		pInfo = (*iter);
		pInfo->IsHooked = true;
#ifdef USE_PROTOBUF_USERMESSAGES
		res = pInfo->Callback->InterceptUserMessage(m_CurId, m_InterceptBuffer, m_CurRecFilter);
#else
		res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter);
#endif

		intercepted = true;

		switch (res)
		{
		case Pl_Stop:
			{
				if (pInfo->KillMe)
				{
					pList->erase(iter);
					m_FreeListeners.push(pInfo);
					_DecRefCounter();
					goto supercede;
				}
				pInfo->IsHooked = false;
				goto supercede;
			}
		case Pl_Handled:
			{
				handled = true;
				if (pInfo->KillMe)
				{
					iter = pList->erase(iter);
					m_FreeListeners.push(pInfo);
					_DecRefCounter();
					continue;
				}
				break;
			}
		default:
			{
				if (pInfo->KillMe)
				{
					iter = pList->erase(iter);
					m_FreeListeners.push(pInfo);
					_DecRefCounter();
					continue;
				}
				break;
			}
		}
		pInfo->IsHooked = false;
		iter++;
	}

	if (!handled && intercepted)
	{
#if SOURCE_ENGINE == SE_CSGO
		ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(*m_CurRecFilter), m_CurId, *m_InterceptBuffer);
#else
		bf_write *engine_bfw;
#if SOURCE_ENGINE >= SE_LEFT4DEAD
		engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId, g_SMAPI->GetUserMessage(m_CurId));
#else
		engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId);
#endif
		m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten());
		engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten());
		ENGINE_CALL(MessageEnd)();
#endif // SE_CSGO
	}

	{
#if SOURCE_ENGINE == SE_CSGO
		int size = m_OrigBuffer->ByteSize();
		uint8 *data = (uint8 *)stackalloc(size);
		m_OrigBuffer->SerializePartialToArray(data, size);

		protobuf::Message *pTempMsg = GetMessagePrototype(m_CurId)->New();
		pTempMsg->ParsePartialFromArray(data, size);
#else
		bf_write *pTempMsg = m_OrigBuffer;
#endif

		pList = &m_msgHooks[m_CurId];
		for (iter=pList->begin(); iter!=pList->end(); )
		{
			pInfo = (*iter);
			pInfo->IsHooked = true;
			pInfo->Callback->OnUserMessage(m_CurId, pTempMsg, m_CurRecFilter);

			if (pInfo->KillMe)
			{
				iter = pList->erase(iter);
				m_FreeListeners.push(pInfo);
				_DecRefCounter();
				continue;
			}

			pInfo->IsHooked = false;
			iter++;
		}

#if SOURCE_ENGINE == SE_CSGO
		delete pTempMsg;
#endif
	}

	UM_RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED);
supercede:
	m_BlockEndPost = true;
	UM_RETURN_META(MRES_SUPERCEDE);
}
Пример #18
0
int main( int argc, char **argv )
{
    bool report_mismatches = qstrcmp(getenv("REPORT_MISMATCHES"), "no");

    if (argc != 3) {
        qWarning("usage: %s english-XML translated-XML", argv[0]);
        exit(1);
    }

    MsgList english = parseXML(argv[1]);
    MsgList translated = parseXML(argv[2]);

    QMap<QString, int>::ConstIterator eit2 = english.pc.anchors.begin();

    QMap<int, QString> errors;

    while (eit2 != english.pc.anchors.end())
    {
        if (eit2.data() == translated.pc.anchors[eit2.key()]) {
            QString key = eit2.key();
            eit2++;
            translated.pc.anchors.remove(key);
            english.pc.anchors.remove(key);
        } else {
            errors[eit2.data()] = eit2.key();
            eit2++;
        }
    }

    if (report_mismatches && errors.count()) {
        for (QMap<int, QString>::ConstIterator it = errors.begin(); it != errors.end(); ++it)
        {
            if (translated.pc.anchors.contains(it.data()))
                fprintf(stderr, "id=\"%s\" not in the same paragraphs (%d vs %d)\n", it.data().latin1(),
                        english.pc.anchors[it.data()], translated.pc.anchors[it.data()]);
            else {
                fprintf(stderr, "id=\"%s\" not in the translated paragraphs (it's in paragraph %d in english)\n",
                        it.data().latin1(), english.pc.anchors[it.data()]);
            }
        }
        ::exit(1);
    }

    MsgList::ConstIterator tit = translated.begin();
    for (MsgList::Iterator it = english.begin();
         it != english.end() && tit != translated.end();
         ++tit, ++it)
    {
        (*it).msgstr = (*tit).msgid;
    }

    bool have_roles_of_translators = false;
    bool have_credit_for_translators = false;

    QMap<QString, int> msgids;
    int index = 0;

    for (MsgList::Iterator it = english.begin();
         it != english.end(); )
    {
	if ((*it).msgid == "ROLES_OF_TRANSLATORS") {
            if ((*it).msgstr.length() && !(*it).msgstr.contains("ROLES_OF_TRANSLATORS")) {
	        have_roles_of_translators = true; 
            }
            else {
                MsgList::Iterator tmp = it;
	        ++it;
	        english.remove(tmp);
            }
            continue;
	}

        if ((*it).msgid == "CREDIT_FOR_TRANSLATORS") {
            if ((*it).msgstr.length() && !(*it).msgstr.contains("CREDIT_FOR_TRANSLATORS")) {
	        have_credit_for_translators = true; 
            }
            else {
                MsgList::Iterator tmp = it;
	        ++it;
	        english.remove(tmp);
            }
            continue;
	}

        if (msgids.contains((*it).msgid)) {
            english[msgids[(*it).msgid]].lines += (*it).lines;
            if (english[msgids[(*it).msgid]].msgstr != (*it).msgstr) {
                fprintf(stderr, "two different translations for \"%s\" (\"%s\" and \"%s\") - choosing first one\n",
                        (*it).msgid.latin1(),
                        english[msgids[(*it).msgid]].msgstr.local8Bit().data(),
                        (*it).msgstr.local8Bit().data());

            }
            MsgList::Iterator tmp = it;
            it++;
            english.remove(tmp);
        } else {
            msgids.insert((*it).msgid, index);
            index++;
            it++;
        }
    }

    int counter = 1;

    while (tit != translated.end())
    {
        MsgBlock mb;
        mb.msgid = QString::fromLatin1("appended paragraph %1").arg(counter++);
        mb.msgstr = (*tit).msgid;
        mb.lines += (*tit).lines;
        english.append(mb);
        tit++;
    }

    cout << "#, fuzzy\n";
    cout << "msgid \"\"\n";
    cout << "msgstr \"\"\n";
    cout << "\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n";
    cout << "\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n";
    cout << "\"Content-Type: text/plain; charset=utf-8\\n\"\n";

    for (MsgList::ConstIterator it = english.begin();
         it != english.end(); ++it)
    {
        cout << "#: ";
        for (QValueList<BlockInfo>::ConstIterator it2 =
                 (*it).lines.begin(); it2 != (*it).lines.end(); it2++) {
            if (it2 != (*it).lines.begin())
                cout << ", ";
            cout << "index.docbook:" << (*it2).start_line;

        }
        cout << "\n";
        outputMsg("msgid", StructureParser::descapeLiterals( (*it).msgid ));
        outputMsg("msgstr", StructureParser::descapeLiterals( (*it).msgstr ));
        cout << "\n";
    }

    if ( !getenv( "NO_CREDITS" ) ) {

        if ( !have_roles_of_translators ) {
            outputMsg("msgid", "ROLES_OF_TRANSLATORS");
            outputMsg("msgstr", "<!--TRANS:ROLES_OF_TRANSLATORS-->");
            cout << "\n";
        }

	if ( !have_credit_for_translators) {
           outputMsg("msgid", "CREDIT_FOR_TRANSLATORS");
           outputMsg("msgstr", "<!--TRANS:CREDIT_FOR_TRANSLATORS-->");
           cout << "\n";
        }
    }

    return 0;
}
Пример #19
0
void UserMessages::OnMessageEnd_Pre()
{
	if (!m_InHook)
	{
		RETURN_META(MRES_IGNORED);
	}

	MsgList *pList;
	MsgIter iter;
	ListenerInfo *pInfo;

	ResultType res;
	bool intercepted = false;
	bool handled = false;

	pList = &m_msgIntercepts[m_CurId];
	for (iter=pList->begin(); iter!=pList->end(); )
	{
		pInfo = (*iter);
		pInfo->IsHooked = true;
		res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter);

		intercepted = true;

		switch (res)
		{
		case Pl_Stop:
			{
				if (pInfo->KillMe)
				{
					pList->erase(iter);
					m_FreeListeners.push(pInfo);
					_DecRefCounter();
					goto supercede;
				}
				pInfo->IsHooked = false;
				goto supercede;
			}
		case Pl_Handled:
			{
				handled = true;
				if (pInfo->KillMe)
				{
					iter = pList->erase(iter);
					m_FreeListeners.push(pInfo);
					_DecRefCounter();
					continue;
				}
				break;
			}
		default:
			{
				if (pInfo->KillMe)
				{
					iter = pList->erase(iter);
					m_FreeListeners.push(pInfo);
					_DecRefCounter();
					continue;
				}
				break;
			}
		}
		pInfo->IsHooked = false;
		iter++;
	}

	if (handled)
	{
		goto supercede;
	}

	if (intercepted)
	{
		bf_write *engine_bfw;

		engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId);
		m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten());
		engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten());
		ENGINE_CALL(MessageEnd)();
	}

	pList = &m_msgHooks[m_CurId];
	for (iter=pList->begin(); iter!=pList->end(); )
	{
		pInfo = (*iter);
		pInfo->IsHooked = true;
		pInfo->Callback->OnUserMessage(m_CurId, m_OrigBuffer, m_CurRecFilter);

		if (pInfo->KillMe)
		{
			iter = pList->erase(iter);
			m_FreeListeners.push(pInfo);
			_DecRefCounter();
			continue;
		}

		pInfo->IsHooked = false;
		iter++;
	}

	RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED);
supercede:
	m_InHook = false;
	m_BlockEndPost = true;
	RETURN_META(MRES_SUPERCEDE);
}