char* bbcodes_to_html(const char *src) { wchar_t* buf=new wchar_t[strlen(src)+1]; MultiByteToWideChar(CP_ACP, 0, src, -1,buf,(strlen(src)+1)*2); wchar_t* stripped_buf=bbcodes_to_html(buf); delete[] buf; char* dest=new char[wcslen(stripped_buf)+1]; WideCharToMultiByte( CP_ACP, 0, stripped_buf, -1,dest,wcslen(stripped_buf)+1, NULL, NULL ); delete[] stripped_buf; return dest; }
int __cdecl CAimProto::SendMsg(MCONTACT hContact, int flags, const char* pszSrc) { if (pszSrc == NULL) return 0; if (state != 1) { msg_ack_param *msg_ack = (msg_ack_param*)mir_calloc(sizeof(msg_ack_param)); msg_ack->hContact = hContact; msg_ack->msg = "Message cannot be sent, when protocol offline"; ForkThread(&CAimProto::msg_ack_success, msg_ack); } char *sn = getStringA(hContact, AIM_KEY_SN); if (sn == NULL) { msg_ack_param *msg_ack = (msg_ack_param*)mir_calloc(sizeof(msg_ack_param)); msg_ack->hContact = hContact; msg_ack->msg = "Screen Name for the contact not available"; ForkThread(&CAimProto::msg_ack_success, msg_ack); } char* msg; if (flags & PREF_UNICODE) { const char* p = strchr(pszSrc, '\0'); if (p != pszSrc) { while (*(++p) == '\0'); } msg = mir_utf8encodeW((wchar_t*)p); } else if (flags & PREF_UTF) msg = mir_strdup(pszSrc); else msg = mir_utf8encode(pszSrc); char* smsg = html_encode(msg); mir_free(msg); if (getByte(AIM_KEY_FO, 1)) { msg = bbcodes_to_html(smsg); mir_free(smsg); } else msg = smsg; bool blast = getBool(hContact, AIM_KEY_BLS, false); int res = aim_send_message(hServerConn, seqno, sn, msg, false, blast); mir_free(msg); mir_free(sn); if (!res || blast || 0 == getByte(AIM_KEY_DC, 1)) { msg_ack_param *msg_ack = (msg_ack_param*)mir_alloc(sizeof(msg_ack_param)); msg_ack->hContact = hContact; msg_ack->msg = NULL; msg_ack->id = res; msg_ack->success = res != 0; ForkThread(&CAimProto::msg_ack_success, msg_ack); } return res; }