📄 qmremotecontrol.cpp
字号:
info[2] = numchannels; ctrl_write_packet(pkt->fd, info, 3 * sizeof (gint)); ctrl_ack_packet(pkt); break; case CMD_GET_EQ_DATA: case CMD_SET_EQ_DATA: /* obsolete */ ctrl_ack_packet(pkt); break; case CMD_PING: ctrl_ack_packet(pkt); break; case CMD_PLAYLIST_ADD: if (pkt->data) { guint32 *dataptr = reinterpret_cast<guint32*>(pkt->data); while ((len = *dataptr) > 0) { gchar *filename; dataptr++; filename = reinterpret_cast<gchar*>(malloc(len)); memcpy(filename, dataptr, len); if (QmMainWindow::mainwin->playListAdd(filename, true)) if (!QmMainWindow::mainwin->isPlaying()) QmMainWindow::mainwin->play(); free(filename); dataptr += (len + 3) / 4; } } ctrl_ack_packet(pkt); break; case CMD_PLAYLIST_ADD_URL_STRING: QmMainWindow::mainwin->playListAppendFile(reinterpret_cast<char*>(pkt->data)); ctrl_ack_packet(pkt); break; case CMD_PLAYLIST_DELETE: QmMainWindow::mainwin->playListDeletePosition(*((guint32 *)pkt->data)); ctrl_ack_packet(pkt); break; case CMD_PLAYLIST_CLEAR: QmMainWindow::mainwin->clearPlayList(); ctrl_ack_packet(pkt); break; case CMD_IS_MAIN_WIN: ctrl_write_gboolean(pkt->fd, QmMainWindow::mainwin->isVisible() ? 1 : 0); ctrl_ack_packet(pkt); break; case CMD_IS_PL_WIN: ctrl_write_gboolean(pkt->fd, 1); ctrl_ack_packet(pkt); break; case CMD_IS_EQ_WIN: ctrl_write_gboolean(pkt->fd, 0); ctrl_ack_packet(pkt); break; case CMD_IS_REPEAT: ctrl_write_gboolean(pkt->fd, 1); ctrl_ack_packet(pkt); break; case CMD_IS_SHUFFLE: ctrl_write_gboolean(pkt->fd, (QmMainWindow::mainwin->randomMode() ? 1 : 0)); ctrl_ack_packet(pkt); break; case CMD_GET_EQ:// fval[0] = equalizerwin_get_preamp();// for(i = 0; i < 10; i++)// fval[i + 1] = equalizerwin_get_band(i);// ctrl_write_packet(pkt->fd, fval, 11 * sizeof(gfloat)); ctrl_ack_packet(pkt); break; case CMD_GET_EQ_PREAMP:// ctrl_write_gfloat(pkt->fd, equalizerwin_get_preamp()); ctrl_ack_packet(pkt); break; case CMD_GET_EQ_BAND:// i = *((guint32 *) pkt->data);// ctrl_write_gfloat(pkt->fd, equalizerwin_get_band(i)); ctrl_ack_packet(pkt); break; case CMD_PLAY: ctrl_ack_packet(pkt); QmMainWindow::mainwin->play(); break; case CMD_PAUSE: QmMainWindow::mainwin->pause(); ctrl_ack_packet(pkt); break; case CMD_STOP: QmMainWindow::mainwin->stop(); ctrl_ack_packet(pkt); break; case CMD_SET_PLAYLIST_POS: QmMainWindow::mainwin->playListPosition(*((guint32 *) data)); ctrl_ack_packet(pkt); break; case CMD_JUMP_TO_TIME: num = *((guint32 *) data); QmMainWindow::mainwin->jumpToSeconds(num / 1000); ctrl_ack_packet(pkt); break; case CMD_SET_VOLUME: v[0] = ((guint32 *) data)[0]; v[1] = ((guint32 *) data)[1]; if (v[0] > 100) v[0] = 100; if (v[1] > 100) v[1] = 100; QmMainWindow::mainwin->setVolume(v[0]); ctrl_ack_packet(pkt); break; case CMD_SET_SKIN: // right. ctrl_ack_packet(pkt); break; case CMD_PL_WIN_TOGGLE: ctrl_ack_packet(pkt); break; case CMD_EQ_WIN_TOGGLE: ctrl_ack_packet(pkt); break; case CMD_SHOW_PREFS_BOX: QmMainWindow::mainwin->configDialog(); ctrl_ack_packet(pkt); break; case CMD_TOGGLE_AOT:// tbool = *((gboolean *) data);// mainwin_set_always_on_top(tbool); ctrl_ack_packet(pkt); break; case CMD_SHOW_ABOUT_BOX: QmMainWindow::mainwin->showAbout(); ctrl_ack_packet(pkt); break; case CMD_EJECT: QmMainWindow::mainwin->addFilesDialog(); ctrl_ack_packet(pkt); break; case CMD_PLAYLIST_PREV: QmMainWindow::mainwin->prev(); ctrl_ack_packet(pkt); break; case CMD_PLAYLIST_NEXT: QmMainWindow::mainwin->next(); ctrl_ack_packet(pkt); break; case CMD_TOGGLE_REPEAT: QmMainWindow::mainwin->cycleLoopMode(); if (QmMainWindow::mainwin->loopOneMode()) QmMainWindow::mainwin->cycleLoopMode(); ctrl_ack_packet(pkt); break; case CMD_TOGGLE_SHUFFLE: QmMainWindow::mainwin->toggleRandomMode(); ctrl_ack_packet(pkt); break; case CMD_MAIN_WIN_TOGGLE: QmMainWindow::mainwin->toggleCompactWindow(); ctrl_ack_packet(pkt); break; case CMD_SET_EQ:// if(pkt->hdr.data_length >= 11 * sizeof(gfloat)) {// fval = (gfloat *) data;// equalizerwin_set_preamp(fval[0]);// for(i = 0; i < 10; i++)// equalizerwin_set_band(i, fval[i + 1]);// } ctrl_ack_packet(pkt); break; case CMD_SET_EQ_PREAMP:// f = *((gfloat *) data);// equalizerwin_set_preamp(f); ctrl_ack_packet(pkt); break; case CMD_SET_EQ_BAND:// if(pkt->hdr.data_length >= sizeof(gint) + sizeof(gfloat))// {// i = *((gint *) data);// f = *((gfloat *) ((gchar *)data + sizeof(gint)));// equalizerwin_set_band(i, f);// } ctrl_ack_packet(pkt); break; case CMD_QUIT: qApp->quit(); ctrl_ack_packet(pkt); break; default:// pthread_mutex_lock(&packet_list_mutex);// packet_list.push_back(pkt);// packet_list = g_list_append(packet_list, pkt); std::cerr << "QmRemoteControl::ctrlsocket_func: unknown command: " << pkt->hdr.command << "\n"; ctrl_write_packet(pkt->fd, NULL, 0); close(pkt->fd);// pthread_mutex_unlock(&packet_list_mutex); break; }}// g_get_tmp_dir from glibchar *QmRemoteControl::g_get_tmp_dir(){ static char *g_tmp_dir=0; if (!g_tmp_dir) { g_tmp_dir = getenv ("TMPDIR"); if (!g_tmp_dir) g_tmp_dir = getenv ("TMP"); if (!g_tmp_dir) g_tmp_dir = getenv ("TEMP"); if (g_tmp_dir) g_tmp_dir = strdup(g_tmp_dir); else {#ifndef NATIVE_WIN32 g_tmp_dir = "/tmp";#else /* NATIVE_WIN32 */ g_tmp_dir = "C:\\";#endif /* NATIVE_WIN32 */ } } return g_tmp_dir;}gbooleanQmRemoteControl::remote_cmd(gint session, guint32 cmd){ gint fd; if ((fd = apollo_connect_to_session(session)) == -1) return FALSE; remote_send_packet(fd, cmd, NULL, 0); remote_read_ack(fd); close(fd); return TRUE;}gintQmRemoteControl::apollo_connect_to_session(gint session){ gint fd; uid_t stored_uid, euid; struct sockaddr_un saddr; if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) != -1) { saddr.sun_family = AF_UNIX; stored_uid = getuid(); euid = geteuid(); setuid(euid); struct passwd *pwd = getpwuid(getuid()); const char *user_name = pwd ? pwd->pw_name : "wtf?"; // failure should be logged sprintf(saddr.sun_path, "%s/%s_%s.%d", g_get_tmp_dir(), app_name_for_socket, user_name, session); setreuid(stored_uid, euid); if (::connect(fd, (struct sockaddr *) &saddr, sizeof (saddr)) != -1) return fd; } close(fd); return -1;}voidQmRemoteControl::remote_read_ack(gint fd){ gpointer data; ServerPktHeader pkt_hdr; data = remote_read_packet(fd, &pkt_hdr); if (data) free(data);}voidQmRemoteControl::remote_send_packet(gint fd, guint32 command, gpointer data, guint32 data_length){ ClientPktHeader pkt_hdr; pkt_hdr.version = XMMS_PROTOCOL_VERSION; pkt_hdr.command = command; pkt_hdr.data_length = data_length; write(fd, &pkt_hdr, sizeof (ClientPktHeader)); if (data_length && data) write(fd, data, data_length);}gpointerQmRemoteControl::remote_read_packet(gint fd, ServerPktHeader * pkt_hdr){ gpointer data = NULL; if (read(fd, pkt_hdr, sizeof (ServerPktHeader)) == sizeof (ServerPktHeader)) { if (pkt_hdr->data_length) { data = malloc(pkt_hdr->data_length); read(fd, data, pkt_hdr->data_length); } } return data;}/*! Used for debugging, to see what a client is requesting */voidQmRemoteControl::print_cmd(guint16 cmd) { switch (cmd) { case CMD_GET_VERSION: std::cerr << "CMD_GET_VERSION\n"; break; case CMD_PLAYLIST_ADD: std::cerr << "CMD_PLAYLIST_ADD\n"; break; case CMD_PLAY: std::cerr << "CMD_PLAY\n"; break; case CMD_PAUSE: std::cerr << "CMD_PAUSE\n"; break; case CMD_STOP: std::cerr << "CMD_STOP\n"; break; case CMD_IS_PLAYING: std::cerr << "CMD_IS_PLAYING\n"; break; case CMD_IS_PAUSED: std::cerr << "CMD_IS_PAUSED\n"; break; case CMD_GET_PLAYLIST_POS: std::cerr << "CMD_GET_PLAYLIST_POS\n"; break; case CMD_SET_PLAYLIST_POS: std::cerr << "CMD_SET_PLAYLIST_POS\n"; break; case CMD_GET_PLAYLIST_LENGTH: std::cerr << "CMD_GET_PLAYLIST_LENGTH\n"; break; case CMD_PLAYLIST_CLEAR: std::cerr << "CMD_PLAYLIST_CLEAR\n"; break; case CMD_GET_OUTPUT_TIME: std::cerr << "CMD_GET_OUTPUT_TIME\n"; break; case CMD_JUMP_TO_TIME: std::cerr << "CMD_JUMP_TO_TIME\n"; break; case CMD_GET_VOLUME: std::cerr << "CMD_GET_VOLUME\n"; break; case CMD_SET_VOLUME: std::cerr << "CMD_SET_VOLUME\n"; break; case CMD_GET_SKIN: std::cerr << "CMD_GET_SKIN\n"; break; case CMD_SET_SKIN: std::cerr << "CMD_SET_SKIN\n"; break; case CMD_GET_PLAYLIST_FILE: std::cerr << "CMD_GET_PLAYLIST_FILE\n"; break; case CMD_GET_PLAYLIST_TITLE: std::cerr << "CMD_GET_PLAYLIST_TITLE\n"; break; case CMD_GET_PLAYLIST_TIME: std::cerr << "CMD_GET_PLAYLIST_TIME\n"; break; case CMD_GET_INFO: std::cerr << "CMD_GET_INFO\n"; break; case CMD_GET_EQ_DATA: std::cerr << "CMD_GET_EQ_DATA\n"; break; case CMD_SET_EQ_DATA: std::cerr << "CMD_SET_EQ_DATA\n"; break; case CMD_PL_WIN_TOGGLE: std::cerr << "CMD_PL_WIN_TOGGLE\n"; break; case CMD_EQ_WIN_TOGGLE: std::cerr << "CMD_EQ_WIN_TOGGLE\n"; break; case CMD_SHOW_PREFS_BOX: std::cerr << "CMD_SHOW_PREFS_BOX\n"; break; case CMD_TOGGLE_AOT: std::cerr << "CMD_TOGGLE_AOT\n"; break; case CMD_SHOW_ABOUT_BOX: std::cerr << "CMD_SHOW_ABOUT_BOX\n"; break; case CMD_EJECT: std::cerr << "CMD_EJECT\n"; break; case CMD_PLAYLIST_PREV: std::cerr << "CMD_PLAYLIST_PREV\n"; break; case CMD_PLAYLIST_NEXT: std::cerr << "CMD_PLAYLIST_NEXT\n"; break; case CMD_PING: std::cerr << "CMD_PING\n"; break; case CMD_GET_BALANCE: std::cerr << "CMD_GET_BALANCE\n"; break; case CMD_TOGGLE_REPEAT: std::cerr << "CMD_TOGGLE_REPEAT\n"; break; case CMD_TOGGLE_SHUFFLE: std::cerr << "CMD_TOGGLE_SHUFFLE\n"; break; case CMD_MAIN_WIN_TOGGLE: std::cerr << "CMD_MAIN_WIN_TOGGLE\n"; break; case CMD_PLAYLIST_ADD_URL_STRING: std::cerr << "CMD_PLAYLIST_ADD_URL_STRING\n"; break; case CMD_IS_EQ_WIN: std::cerr << "CMD_IS_EQ_WIN\n"; break; case CMD_IS_PL_WIN: std::cerr << "CMD_IS_PL_WIN\n"; break; case CMD_IS_MAIN_WIN: std::cerr << "CMD_IS_MAIN_WIN\n"; break; case CMD_PLAYLIST_DELETE: std::cerr << "CMD_PLAYLIST_DELETE\n"; break; case CMD_IS_REPEAT: std::cerr << "CMD_IS_REPEAT\n"; break; case CMD_IS_SHUFFLE: std::cerr << "CMD_IS_SHUFFLE\n"; break; case CMD_GET_EQ: std::cerr << "CMD_GET_EQ\n"; break; case CMD_GET_EQ_PREAMP: std::cerr << "CMD_GET_EQ_PREAMP\n"; break; case CMD_GET_EQ_BAND: std::cerr << "CMD_GET_EQ_BAND\n"; break; case CMD_SET_EQ: std::cerr << "CMD_SET_EQ\n"; break; case CMD_SET_EQ_PREAMP: std::cerr << "CMD_SET_EQ_PREAMP\n"; break; case CMD_SET_EQ_BAND: std::cerr << "CMD_SET_EQ_BAND\n"; break; case CMD_QUIT: std::cerr << "CMD_QUIT\n"; break; default: std::cerr << "unknow command\n"; break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -