INT_PTR CToxProto::SetMyAvatar(WPARAM wParam, LPARAM lParam) { TCHAR *path = (TCHAR*)lParam; std::tstring avatarPath = GetAvatarFilePath(); if (path != NULL) { if (!CopyFile(path, avatarPath.c_str(), FALSE)) { debugLogA("CToxProto::SetMyAvatar: failed to copy new avatar to avatar cache"); return -1; } SetToxAvatar(avatarPath, true); } else { if (tox_unset_avatar(tox) == TOX_ERROR) { debugLogA("CToxProto::SetMyAvatar: failed to unset avatar"); return -1; } if (IsFileExists(avatarPath)) { DeleteFile(avatarPath.c_str()); } db_unset(NULL, m_szModuleName, TOX_SETTINGS_AVATAR_HASH); } return 0; }
void cmd_avatar(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { if (argc < 2) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: No file path supplied."); return; } /* turns the avatar off */ if (strlen(argv[1]) < 3) { tox_unset_avatar(m); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "No avatar set."); return; } if (argv[1][0] != '\"') { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Path must be enclosed in quotes."); return; } /* remove opening and closing quotes */ char path[MAX_STR_SIZE]; snprintf(path, sizeof(path), "%s", &argv[1][1]); int len = strlen(path) - 1; path[len] = '\0'; off_t sz = file_size(path); if (sz <= 8) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: Invalid file."); return; } if (sz > TOX_AVATAR_MAX_DATA_LENGTH) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: File is too large."); return; } FILE *fp = fopen(path, "rb"); if (fp == NULL) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: Could not open file."); return; } char PNG_signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; if (check_file_signature(PNG_signature, sizeof(PNG_signature), fp) != 0) { fclose(fp); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: File type not supported."); return; } char *avatar = malloc(sz); if (avatar == NULL) exit_toxic_err("Failed in set_avatar", FATALERR_MEMORY); if (fread(avatar, sz, 1, fp) != 1) { fclose(fp); free(avatar); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: Read fail."); return; } if (tox_set_avatar(m, TOX_AVATAR_FORMAT_PNG, (const uint8_t *) avatar, (uint32_t) sz) == -1) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set avatar: Core error."); char filename[MAX_STR_SIZE]; get_file_name(filename, sizeof(filename), path); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Avatar set to '%s'", filename); fclose(fp); free(avatar); }