本文整理汇总了C++中KviCString::cutLeft方法的典型用法代码示例。如果您正苦于以下问题:C++ KviCString::cutLeft方法的具体用法?C++ KviCString::cutLeft怎么用?C++ KviCString::cutLeft使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类KviCString
的用法示例。
在下文中一共展示了KviCString::cutLeft方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: decrypt
KviCryptEngine::DecryptResult KviMircryptionEngine::decrypt(const char * inBuffer, KviCString & plainText)
{
plainText = "";
KviCString szIn = inBuffer;
// various old versions
if(kvi_strEqualCSN(inBuffer, "mcps ", 5))
szIn.cutLeft(5);
else if(kvi_strEqualCSN(inBuffer, "+OK ", 4))
szIn.cutLeft(4);
else if(kvi_strEqualCSN(inBuffer, "OK ", 3)) // some servers strip out the +
szIn.cutLeft(3);
else
{
plainText = szIn;
return KviCryptEngine::DecryptOkWasPlainText;
}
if(m_bDecryptCBC)
return doDecryptCBC(szIn, plainText) ? KviCryptEngine::DecryptOkWasEncrypted : KviCryptEngine::DecryptError;
return doDecryptECB(szIn, plainText) ? KviCryptEngine::DecryptOkWasEncrypted : KviCryptEngine::DecryptError;
}
示例2: bufferFromBlock
void bufferFromBlock(KviCString & szBuffer)
{
szBuffer.trim();
if((*(szBuffer.ptr()) == '{') && szBuffer.lastCharIs('}'))
{
// leading and trailing { must be stripped
szBuffer.cutLeft(1);
szBuffer.cutRight(1);
}
unindent(szBuffer);
szBuffer.trim();
}
示例3: doDecryptCBC
bool KviMircryptionEngine::doDecryptCBC(KviCString & encoded, KviCString & plain)
{
if(*(encoded.ptr()) != '*')
{
qDebug("WARNING: specified a CBC key but the incoming message doesn't seem to be a CBC one");
return doDecryptECB(encoded, plain);
}
encoded.cutLeft(1);
char * tmpBuf;
int len = encoded.base64ToBuffer(&tmpBuf, false);
if(len < 0)
{
setLastError(__tr2qs("The message is not a base64 string: this is not my stuff"));
return false;
}
if((len < 8) || (len % 8))
{
setLastError(__tr2qs("The message doesn't seem to be encoded with CBC Mircryption"));
if(len > 0)
KviCString::freeBuffer(tmpBuf);
return false;
}
plain.setLen(len);
BlowFish bf((unsigned char *)m_szDecryptKey.ptr(), m_szDecryptKey.len());
bf.ResetChain();
bf.Decrypt((unsigned char *)tmpBuf, (unsigned char *)plain.ptr(), len, BlowFish::CBC);
// kill the first 8 bytes (random IV)
plain.cutLeft(8);
KviCString::freeBuffer(tmpBuf);
return true;
}
示例4: handleUserhost
bool KviIsOnNotifyListManager::handleUserhost(KviIrcMessage * msg)
{
if(!m_bExpectingUserhost)
return false;
// first check for consistency: all the replies must be on the USERHOST list
KviPointerList<KviIrcMask> tmplist;
tmplist.setAutoDelete(true);
KviCString nk;
const char * aux = msg->trailing();
while(*aux)
{
nk = "";
aux = kvi_extractToken(nk, aux, ' ');
if(nk.hasData())
{
// split it in a mask
KviCString nick;
KviCString user;
KviCString host;
int idx = nk.findFirstIdx('=');
if(idx != -1)
{
nick = nk.left(idx);
if(nick.lastCharIs('*'))
nick.cutRight(1);
nk.cutLeft(idx + 1);
if(nk.firstCharIs('+') || nk.firstCharIs('-'))
nk.cutLeft(1);
idx = nk.findFirstIdx('@');
if(idx != -1)
{
user = nk.left(idx);
nk.cutLeft(idx + 1);
host = nk;
}
else
{
user = "*";
host = nk;
}
bool bGotIt = false;
QString szNick = m_pConnection->decodeText(nick.ptr());
QString szUser = m_pConnection->decodeText(user.ptr());
QString szHost = m_pConnection->decodeText(host.ptr());
for(QString * s = m_pUserhostList->first(); s && (!bGotIt); s = m_pUserhostList->next())
{
if(KviQString::equalCI(*s, szNick))
{
KviIrcMask * mk = new KviIrcMask(szNick, szUser, szHost);
tmplist.append(mk);
bGotIt = true;
m_pUserhostList->removeRef(s);
}
}
if(!bGotIt)
{
// ops...not my userhost!
if(_OUTPUT_VERBOSE)
m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Hey! You've used USERHOST behind my back? (I might be confused now...)"));
return false;
}
}
else
{
if(_OUTPUT_VERBOSE)
m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Broken USERHOST reply from the server? (%s)"), nk.ptr());
}
}
}
// Ok...looks to be my usershot (still not sure at 100%, but can't do better)
if(m_pConnection->lagMeter())
m_pConnection->lagMeter()->lagCheckComplete("@notify_userhost");
m_bExpectingUserhost = false;
for(KviIrcMask * mk = tmplist.first(); mk; mk = tmplist.next())
{
if(!doMatchUser(mk->nick(), *mk))
return true; // have to restart!!!
}
if(!(m_pUserhostList->isEmpty()))
{
// ops...someone is no longer online ?
while(QString * s = m_pUserhostList->first())
{
if(_OUTPUT_VERBOSE)
m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: \r!n\r%Q\r appears to have gone offline before USERHOST reply was received, will recheck in the next loop"), s);
m_pUserhostList->removeFirst();
}
}
//.........这里部分代码省略.........
示例5: processHeader
bool KviHttpRequest::processHeader(KviCString &szHeader)
{
int idx = szHeader.findFirstIdx("\r\n");
KviCString szResponse;
if(idx != -1)
{
szResponse = szHeader.left(idx);
szHeader.cutLeft(idx + 2);
} else {
szResponse = szHeader;
szHeader = "";
}
szResponse.trim();
bool bValid = false;
unsigned int uStatus = 0;
// check the response value
if(kvi_strEqualCSN(szResponse.ptr(),"HTTP",4))
{
KviCString szR = szResponse;
szR.cutToFirst(' ');
szR.trim();
int idx = szR.findFirstIdx(' ');
KviCString szNumber;
if(idx != -1)szNumber = szR.left(idx);
else szNumber = szR;
bool bOk;
uStatus = szNumber.toUInt(&bOk);
if(bOk)bValid = true;
}
QString szUniResponse = QString::fromUtf8(szResponse.ptr());
if(!bValid)
{
// the response is invalid ?
resetInternalStatus();
m_szLastError = __tr2qs("Invalid HTTP response: %1").arg(szUniResponse);
emit terminated(false);
return false;
}
emit status(__tr2qs("Received HTTP response: %1").arg(szUniResponse));
KviPointerList<KviCString> hlist;
hlist.setAutoDelete(true);
idx = szHeader.findFirstIdx("\r\n");
while(idx != -1)
{
if(idx > 0)
{
hlist.append(new KviCString(szHeader.ptr(),idx));
szHeader.cutLeft(idx + 2);
}
idx = szHeader.findFirstIdx("\r\n");
}
if(szHeader.hasData())hlist.append(new KviCString(szHeader));
KviPointerHashTable<const char *,KviCString> hdr(11,false,true);
hdr.setAutoDelete(true);
for(KviCString * s = hlist.first();s;s = hlist.next())
{
idx = s->findFirstIdx(":");
if(idx != -1)
{
KviCString szName = s->left(idx);
s->cutLeft(idx + 1);
s->trim();
hdr.replace(szName.ptr(),new KviCString(*s));
//qDebug("FOUND HEADER (%s)=(%s)",szName.ptr(),s->ptr());
}
}
KviCString * size = hdr.find("Content-length");
if(size)
{
bool bOk;
m_uTotalSize = size->toUInt(&bOk);
if(!bOk)m_uTotalSize = 0;
}
KviCString * contentEncoding = hdr.find("Content-encoding");
if(contentEncoding)
{
m_bGzip = contentEncoding->equalsCI("gzip");
}
KviCString * transferEncoding = hdr.find("Transfer-Encoding");
if(transferEncoding)
{
if(kvi_strEqualCI(transferEncoding->ptr(),"chunked"))
{
// be prepared to handle the chunked transfer encoding as required by HTTP/1.1
m_bChunkedTransferEncoding = true;
m_uRemainingChunkSize = 0;
//.........这里部分代码省略.........
示例6: event
bool DccChatWindow::event(QEvent * e)
{
if(e->type() == KVI_THREAD_EVENT)
{
switch(((KviThreadEvent *)e)->id())
{
case KVI_DCC_THREAD_EVENT_ERROR:
{
KviError::Code * pError = ((KviThreadDataEvent<KviError::Code> *)e)->getData();
QString szErr = KviError::getDescription(*pError);
if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatError, this, szErr, m_pDescriptor->idString()))
output(KVI_OUT_DCCERROR, __tr2qs_ctx("ERROR: %Q", "dcc"), &szErr);
KVS_TRIGGER_EVENT_1(KviEvent_OnDCCChatDisconnected, this, m_pDescriptor->idString());
delete pError;
return true;
}
break;
case KVI_DCC_THREAD_EVENT_DATA:
{
KviCString * encoded = ((KviThreadDataEvent<KviCString> *)e)->getData();
KviCString d = KviCString(decodeText(encoded->ptr()));
if(d.firstCharIs(0x01))
{
d.cutLeft(1);
if(d.lastCharIs(0x01))
d.cutRight(1);
if(kvi_strEqualCIN("ACTION", d.ptr(), 6))
d.cutLeft(6);
d.stripLeftWhiteSpace();
output(KVI_OUT_ACTION, "%Q %s", &(m_pDescriptor->szNick), d.ptr());
if(!hasAttention(KviWindow::MainWindowIsVisible))
{
if(KVI_OPTION_BOOL(KviOption_boolFlashDccChatWindowOnNewMessages))
{
demandAttention();
}
if(KVI_OPTION_BOOL(KviOption_boolPopupNotifierOnNewDccChatMessages))
{
QString szMsg = "<b>";
szMsg += m_pDescriptor->szNick;
szMsg += "</b> ";
szMsg += KviQString::toHtmlEscaped(QString(d.ptr()));
//qDebug("KviIrcServerParser_ctcp.cpp:975 debug: %s",szMsg.data());
g_pApp->notifierMessage(this, KVI_OPTION_MSGTYPE(KVI_OUT_ACTION).pixId(), szMsg, KVI_OPTION_UINT(KviOption_uintNotifierAutoHideTime));
}
}
}
else
{
#ifdef COMPILE_CRYPT_SUPPORT
if(KviCryptSessionInfo * cinf = cryptSessionInfo())
{
if(cinf->m_bDoDecrypt)
{
KviCString decryptedStuff;
switch(cinf->m_pEngine->decrypt(d.ptr(), decryptedStuff))
{
case KviCryptEngine::DecryptOkWasEncrypted:
case KviCryptEngine::DecryptOkWasEncoded:
case KviCryptEngine::DecryptOkWasPlainText:
if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatMessage, this, QString(decryptedStuff.ptr()), m_pDescriptor->idString()))
{
g_pMainWindow->firstConsole()->outputPrivmsg(this, KVI_OUT_DCCCHATMSG,
m_pDescriptor->szNick.toUtf8().data(), m_pDescriptor->szUser.toUtf8().data(),
m_pDescriptor->szHost.toUtf8().data(), decryptedStuff.ptr());
}
delete encoded;
return true;
break;
default: // also case KviCryptEngine::DecryptError
{
QString szErr = cinf->m_pEngine->lastError();
output(KVI_OUT_SYSTEMERROR,
__tr2qs_ctx("The following message appears to be encrypted, but the encryption engine failed to decode it: %Q", "dcc"),
&szErr);
}
break;
}
}
}
else
{
#endif
// FIXME!
if(!KVS_TRIGGER_EVENT_2_HALTED(KviEvent_OnDCCChatMessage, this, QString(d.ptr()), m_pDescriptor->idString()))
{
g_pMainWindow->firstConsole()->outputPrivmsg(this, KVI_OUT_DCCCHATMSG,
m_pDescriptor->szNick.toUtf8().data(), m_pDescriptor->szUser.toUtf8().data(),
m_pDescriptor->szHost.toUtf8().data(), d.ptr());
if(!hasAttention(KviWindow::MainWindowIsVisible))
{
if(KVI_OPTION_BOOL(KviOption_boolFlashDccChatWindowOnNewMessages))
{
demandAttention();
}
if(KVI_OPTION_BOOL(KviOption_boolPopupNotifierOnNewDccChatMessages))
{
QString szMsg = KviQString::toHtmlEscaped(QString(d.ptr()));
//.........这里部分代码省略.........
示例7: initializeEngine
bool KviCryptController::initializeEngine(KviCryptEngine * pEngine)
{
KviCString szEncryptKey;
KviCString szDecryptKey;
KviCString szEncKey = "";
KviCString szDecKey = "";
if(m_pEnableEncrypt->isChecked())
{
bool bEcb=false, bOld=false;
szEncryptKey = m_pEncryptKeyEdit->text();
if(kvi_strEqualCIN("ecb:",szEncryptKey.ptr(),4) && (szEncryptKey.len() > 4))
{
szEncryptKey.cutLeft(4);
bEcb=true;
} else if(kvi_strEqualCIN("old:",szEncryptKey.ptr(),4) && (szEncryptKey.len() > 4)) {
szEncryptKey.cutLeft(4);
bOld=true;
} else if(kvi_strEqualCIN("cbc:",szEncryptKey.ptr(),4)) {
szEncryptKey.cutLeft(4);
}
if(m_pEncryptHexKeyCheck->isChecked())
{
char * pcTmpKey;
if(szEncryptKey.hexToBuffer(&pcTmpKey,false))
{
szEncKey = pcTmpKey;
KviCString::freeBuffer(pcTmpKey);
}
} else {
szEncKey = szEncryptKey;
}
if(bEcb)
szEncKey.prepend("ecb:");
else if(bOld)
szEncKey.prepend("old:");
}
if(m_pEnableDecrypt->isChecked())
{
bool bEcb=false, bOld=false;
szDecryptKey = m_pDecryptKeyEdit->text();
if(kvi_strEqualCIN("ecb:",szDecryptKey.ptr(),4) && (szDecryptKey.len() > 4))
{
szDecryptKey.cutLeft(4);
bEcb=true;
} else if(kvi_strEqualCIN("old:",szDecryptKey.ptr(),4) && (szDecryptKey.len() > 4)) {
szDecryptKey.cutLeft(4);
bOld=true;
} else if(kvi_strEqualCIN("cbc:",szDecryptKey.ptr(),4)) {
szDecryptKey.cutLeft(4);
}
if(m_pDecryptHexKeyCheck->isChecked())
{
char * pcTmpKey;
if(szDecryptKey.hexToBuffer(&pcTmpKey,false))
{
szDecKey = pcTmpKey;
KviCString::freeBuffer(pcTmpKey);
}
} else {
szDecKey = szDecryptKey;
}
if(bEcb)
szDecKey.prepend("ecb:");
else if(bOld)
szDecKey.prepend("old:");
}
bool bRet = pEngine->init(szEncKey.ptr(),szEncKey.len(),szDecKey.ptr(),szDecKey.len());
return bRet;
}
示例8: handleUserhost
bool KviIsOnNotifyListManager::handleUserhost(KviIrcMessage * msg)
{
if(!m_bExpectingUserhost)
return false;
// first check for consistency: all the replies must be on the USERHOST list
std::map<std::size_t, std::unique_ptr<KviIrcMask>> tmplist;
KviCString nk;
const char * aux = msg->trailing();
while(*aux)
{
nk = "";
aux = kvi_extractToken(nk, aux, ' ');
if(nk.hasData())
{
// split it in a mask
KviCString nick;
KviCString user;
KviCString host;
int idx = nk.findFirstIdx('=');
if(idx != -1)
{
nick = nk.left(idx);
if(nick.lastCharIs('*'))
nick.cutRight(1);
nk.cutLeft(idx + 1);
if(nk.firstCharIs('+') || nk.firstCharIs('-'))
nk.cutLeft(1);
idx = nk.findFirstIdx('@');
if(idx != -1)
{
user = nk.left(idx);
nk.cutLeft(idx + 1);
host = nk;
}
else
{
user = "*";
host = nk;
}
bool bGotIt = false;
QString szNick = m_pConnection->decodeText(nick.ptr());
QString szUser = m_pConnection->decodeText(user.ptr());
QString szHost = m_pConnection->decodeText(host.ptr());
std::size_t i = 0;
for(const auto & s : m_UserhostList)
{
if(KviQString::equalCI(s, szNick))
{
tmplist.emplace(i, std::make_unique<KviIrcMask>(szNick, szUser, szHost));
bGotIt = true;
break;
}
}
if(!bGotIt)
{
// oops... not my userhost!
if(_OUTPUT_VERBOSE)
m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Hey! You've used USERHOST behind my back? (I might be confused now...)"));
return false;
}
}
else
{
if(_OUTPUT_VERBOSE)
m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Broken USERHOST reply from the server? (%s)"), nk.ptr());
}
}
}
// Ok... looks to be my usershot (still not sure at 100%, but can't do better)
if(m_pConnection->lagMeter())
m_pConnection->lagMeter()->lagCheckComplete("@notify_userhost");
m_bExpectingUserhost = false;
for(auto & pair : tmplist)
{
KviIrcMask * mk = pair.second.get();
if(!doMatchUser(mk->nick(), *mk))
return true; // have to restart!!!
}
for(auto i = tmplist.rbegin(); i != tmplist.rend(); ++i)
m_UserhostList.erase(m_UserhostList.begin() + i->first);
for(const auto & s : m_UserhostList)
{
// oops... someone is no longer online ?
if(_OUTPUT_VERBOSE)
m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: \r!n\r%Q\r appears to have gone offline before USERHOST reply was received, will recheck in the next loop"), &s);
//.........这里部分代码省略.........
示例9: init
bool KviRijndaelEngine::init(const char * encKey, int encKeyLen, const char * decKey, int decKeyLen)
{
if(m_pEncryptCipher)
{
delete m_pEncryptCipher;
m_pEncryptCipher = nullptr;
}
if(m_pDecryptCipher)
{
delete m_pDecryptCipher;
m_pDecryptCipher = nullptr;
}
if(encKey && (encKeyLen > 0))
{
if(!(decKey && (decKeyLen > 0)))
{
decKey = encKey;
decKeyLen = encKeyLen;
} // else all
}
else
{
// no encrypt key specified...
if(decKey && decKeyLen)
{
encKey = decKey;
encKeyLen = decKeyLen;
}
else
{
// both keys missing
setLastError(__tr2qs("Missing both encryption and decryption key: at least one is needed"));
return false;
}
}
KviCString szTmpEncryptKey = KviCString(encKey, encKeyLen);
KviCString szTmpDecryptKey = KviCString(decKey, decKeyLen);
m_bEncryptMode = CBC; // default mode
m_bDecryptMode = CBC; // default mode
if(kvi_strEqualCIN("ecb:", szTmpEncryptKey.ptr(), 4) && (szTmpEncryptKey.len() > 4))
{
szTmpEncryptKey.cutLeft(4);
m_bEncryptMode = ECB;
}
else if(kvi_strEqualCIN("old:", szTmpEncryptKey.ptr(), 4) && (szTmpEncryptKey.len() > 4))
{
szTmpEncryptKey.cutLeft(4);
m_bEncryptMode = OldCBC;
}
else if(kvi_strEqualCIN("cbc:", szTmpEncryptKey.ptr(), 4) && (szTmpEncryptKey.len() > 4))
{
szTmpEncryptKey.cutLeft(4);
}
if(kvi_strEqualCIN("ecb:", szTmpDecryptKey.ptr(), 4) && (szTmpDecryptKey.len() > 4))
{
szTmpDecryptKey.cutLeft(4);
m_bDecryptMode = ECB;
}
else if(kvi_strEqualCIN("old:", szTmpDecryptKey.ptr(), 4) && (szTmpDecryptKey.len() > 4))
{
szTmpDecryptKey.cutLeft(4);
m_bDecryptMode = OldCBC;
}
else if(kvi_strEqualCIN("cbc:", szTmpDecryptKey.ptr(), 4) && (szTmpDecryptKey.len() > 4))
{
szTmpDecryptKey.cutLeft(4);
}
int defLen = getKeyLen();
szTmpEncryptKey.padRight(defLen);
szTmpDecryptKey.padRight(defLen);
m_pEncryptCipher = new Rijndael();
int retVal = m_pEncryptCipher->init(
(m_bEncryptMode == ECB) ? Rijndael::ECB : Rijndael::CBC,
Rijndael::Encrypt,
(unsigned char *)szTmpEncryptKey.ptr(),
getKeyLenId());
if(retVal != RIJNDAEL_SUCCESS)
{
delete m_pEncryptCipher;
m_pEncryptCipher = nullptr;
setLastErrorFromRijndaelErrorCode(retVal);
return false;
}
m_pDecryptCipher = new Rijndael();
retVal = m_pDecryptCipher->init(
(m_bEncryptMode == ECB) ? Rijndael::ECB : Rijndael::CBC,
Rijndael::Decrypt,
(unsigned char *)szTmpDecryptKey.ptr(),
getKeyLenId());
if(retVal != RIJNDAEL_SUCCESS)
//.........这里部分代码省略.........
示例10: load
//.........这里部分代码省略.........
KviMemory::free(pcBuffer);
f.close();
return false;
}
// Check for broken *.mo files
if(uSize < (24 + (sizeof(GnuMoStringDescriptor) * iStringsNum)))
{
qDebug("KviLocale: Broken translation file %s (too small for all descriptors)",szCatalogueFile.toUtf8().data());
KviMemory::free(pcBuffer);
f.close();
return false;
}
GnuMoStringDescriptor * pOrigDescriptor = (GnuMoStringDescriptor *)(pcBuffer + KVI_SWAP_IF_NEEDED(bMustSwap,hdr.orig_tab_offset));
GnuMoStringDescriptor * pTransDescriptor = (GnuMoStringDescriptor *)(pcBuffer + KVI_SWAP_IF_NEEDED(bMustSwap,hdr.trans_tab_offset));
// Check again for broken *.mo files
int iExpectedFileSize = KVI_SWAP_IF_NEEDED(bMustSwap,pTransDescriptor[iStringsNum - 1].offset) +
KVI_SWAP_IF_NEEDED(bMustSwap,pTransDescriptor[iStringsNum - 1].length);
if(uSize < (unsigned int)iExpectedFileSize)
{
qDebug("KviLocale: Broken translation file %s (too small for all the message strings)",szCatalogueFile.toUtf8().data());
KviMemory::free(pcBuffer);
f.close();
return false;
}
// Ok...we can run now
int iDictSize = kvi_getFirstBiggerPrime(iStringsNum);
if(m_pMessages)
delete m_pMessages;
m_pMessages = new KviPointerHashTable<const char *,KviTranslationEntry>(iDictSize,true,false); // dictSize, case sensitive, don't copy keys
m_pMessages->setAutoDelete(true);
KviCString szHeader;
for(int i = 0; i < iStringsNum; i++)
{
// FIXME: "Check for NULL inside strings here ?"
//qDebug("original seems to be at %u and %u byttes long",KVI_SWAP_IF_NEEDED(bMustSwap,pOrigDescriptor[i].offset),
// KVI_SWAP_IF_NEEDED(bMustSwap,pOrigDescriptor[i].length));
//qDebug("translated seems to be at %u and %u byttes long",KVI_SWAP_IF_NEEDED(bMustSwap,pTransDescriptor[i].offset),
// KVI_SWAP_IF_NEEDED(bMustSwap,pTransDescriptor[i].length));
KviTranslationEntry * e = new KviTranslationEntry(
(char *)(pcBuffer + KVI_SWAP_IF_NEEDED(bMustSwap,pOrigDescriptor[i].offset)),
KVI_SWAP_IF_NEEDED(bMustSwap,pOrigDescriptor[i].length),
(char *)(pcBuffer + KVI_SWAP_IF_NEEDED(bMustSwap,pTransDescriptor[i].offset)),
KVI_SWAP_IF_NEEDED(bMustSwap,pTransDescriptor[i].length));
// In some (or all?) *.mo files the first string
// is zero bytes long and the translated one contains
// information about the translation
if(e->m_szKey.len() == 0)
{
szHeader = e->m_szEncodedTranslation;
delete e;
continue;
}
m_pMessages->insert(e->m_szKey.ptr(),e);
}
KviMemory::free(pcBuffer);
f.close();
m_pTextCodec = 0;
// find out the text encoding, if possible
if(szHeader.hasData())
{
// find "charset=*\n"
int iIdx = szHeader.findFirstIdx("charset=");
if(iIdx != -1)
{
szHeader.cutLeft(iIdx + 8);
szHeader.cutFromFirst('\n');
szHeader.trim();
m_pTextCodec = KviLocale::instance()->codecForName(szHeader.ptr());
if(!m_pTextCodec)
{
qDebug("Can't find the codec for charset=%s",szHeader.ptr());
qDebug("Falling back to codecForLocale()");
m_pTextCodec = QTextCodec::codecForLocale();
}
}
}
if(!m_pTextCodec)
{
qDebug("The message catalogue does not have a \"charset\" header");
qDebug("Assuming utf8"); // FIXME: or codecForLocale() ?
m_pTextCodec = QTextCodec::codecForName("UTF-8");
}
return true;
}