Пример #1
0
void manager::on_teacheraddbutton_click(){
    int ID;
    string name,deptname;
    ID=ui->teacher_ID->text().toInt();
    name=ui->teacher_name->text().toStdString();
    deptname=ui->teacher_dept->text().toStdString();
    UTeacher tea(ID,"******",name,deptname);
    bool status=admi.AddTeacher(tea);
    if(status) {
        QMessageBox::information(this,tr("提示"),tr("增加老师成功!"),QMessageBox::Ok);
    }
    else{
        QMessageBox::information(this,tr("提示"),tr("增加老师失败"),QMessageBox::Ok);
    }
}
Пример #2
0
int main()
{
    Recipe recipe;
    CaffeineBeverage coffee(std::bind(&Recipe::amountWater, &recipe, 150), std::bind(&Recipe::brewCoffee, &recipe));
    CaffeineBeverage tea(std::bind(&Recipe::amountWater, &recipe, 100), std::bind(&Recipe::brewTea, &recipe));

    std::vector<CaffeineBeverage*> beverages;

    beverages.push_back(&coffee);
    beverages.push_back(&tea);

    for(auto it = beverages.begin(); it != beverages.end(); it++)
    {
        (*it)->prepare();
    }

    return 0;
}
Пример #3
0
void QQ::dispatch_msg()
{	
	uint8_t msg[messenger::BUF_SIZE] = {0};

	int len = 0;
	int i = 0;
	size_t j = 0;

	bool match = false;
	char msg_info[128] = {0};
	uint8_t* compare = NULL;
	size_t count = 0;

	qq_state_enum state = get_state();

	if (msgr == NULL || msgr->get_incoming_msg_queue_size() == 0)
	{
		return;
	}

	pthread_mutex_lock(&srv_ip_mtx);

	switch (state)
	{
	case QQ_WF_PREFIRST:
	case QQ_WF_REDIRECT:
		if (msgr->read_msg_queue(msgr->INCOMING, (char*)msg, this->srv_ip, this->srv_port, len) <= 0)
		{		
			break;
		}
		
		if (len < 10)
		{
			break;
		}

		// count = hex_string_to_bytes("02030000310004010003" , &compare);
		count = hex_string_to_bytes("02000000310004010003" , &compare); //2009-08-06		
		
		if (memcmp((char*)msg, compare, count) == 0)
		{
			delay(200);
			set_state(QQ_LOGINTOKEN);
		}

		delete[] compare;
		break;		

	case QQ_WF_LOGINTOKEN:
		if (msgr->read_msg_queue(msgr->INCOMING, (char*)msg, this->srv_ip, this->srv_port, len) <= 0)
		{		
			cout << "Read NONE!" << endl;
			break;
		}

		if (len >= 34)
		{
			// 请求登录令牌的命令号 0x0062
			count = hex_string_to_bytes("020e35006200000018", &compare); 
			match = true;

			for (j = 0; j < count; j++)
			{
				if (j == 5 || j == 6)
					continue;
				if (msg[j] != compare[j])
				{
					match = false;
					break;
				}
			}

			delete[] compare;
		}
		if (match)
		{
			pthread_mutex_lock(&login_token_mtx);
			for (j = 0; j < 24; j++)
				login_token[j] = msg[j + 9];	
			pthread_mutex_unlock(&login_token_mtx);
			delay(200);
			set_state(QQ_LOGIN_IN);
		}
		break;

	case QQ_WF_LOGIN_IN:
		{
			if (msgr->read_msg_queue(msgr->INCOMING, (char*)msg, this->srv_ip, this->srv_port, len) <= 0)
			{		
				break;
			}
			
			if (len < 32)
			{
				printf("QQ_WF_LOGIN_IN: len == %d < 32, break.\n", len);
				break;
			}
			count = hex_string_to_bytes("020e350022", &compare);

			if (memcmp((char*)msg, compare, count) != 0)
			{
				delete[] compare; 
				break;
			}
			delete[] compare; 			

			if (len == 32)
			{
				delay(200);
				set_state(QQ_REDIRECT);
				//cout << "QQ_REDIRECT" << endl;
				pthread_mutex_lock(&rand_key_mtx);
				TEA tea(rand_key);
				pthread_mutex_unlock(&rand_key_mtx);

				unsigned char * plain_msg = NULL;
				if (tea.qq_decrypt((msg + 7), 24, &plain_msg) != 11)
				{
					cout << "Decrypt Failed!" << endl;
					delay(200);
					set_state(QQ_ZERO);
					break;
				}
				unsigned int   n_ip = *((unsigned int *) (plain_msg + 5));
				unsigned short n_port = *((unsigned short *) (plain_msg + 9));
				unsigned short h_port = ntohs(n_port);
				unsigned int h_ip = ntohl(n_ip);

				memset(srv_ip, 0, IPADDR_LEN);
				sprintf(srv_ip, "%d.%d.%d.%d", 
					(h_ip >> 24) % 0x100,
					(h_ip >> 16) % 0x100, 
					(h_ip >> 8) % 0x100,
					h_ip % 0x100);

				srv_port = h_port;
				delete[] plain_msg;
				break;
			}

			if (len == 88)
			{
				printf("QQ_WF_LOGIN_IN: recieved 88 bytes.\n");	
			}

			if (len != 192)
			{
				printf("QQ_WF_LOGIN_IN: len == %d != 192, login failed, try again.\n", len);
				set_state(QQ_ZERO);
				break;
			}

			uint8_t * pwhash2 = NULL;
			hex_string_to_bytes(qq_pw, &pwhash2);		

			TEA tea(pwhash2);
			uint8_t * plain_msg = NULL;

			try
			{
				tea.qq_decrypt((msg + 7), 184, &plain_msg);
			}
			catch (out_of_range e)
			{
				cout << e.what() << endl;
			}

			uint32_t my_qq_id = 0;
			uint32_t my_ip = 0;
			uint16_t my_port = 0;
			uint32_t srv_listen_ip = 0;
			uint16_t srv_listen_port = 0;
			time_t login_time = 0;
			struct tm* tm_ptr;
			uint32_t unknown_ip = 0;

			switch (plain_msg[0])
			{
			case 0x00:
				memcpy(session_key, plain_msg + 1, 16);				
				delay(200);
				set_state(QQ_PRE_ONLINE_FIR);

				my_qq_id = ntohl(*((uint32_t *) (plain_msg + 17)));
				my_ip = ntohl(*((uint32_t *) (plain_msg + 21)));
				my_port = ntohs(*((uint16_t *) (plain_msg + 25)));
				srv_listen_ip = ntohl(*((uint32_t *) (plain_msg + 27)));
				srv_listen_port = ntohs(*((uint16_t *) (plain_msg + 31)));
				login_time = (time_t)
					ntohl(*((uint32_t *) (plain_msg + 33)));
				unknown_ip = ntohl(*((uint32_t *) (plain_msg + 63)));

				tm_ptr = localtime(&login_time);					

				sprintf(client_ip_port, "%d.%d.%d.%d:%d",
					(my_ip >> 24) % 0x100, (my_ip >> 16) % 0x100,
					(my_ip >> 8) % 0x100, my_ip % 0x100, my_port);		

				sprintf(signin_time, "%02d:%02d:%02d", tm_ptr->tm_hour,
					tm_ptr->tm_min, tm_ptr->tm_sec);

				sprintf(msg_info, "QQ ID:\t%d\r\nIP Addr:\t%s\r\nTime:\t\t%s",
					my_qq_id, client_ip_port, signin_time);
				log_event(msg_info);

				break;

			default:
				delay(200);
				set_state(QQ_ZERO);
				break;
			}

			delete[] plain_msg;	
			delete[] pwhash2;

			break;
		}

	case QQ_WF_PRE_ONLINE_FIR:
		{
			if (msgr->read_msg_queue(msgr->INCOMING, (char*)msg, this->srv_ip, this->srv_port, len) <= 0)
			{		
				break;
			}

			cout << "Server IP:\t" << srv_ip << ":" << srv_port << endl;

			if (msg[0] == 0x02 &&
				msg[1] == 0x0e &&
				msg[2] == 0x35)
			{
				TEA tea(session_key);
				unsigned char * plain_msg = NULL;
				tea.qq_decrypt((msg + 7), len - 8, &plain_msg);
				unsigned short order = msg[3] * 0x100 + msg[4];

				switch (order)
				{
				case 0x6:
					{
						my_profile_gotten = true;
						set_state(QQ_PRE_ONLINE_SEC);
						break;
					}
				}

				delete[] plain_msg;
			}

			break;
		}

	case QQ_WF_PRE_ONLINE_SEC:
		{
			if (msgr->read_msg_queue(msgr->INCOMING, (char*)msg, this->srv_ip, this->srv_port, len) <= 0)
			{		
				break;
			}

			if (msg[0] == 0x02 &&
				msg[1] == 0x0e &&
				msg[2] == 0x35)
			{
				TEA tea(session_key);
				unsigned char * plain_msg = NULL;
				int msg_len = tea.qq_decrypt((msg + 7), len - 8,
					&plain_msg);
				unsigned short order = msg[3] * 0x100 + msg[4];

				switch (order)
				{
				case 0x26:
					{
						memcpy(friend_id, plain_msg, 2);

						if (plain_msg[0] * 0x100 + plain_msg[1] == 0xffff)
						{
							set_state(QQ_ONLINE);							
							delay(200);
						}
						else
						{
							delay(200);
							set_state(QQ_PRE_ONLINE_SEC);
						}

						i = 2;

						while (i < msg_len)
						{
							int* pint = (int*) (plain_msg + i);
							int buddy_id = ntohl(*pint);
							unsigned char ssize = *(plain_msg + i + 8);
							char* nickname = new char[ssize + 1];
							memset(nickname, 0, ssize + 1);
							memcpy(nickname, plain_msg + i + 9, ssize);
							char ss[20];
							sprintf(ss, "<%d>", buddy_id);
							char* listchars = new char[ssize + 1 + 20];
							strcpy(listchars, nickname);
							strcat(listchars, ss);

							string buddy_nickname = nickname;
							contact.insert(pair<int, string>(buddy_id,
								buddy_nickname));

							delete[] nickname;
							delete[] listchars;
							i = i + 9 + ssize + 4;
						}

						break;
					}
				}

				delete[] plain_msg;
			}

			break;
		}

	case QQ_ONLINE:
		{
			if (msgr->read_msg_queue(msgr->INCOMING, (char*)msg, this->srv_ip, this->srv_port, len) <= 0)
			{		
				break;
			}
			if (msg[0] == 0x02)
			{
				TEA tea(session_key);
				unsigned char * plain_msg = NULL;
				int msg_len = tea.qq_decrypt((msg + 7), len - 8,
					&plain_msg);

				unsigned short order = msg[3] * 0x100 + msg[4];
				char signature[128];

				switch (order)
				{
				case 0x02:
					pthread_mutex_lock(&drop_flag_mtx);
					drop_flag = 0;
					pthread_mutex_unlock(&drop_flag_mtx);
					break;
	
				case 0x17:
					{
						int sender_qq = ntohl(*((int*) plain_msg));      //发送者QQ号	
						int mlong = msg_len - 65 - plain_msg[msg_len - 1];

						if (mlong > 0)
						{
							char* received_msg = new char[mlong + 1];
							memset(received_msg, 0, mlong + 1);
							memcpy(received_msg, plain_msg + 65, mlong);

							if (config.set_received_msg_as_personal_msg)
							{
								strncpy((char *) signature, received_msg, 100);
								set_personal_msg((const char *) signature);
							}

							process_msg(sender_qq, received_msg);

							delete[] received_msg;
							/*
							 * 回复 收到了消息
							 * 1. 消息发送者QQ号,4字节
							 * 2. 消息接收者QQ号,4字节,也就是我
							 * 3. 消息序号,4字节
							 * 4. 发送者IP,4字节
							 */
							unsigned char * plaintext = new unsigned char[16];
							memcpy(plaintext, plain_msg, 16);
							unsigned char * ciphertext = NULL;
			
							size_t miSize = tea.qq_encrypt(plaintext, 16,
								&ciphertext);

							size_t msg_size = miSize + 12;

							uint8_t* request = new_request(0x17, msg_size);

							request[5] = msg[5]; // TEA::Rand();
							request[6] = msg[6]; // TEA::Rand();
							memcpy(request + 11, ciphertext, miSize);

							push_msg(request, msg_size, false);
				
							delete[] plaintext;
							delete[] ciphertext;
							delete[] request;
						}
						break;
					}
				}
				delete [] plain_msg;
			}

			break;
		}

	default:
		break;
	}
Пример #4
0
int main(int argc, char** argv) {
  QApplication tea(argc, argv);

  daemon::Player* daemon_player = new daemon::Player(argc, argv);

  face::Player* face_player = new face::Player(argc, argv);
  face::Playlist* face_playlist = new face::Playlist(argc, argv);
  face::Talk* face_talk = new face::Talk(argc, argv);

  QObject::connect(daemon_player, SIGNAL(thumb_up_signal(int)),
		   face_player, SLOT(thumb_up_slot(int)));
  QObject::connect(daemon_player, SIGNAL(thumb_down_signal(int)),
		   face_player, SLOT(thumb_down_slot(int)));
  QObject::connect(daemon_player, SIGNAL(search_signal(const QUrl&)),
		   face_playlist, SLOT(search_slot(const QUrl&)));
  QObject::connect(daemon_player, SIGNAL(done_signal(bool)),
		   face_playlist, SLOT(done_slot(bool)));
  QObject::connect(daemon_player, SIGNAL(duration_signal(int)),
		   face_player, SLOT(duration_slot(int)));
  QObject::connect(daemon_player, SIGNAL(tick_signal(int)),
		   face_player, SLOT(tick_slot(int)));
  QObject::connect(daemon_player, SIGNAL(title_signal(const QString&)),
		   face_player, SLOT(title_slot(const QString&)));
  QObject::connect(daemon_player, SIGNAL(favorite_signal(bool)),
		   face_player, SLOT(favorite_slot(bool)));
  QObject::connect(daemon_player, SIGNAL(title_signal(const QString&)),
		   face_talk, SLOT(title_slot(const QString&)));
  QObject::connect(daemon_player, SIGNAL(comments_signal(const QStringList&, const QStringList&)),
		   face_talk, SLOT(comments_slot(const QStringList&, const QStringList&)));

  QObject::connect(face_player, SIGNAL(open_signal(const QUrl&, bool)),
 		   daemon_player, SLOT(open_slot(const QUrl&, bool)));
  QObject::connect(face_player, SIGNAL(open_signal(const QUrl&, bool)),
		   face_playlist, SLOT(open_slot(const QUrl&, bool)));
  QObject::connect(face_player, SIGNAL(thumb_up_signal()), 
		   daemon_player, SLOT(thumb_up_slot()));
  QObject::connect(face_player, SIGNAL(thumb_down_signal()), 
		   daemon_player, SLOT(thumb_down_slot()));
  QObject::connect(face_player, SIGNAL(talk_signal(bool, int, int)), 
		   face_talk, SLOT(show_it(bool, int, int)));
  QObject::connect(face_player, SIGNAL(search_signal(const QString&)), 
		   daemon_player, SLOT(search_slot(const QString&)));
  QObject::connect(face_player, SIGNAL(playlist_signal(bool, int, int)), 
		   face_playlist, SLOT(show_it(bool, int, int)));
  QObject::connect(face_player, SIGNAL(play_signal()),
		   daemon_player, SLOT(play_slot()));
  QObject::connect(face_player, SIGNAL(pause_signal()),
		   daemon_player, SLOT(pause_slot()));
  QObject::connect(face_player, SIGNAL(volume_signal(int)),
		   daemon_player, SLOT(volume_slot(int)));
  QObject::connect(face_player, SIGNAL(previous_signal()),
		   face_playlist, SLOT(previous_slot()));
  QObject::connect(face_player, SIGNAL(next_signal()),
		   face_playlist, SLOT(next_slot()));
  QObject::connect(face_player, SIGNAL(normal_signal()),
		   face_playlist, SLOT(normal_slot())); 
  QObject::connect(face_player, SIGNAL(repeat_signal()),
		   face_playlist, SLOT(repeat_slot())); 
  QObject::connect(face_player, SIGNAL(shuffle_signal()),
		   face_playlist, SLOT(shuffle_slot())); 
  QObject::connect(face_player, SIGNAL(position_signal(int)),
		   daemon_player, SLOT(position_slot(int))); 
  QObject::connect(face_player, SIGNAL(favorite_signal()),
		   daemon_player, SLOT(favorite_slot())); 
  QObject::connect(face_player, SIGNAL(complete_signal(const QString, QStringList&)),
		   daemon_player, SLOT(complete_slot(const QString, QStringList&)),
		   Qt::DirectConnection);

  QObject::connect(face_playlist, SIGNAL(play_signal(const QString&)),
		   face_player, SLOT(play_slot(const QString&)));
  QObject::connect(face_playlist, SIGNAL(clos()),
		   face_player, SLOT(playlist_closed()));

  QObject::connect(face_talk, SIGNAL(comment_signal(const QString&, const QString&)),
		   daemon_player, SLOT(comment_slot(const QString&, const QString&)));
  QObject::connect(face_talk, SIGNAL(clos()),
		   face_player, SLOT(talk_closed()));


  face_player->show();

  return tea.exec();
}
Пример #5
0
void manager::on_teacherwidget_click(int row, int col)
{
    QTableWidgetItem* temp;
    int ID;
    string name,deptname;
    if(col==3) {
        QMessageBox msgBox;
        msgBox.setText("您确定更新教师信息吗");
        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
        msgBox.setDefaultButton(QMessageBox::No);
        int ret=msgBox.exec();
        switch (ret) {
        case QMessageBox::Yes: {
            temp=ui->teacher_table->item(row,0);
            ID = temp->text().toInt();
            temp=ui->teacher_table->item(row,1);
            name = temp->text().toStdString();
            temp=ui->teacher_table->item(row, 2);
            deptname = temp->text().toStdString();
            UTeacher tea(ID,"******",name,deptname);
            bool status=admi.UpdateTeacher(tea);
            if(status) {
                QMessageBox::information(this,tr("提示"),tr("更新老师信息成功!"),QMessageBox::Ok);
                on_teachersearchbutton_click();
                break;
            }
            else{
                QMessageBox::information(this,tr("提示"),tr("更新老师信息失败"),QMessageBox::Ok);
                break;
            }
        }
        case QMessageBox::No:
            break;
        default:
            // should never be reached
            break;
        }
    }
    else if(col==4) {
        QMessageBox msgBox;
        msgBox.setText("您确定删除教师信息吗");
        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
        msgBox.setDefaultButton(QMessageBox::No);
        int ret=msgBox.exec();
        switch (ret) {
        case QMessageBox::Yes: {
            temp=ui->teacher_table->item(row,0);
            ID = temp->text().toInt();
            temp=ui->teacher_table->item(row,1);
            name = temp->text().toStdString();
            temp=ui->teacher_table->item(row, 2);
            deptname = temp->text().toStdString();
            UTeacher tea(ID,"******",name,deptname);
            bool status=admi.RemoveTeacher(tea);
            if(status) {
                QMessageBox::information(this,tr("提示"),tr("删除老师信息成功!"),QMessageBox::Ok);
                on_teachersearchbutton_click();
                break;
            }
            else{
                QMessageBox::information(this,tr("提示"),tr("删除老师信息失败"),QMessageBox::Ok);
                break;
            }
        }
        case QMessageBox::No:
            break;
        default:
            // should never be reached
            break;
        }
    }
}