void CDropbox::SendToContact(MCONTACT hContact, const TCHAR *data) { if (hContact == GetDefaultContact()) { char *message = mir_utf8encodeT(data); AddEventToDb(hContact, EVENTTYPE_MESSAGE, DBEF_UTF, (DWORD)mir_strlen(message), (PBYTE)message); return; } const char *szProto = GetContactProto(hContact); if (db_get_b(hContact, szProto, "ChatRoom", 0) == TRUE) { ptrT tszChatRoom(db_get_tsa(hContact, szProto, "ChatRoomID")); GCDEST gcd = { szProto, tszChatRoom, GC_EVENT_SENDMESSAGE }; GCEVENT gce = { sizeof(gce), &gcd }; gce.bIsMe = TRUE; gce.dwFlags = GCEF_ADDTOLOG; gce.ptszText = mir_tstrdup(data); gce.time = time(NULL); CallServiceSync(MS_GC_EVENT, WINDOW_VISIBLE, (LPARAM)&gce); mir_free((void*)gce.ptszText); return; } char *message = mir_utf8encodeT(data); if (CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)message) != ACKRESULT_FAILED) AddEventToDb(hContact, EVENTTYPE_MESSAGE, DBEF_UTF | DBEF_SENT, (DWORD)mir_strlen(message), (PBYTE)message); }
INT_PTR CDropbox::SendFileToDropbox(WPARAM hContact, LPARAM lParam) { if (!HasAccessToken()) return 0; if (hContact == NULL) hContact = GetDefaultContact(); TCHAR *filePath = (TCHAR*)lParam; FileTransferParam *ftp = new FileTransferParam(); ftp->pfts.hContact = hContact; ftp->pfts.totalFiles = 1; ftp->hContact = (hTransferContact) ? hTransferContact : hContact; hTransferContact = 0; int length = _tcsrchr(filePath, '\\') - filePath; ftp->pfts.tszWorkingDir = (TCHAR*)mir_alloc(sizeof(TCHAR) * (length + 1)); mir_tstrncpy(ftp->pfts.tszWorkingDir, filePath, length + 1); ftp->pfts.tszWorkingDir[length] = '\0'; ftp->pfts.ptszFiles = (TCHAR**)mir_alloc(sizeof(TCHAR*) * (ftp->pfts.totalFiles + 1)); ftp->pfts.ptszFiles[0] = mir_wstrdup(filePath); ftp->pfts.ptszFiles[ftp->pfts.totalFiles] = NULL; ULONG fileId = InterlockedIncrement(&hFileProcess); ftp->hProcess = (HANDLE)fileId; mir_forkthreadowner(CDropbox::SendFilesAndEventAsync, this, ftp, 0); return fileId; }
INT_PTR CDropbox::ProtoSendMessage(WPARAM, LPARAM lParam) { CCSDATA *pccsd = (CCSDATA*)lParam; if (!HasAccessToken()) { ProtoBroadcastAck(MODULE, pccsd->hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, NULL, (LPARAM)"You cannot send messages when you are not authorized."); return 0; } char *szMessage = (char*)pccsd->lParam; if (*szMessage == '/') { // parse commands char *sep = strchr(szMessage, ' '); if (sep != NULL) *sep = 0; struct { const char *szCommand; pThreadFunc pHandler; } static commands[] = { { "help", &CDropbox::CommandHelp }, { "content", &CDropbox::CommandContent }, { "share", &CDropbox::CommandShare }, { "delete", &CDropbox::CommandDelete } }; for (int i = 0; i < _countof(commands); i++) { if (!mir_strcmp(szMessage+1, commands[i].szCommand)) { ULONG messageId = InterlockedIncrement(&hMessageProcess); CommandParam *param = new CommandParam(); param->instance = this; param->hContact = pccsd->hContact; param->hProcess = (HANDLE)messageId; param->data = (sep ? sep + 1 : NULL); mir_forkthread(commands[i].pHandler, param); return messageId; } } } char help[1024]; mir_snprintf(help, Translate("\"%s\" is not valid.\nUse \"/help\" for more info."), szMessage); CallContactService(GetDefaultContact(), PSR_MESSAGE, 0, (LPARAM)help); return 0; }
int CDropbox::OnTabSrmmButtonPressed(WPARAM, LPARAM lParam) { CustomButtonClickData *cbc = (CustomButtonClickData *)lParam; if (!mir_strcmp(cbc->pszModule, MODULE) && cbc->dwButtonId == BBB_ID_FILE_SEND && cbc->hContact) { hTransferContact = cbc->hContact; hTransferWindow = (HWND)CallService(MS_FILE_SENDFILE, GetDefaultContact(), 0); DisableSrmmButton(cbc->hContact); } return 0; }
int CDropbox::OnModulesLoaded(WPARAM, LPARAM) { HookEventObj(ME_DB_CONTACT_DELETED, GlobalEvent<&CDropbox::OnContactDeleted>, this); HookEventObj(ME_OPT_INITIALISE, GlobalEvent<&CDropbox::OnOptionsInitialized>, this); HookEventObj(ME_CLIST_PREBUILDCONTACTMENU, GlobalEvent<&CDropbox::OnPrebuildContactMenu>, this); HookEventObj(ME_MSG_WINDOWEVENT, GlobalEvent<&CDropbox::OnSrmmWindowOpened>, this); HookEventObj(ME_FILEDLG_CANCELED, GlobalEvent<&CDropbox::OnFileDialogCancelled>, this); HookEventObj(ME_FILEDLG_SUCCEEDED, GlobalEvent<&CDropbox::OnFileDialogSuccessed>, this); NETLIBUSER nlu = { sizeof(nlu) }; nlu.flags = NUF_INCOMING | NUF_OUTGOING | NUF_HTTPCONNS | NUF_TCHAR; nlu.szSettingsModule = MODULE; nlu.ptszDescriptiveName = L"Dropbox"; hNetlibConnection = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu); GetDefaultContact(); WORD status = ProtoGetStatus(0, 0); ProtoBroadcastAck(MODULE, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_OFFLINE, status); if (ServiceExists(MS_BB_ADDBUTTON)) { BBButton bbd = { sizeof(bbd) }; bbd.pszModuleName = MODULE; bbd.bbbFlags = BBBF_ISIMBUTTON | BBBF_ISCHATBUTTON | BBBF_ISRSIDEBUTTON; bbd.ptszTooltip = TranslateT("Upload files to Dropbox"); bbd.hIcon = GetIconHandleByName("upload"); bbd.dwButtonID = BBB_ID_FILE_SEND; bbd.dwDefPos = 100 + bbd.dwButtonID; CallService(MS_BB_ADDBUTTON, 0, (LPARAM)&bbd); HookEventObj(ME_MSG_BUTTONPRESSED, GlobalEvent<&CDropbox::OnTabSrmmButtonPressed>, this); } return 0; }
int CDropbox::OnSrmmWindowOpened(WPARAM, LPARAM lParam) { MessageWindowEventData *ev = (MessageWindowEventData*)lParam; if (ev->uType == MSG_WINDOW_EVT_OPENING && ev->hContact) { char *proto = GetContactProto(ev->hContact); bool isProtoOnline = CallProtoService(proto, PS_GETSTATUS, 0, 0) > ID_STATUS_OFFLINE; WORD status = db_get_w(ev->hContact, proto, "Status", ID_STATUS_OFFLINE); bool canSendOffline = (CallProtoService(proto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_IMSENDOFFLINE) > 0; BBButton bbd = { sizeof(bbd) }; bbd.pszModuleName = MODULE; bbd.dwButtonID = BBB_ID_FILE_SEND; bbd.bbbFlags = BBSF_RELEASED; if (!HasAccessToken() || ev->hContact == GetDefaultContact()) bbd.bbbFlags = BBSF_HIDDEN | BBSF_DISABLED; else if (!isProtoOnline || (status == ID_STATUS_OFFLINE && !canSendOffline)) bbd.bbbFlags = BBSF_DISABLED; CallService(MS_BB_SETBUTTONSTATE, ev->hContact, (LPARAM)&bbd); } return 0; }