void CIcqProto::icq_LogUsingErrorCode(int level, DWORD dwError, const char *szMsg) { char szBuf[1024]; char str[1024]; char str2[64]; char szErrorMsg[512]; char *pszErrorMsg = NULL; int bNeedFree = FALSE; switch (dwError) { case ERROR_TIMEOUT: case WSAETIMEDOUT: pszErrorMsg = LPGEN("The server did not respond to the connection attempt within a reasonable time, it may be temporarily down. Try again later."); break; case ERROR_GEN_FAILURE: pszErrorMsg = LPGEN("The connection with the server was abortively closed during the connection attempt. You may have lost your local network connection."); break; case WSAEHOSTUNREACH: case WSAENETUNREACH: pszErrorMsg = LPGEN("Miranda was unable to resolve the name of a server to its numeric address. This is most likely caused by a catastrophic loss of your network connection (for example, your modem has disconnected), but if you are behind a proxy, you may need to use the 'Resolve hostnames through proxy' option in M->Options->Network."); break; case WSAEHOSTDOWN: case WSAENETDOWN: case WSAECONNREFUSED: pszErrorMsg = LPGEN("Miranda was unable to make a connection with a server. It is likely that the server is down, in which case you should wait for a while and try again later."); break; case ERROR_ACCESS_DENIED: pszErrorMsg = LPGEN("Your proxy rejected the user name and password that you provided. Please check them in M->Options->Network."); break; case WSAHOST_NOT_FOUND: case WSANO_DATA: pszErrorMsg = LPGEN("The server to which you are trying to connect does not exist. Check your spelling in M->Options->Network->ICQ."); break; default: TCHAR err[512]; if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, 0, err, _countof(err), NULL)) { pszErrorMsg = make_utf8_string(err); bNeedFree = TRUE; } break; } mir_snprintf(szBuf, _countof(szBuf), "%s%s%s (%s %d)", szMsg ? ICQTranslateUtfStatic(szMsg, str, 1024) : "", szMsg ? "\r\n\r\n" : "", ICQTranslateUtfStatic(pszErrorMsg, szErrorMsg, 512), ICQTranslateUtfStatic(LPGEN("error"), str2, 64), dwError); if (bNeedFree) SAFE_FREE(&pszErrorMsg); icq_LogMessage(level, szBuf); }
void SetChatTopic(const TCHAR *szChatId, TCHAR *szTopic, BOOL bSet) { MCONTACT hContact = find_chat (szChatId); char *szUTFTopic; GCDEST gcd = { SKYPE_PROTONAME, szChatId, GC_EVENT_TOPIC }; GCEVENT gce = { sizeof(gce), &gcd }; gce.ptszText = szTopic; gce.dwFlags = GCEF_ADDTOLOG; gce.time = (DWORD)time (NULL); CallService(MS_GC_EVENT, 0, (LPARAM)&gce); gcd.iType = GC_EVENT_SETSBTEXT; CallService(MS_GC_EVENT, 0, (LPARAM)&gce); if (bSet) { #ifdef _UNICODE szUTFTopic=(char*)make_utf8_string(szTopic); #else if (utf8_encode(szTopic, &szUTFTopic)==-1) szUTFTopic = NULL; #endif if (szUTFTopic) { SkypeSend ("ALTER CHAT "STR" SETTOPIC %s", szChatId, szUTFTopic); free (szUTFTopic); } testfor ("ALTER CHAT SETTOPIC", INFINITE); } if (hContact) db_set_ts(hContact, SKYPE_PROTONAME, "Nick", szTopic); }
void CIcqProto::setStatusMsgVar(HANDLE hContact, char* szStatusMsg, bool isAnsi) { if (szStatusMsg && szStatusMsg[0]) { if (isAnsi) { char* szStatusNote = getSettingStringUtf(hContact, DBSETTING_STATUS_NOTE, ""); wchar_t* szStatusNoteW = make_unicode_string(szStatusNote); int len = (int)wcslen(szStatusNoteW) * 3 + 1; char* szStatusNoteAnsi = (char*)alloca(len); WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, szStatusNoteW, -1, szStatusNoteAnsi, len, NULL, NULL); bool notmatch = false; for (int i=0; ;++i) { if (szStatusNoteAnsi[i] != szStatusMsg[i] && szStatusNoteAnsi[i] != '?' && szStatusMsg[i] != '?') { notmatch = true; break; } if (!szStatusNoteAnsi[i] || !szStatusMsg[i]) break; } szStatusMsg = notmatch ? ansi_to_utf8(szStatusMsg) : szStatusNote; SAFE_FREE(&szStatusNoteW); if (notmatch) SAFE_FREE(&szStatusNote); } char* oldStatusMsg = NULL; DBVARIANT dbv; if (!DBGetContactSetting(hContact, "CList", "StatusMsg", &dbv)) { switch (dbv.type) { case DBVT_UTF8: oldStatusMsg = null_strdup(dbv.pszVal); break; case DBVT_WCHAR: oldStatusMsg = make_utf8_string(dbv.pwszVal); break; } ICQFreeVariant(&dbv); } if (!oldStatusMsg || strcmp(oldStatusMsg, szStatusMsg)) setSettingStringUtf(hContact, "CList", "StatusMsg", szStatusMsg); SAFE_FREE(&oldStatusMsg); if (isAnsi) SAFE_FREE(&szStatusMsg); } else DBDeleteContactSetting(hContact, "CList", "StatusMsg"); }
static void LoadSaveSkype(SkypeProfile *pstProf, BOOL bSet) { #pragma warning (push) #pragma warning (disable: 4204) // nonstandard extension used : non-constant aggregate initializer #define ENTRY(x,y) {x, pstProf->y, sizeof(pstProf->y)/sizeof(pstProf->y[0]), sizeof(pstProf->y[0])} const struct { char *pszSetting; LPVOID lpDest; int iSize; char cType; } astSettings[] = { ENTRY("FULLNAME", FullName), ENTRY("PHONE_HOME", HomePhone), ENTRY("PHONE_OFFICE", OfficePhone), ENTRY("HOMEPAGE", HomePage), ENTRY("CITY", City), ENTRY("PROVINCE", Province) }; #pragma warning (pop) #undef ENTRY char *ptr; int i; if (bSet) { char *pBuf, szBirthday[16]; for (i=0; i<sizeof(astSettings)/sizeof(astSettings[0]); i++) { if ((astSettings[i].cType == sizeof(char) && utf8_encode((const char*)astSettings[i].lpDest, &pBuf) != -1) || (astSettings[i].cType == sizeof(WCHAR) && (pBuf = (char*)make_utf8_string((const WCHAR*)astSettings[i].lpDest)))) { SkypeSetProfile (astSettings[i].pszSetting, pBuf); free (pBuf); } } switch (pstProf->Sex) { case 0x4D: SkypeSetProfile ("SEX", "MALE"); break; case 0x46: SkypeSetProfile ("SEX", "FEMALE"); break; } sprintf (szBirthday, "%04d%02d%02d", pstProf->Birthday.wYear, pstProf->Birthday.wMonth, pstProf->Birthday.wDay); SkypeSetProfile ("BIRTHDAY", szBirthday); } else { for (i=0; i<sizeof(astSettings)/sizeof(astSettings[0]); i++) { if (ptr=SkypeGetProfile(astSettings[i].pszSetting)) { if (astSettings[i].cType == sizeof(char)) { char *pBuf; if (utf8_decode (ptr, &pBuf) != -1) { strncpy ((char*)astSettings[i].lpDest, pBuf, astSettings[i].iSize); free (pBuf); } } else { WCHAR *pBuf; if (pBuf = make_unicode_string((const unsigned char*)ptr)) { wcsncpy ((WCHAR*)astSettings[i].lpDest, pBuf, astSettings[i].iSize); free (pBuf); } } free (ptr); } } if (ptr=SkypeGetProfile("SEX")) { if (!_stricmp(ptr, "MALE")) pstProf->Sex=0x4D; else if (!_stricmp(ptr, "FEMALE")) pstProf->Sex=0x46; free (ptr); } if (ptr=SkypeGetProfile("BIRTHDAY")) { if (*ptr != '0') sscanf(ptr, "%04hd%02hd%02hd", &pstProf->Birthday.wYear, &pstProf->Birthday.wMonth, &pstProf->Birthday.wDay); free(ptr); } } }
int GCEventHook(WPARAM wParam,LPARAM lParam) { GCHOOK *gch = (GCHOOK*) lParam; gchat_contacts *gc = GetChat(gch->pDest->ptszID); UNREFERENCED_PARAMETER(wParam); if(gch) { if (!_stricmp(gch->pDest->pszModule, SKYPE_PROTONAME)) { switch (gch->pDest->iType) { case GC_SESSION_TERMINATE: { MCONTACT hContact; if (gc->mJoinedCount == 1) { // switch back to normal session // I don't know if this behaviour isn't a bit annoying, therefore, we // don't do this now, until a user requests this feature :) // open up srmm dialog when quit while 1 person left // CallService(MS_MSG_SENDMESSAGE, (WPARAM)gc->mJoinedContacts[0].hContact, 0); RemChatContact(gc, gc->mJoinedContacts[0].who); } // Delete Chatroom from Contact list, as we don't need it anymore...? if (hContact = find_chat(gc->szChatName)) CallService(MS_DB_CONTACT_DELETE, hContact, 0); RemChat(gc->szChatName); break; } case GC_USER_MESSAGE: if(gch && gch->ptszText && _tcslen(gch->ptszText) > 0) { DBVARIANT dbv, dbv2; CCSDATA ccs = {0}; TCHAR *pEnd; // remove the ending linebreak for (pEnd = &gch->ptszText[_tcslen(gch->ptszText) - 1]; *pEnd==_T('\r') || *pEnd==_T('\n'); pEnd--) *pEnd=0; // Send message to the chat-contact if (ccs.hContact = find_chat(gch->pDest->ptszID)) { #ifdef _UNICODE // If PREF_UTF is supported, just convert it to UTF8 and pass the buffer to PSS_MESSAGE if (mirandaVersion >= 0x070000) { ccs.lParam = (LPARAM)make_utf8_string(gch->ptszText); ccs.wParam = PREF_UTF; CallProtoService (SKYPE_PROTONAME, PSS_MESSAGE, 0, (LPARAM)&ccs); free ((void*)ccs.lParam); } else { // Otherwise create this strange dual miranda-format ccs.lParam = (LPARAM)calloc(3, _tcslen(gch->ptszText)+1); wcstombs ((char*)ccs.lParam, gch->ptszText, _tcslen(gch->ptszText)+1); _tcscpy ((TCHAR*)((char*)ccs.lParam+strlen((char*)ccs.lParam)+1), gch->ptszText); ccs.wParam = PREF_UNICODE; CallProtoService (SKYPE_PROTONAME, PSS_MESSAGE, 0, (LPARAM)&ccs); free ((void*)ccs.lParam); } #else ccs.lParam = (LPARAM)gch->ptszText; ccs.wParam = PREF_TCHAR; CallProtoService (SKYPE_PROTONAME, PSS_MESSAGE, 0, (LPARAM)&ccs); #endif } // Add our line to the chatlog GCDEST gcd = { gch->pDest->pszModule, gch->pDest->ptszID, 0 }; GCEVENT gce = { sizeof(gce), &gcd }; if ( _tcsncmp(gch->ptszText, _T("/me "), 4)==0 && _tcslen(gch->ptszText)>4) { gce.ptszText = gch->ptszText+4; gcd.iType = GC_EVENT_ACTION; } else { gce.ptszText = gch->ptszText; gcd.iType = GC_EVENT_MESSAGE; } if (db_get_ts(NULL, SKYPE_PROTONAME, "Nick", &dbv)) gce.ptszNick = TranslateT("Me"); else gce.ptszNick = dbv.ptszVal; db_get_ts(NULL, SKYPE_PROTONAME, SKYPE_NAME, &dbv2); gce.ptszUID = dbv2.ptszVal; gce.time = (DWORD)time(NULL); gce.dwFlags = GCEF_ADDTOLOG; gce.bIsMe = TRUE; CallService(MS_GC_EVENT, 0, (LPARAM)&gce); if (dbv.pszVal) db_free(&dbv); if (dbv2.pszVal) db_free(&dbv2); } break; case GC_USER_CHANMGR: InviteUser(gch->pDest->ptszID); break; case GC_USER_PRIVMESS: { MCONTACT hContact = find_contactT(gch->ptszUID); if (hContact) CallService(MS_MSG_SENDMESSAGE, hContact, 0); break; } case GC_USER_LOGMENU: switch(gch->dwData) { case 10: InviteUser(gch->pDest->ptszID); break; case 20: KillChatSession(gch->pDest); break; case 30: { TCHAR *ptr, buf[MAX_BUF]; ptr = SkypeGetT ("CHAT", (TCHAR*)gch->pDest->ptszID, "TOPIC"); _tcscpy(buf, ptr); free(ptr); if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_INPUTBOX), NULL, InputBoxDlgProc, (LPARAM)&buf)) SetChatTopic(gch->pDest->ptszID, buf, TRUE); break; } } break; case GC_USER_NICKLISTMENU: { MCONTACT hContact = find_contactT(gch->ptszUID); switch(gch->dwData) { case 10:CallService(MS_USERINFO_SHOWDIALOG, hContact, 0); break; case 20:CallService(MS_HISTORY_SHOWCONTACTHISTORY, hContact, 0); break; case 30: KickUser(hContact, gch); break; case 110: KillChatSession(gch->pDest); break; } break; } default: break; } } } return 0; }