phonebookcontrol.cpp

来自「KDE下的西门子手机管理程序」· C++ 代码 · 共 300 行

CPP
300
字号
/***************************************************************************                          phonebookcontrol.cpp  -  description                             -------------------    begin                : Thu Jan 18 2001    copyright            : (C) 2001 by Matthias Welwarsky    email                : matze@stud.fbi.fh-darmstadt.de ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include <kdebug.h>#include <klocale.h>#include <qlistview.h>#include <qtabwidget.h>#include <qlineedit.h>#include <qprogressdialog.h>#include "phonectrlcenter.h"#include "messagedispatcher.h"#include "phonebookcontrol.h"#include "phonebookitem.h"#include "phonebookeditdlg.h"const char* PhoneBookControl::bookDenominator[] = {	"FD", "SM", "ME", "DC", "LD", "MC", "RC", "ON"};const char* PhoneBookControl::bookViewTitle[] =	{ "Fixed Dials", "SIM", "Phone", "Last Dialled",	  "Last Dialled", "Missed", "Received", "Own Numbers" };PhoneBookControl::PhoneBookControl(QWidget *parent, const char *name )	: PhoneBookControlDlg(parent,name), updateListIterator(updateList){	PhoneCtrlCenter* pcCenter = dynamic_cast<PhoneCtrlCenter*>(parentWidget());	if (!pcCenter) {		kdDebug() << "cannot resolve control center\n";		return;	}	messageDispatcher = pcCenter->getDispatcher();	messageDispatcher->registerControl(this, QRegExp("^\n\\+CPBR:"));	messageDispatcher->registerControl(this, QRegExp("ERROR"));	messageDispatcher->registerControl(this, QRegExp("^\nOK"));	availableBooks = 0;	connect(syncButton, SIGNAL(clicked()), this, SLOT(synchronizeBooks()));	kdDebug() << "PhoneBookControl registered\n";}PhoneBookControl::~PhoneBookControl(){}/** starts the phonebook control, reimplemented from PhoneControl */void PhoneBookControl::startControl() {	if (!availableBooks)		phoneBookView->removePage(phoneBookView->currentPage());	selectedBook = FD;	controlState = SelectingPhonebook;	messageDispatcher->sendCommand(QString("AT+CPBS=\"")+selectedPhonebook()+QString("\""));}/** stops the phonebook control, reimplemented from PhoneControl */void PhoneBookControl::stopControl() {	controlState = Idle;}/** reimplemented from PhoneControl */void PhoneBookControl::deliverMessage(QString message) {	int pos;	int len;	// drop unexpected stuff	if (controlState == Idle) {		//kdDebug() << "Ignoring spurious message\n";		return;	}	if (message.find(QRegExp("ERROR")) != -1) {		switch (controlState) {		case SelectingPhonebook:			// phonebook is not available, switch to the next book;			kdDebug() << "book " << selectedPhonebook() << " is not available, switching to next\n";			if (selectedBook < ON) {				selectedBook += 1;				messageDispatcher->sendCommand(QString("AT+CPBS=\"")+bookDenominator[selectedBook]+QString("\""));			}			break;		default:			// just ignore the error			break;		}		return;	}	if (message.find(QRegExp("\nOK")) != -1) {		switch (controlState) {		case SelectingPhonebook: {			// phonebook selected, add a tab for it			kdDebug() << "Phonebook " << bookDenominator[selectedBook] << " selected OK\n";			if (bookViewList.find(bookDenominator[selectedBook])) {				kdDebug() << "already have view for this book\n";				controlState = QueryingPhonebook;				messageDispatcher->sendCommand("AT+CPBR=?");				break;			}			// construct a view for the book			QListView* bookView = new QListView();			// only certain books are writeable and thus editable			if (selectedBook == SM || selectedBook == ME) {				connect(bookView, SIGNAL(doubleClicked(QListViewItem*)),						this, SLOT(editPhonebookItem(QListViewItem*)));			}			bookView->addColumn("Name");			bookView->addColumn("Phone Number");			bookViewList.insert(bookDenominator[selectedBook], bookView);			phoneBookView->addTab(bookView, bookViewTitle[selectedBook]);			phoneBookView->showPage(bookView);			availableBooks++;			controlState = QueryingPhonebook;			messageDispatcher->sendCommand("AT+CPBR=?");			break;          }		case QueryingPhonebook:			// move to ReadingPhonebook			controlState = ReadingPhonebook;			break;		case ReadingPhonebook:			kdDebug() << "ReadingPhonebook finished, selecting next one\n";			if (selectedBook < ON) {				selectedBook += 1;				controlState = SelectingPhonebook;				messageDispatcher->sendCommand(QString("AT+CPBS=\"")+bookDenominator[selectedBook]+QString("\""));				break;			}			kdDebug() << "gone through all books\n";			controlState = Idle;			break;		case Synchronizing:			++updateListIterator;			++progress;			if (updateListIterator.current() == NULL) {				controlState = Idle;				kdDebug() << "Sync finished\n";				delete progressDialog;				break;			}			kdDebug() << **updateListIterator << endl;			progressDialog->setProgress(progress);			messageDispatcher->sendCommand(**updateListIterator);			break;		default:			// just ignore			break;		}		return;	}	if (message.find(QRegExp("\\+CPBR:")) != -1) {		// find a valid range of entries in the phone book.		if ((pos = QRegExp("\\([0-9\\-]+\\)").match(message, 0, &len)) != -1) {			pos = QRegExp("\\d+").match(message, pos, &len);			QString startIndex = message.mid(pos, len);			pos = QRegExp("\\d+").match(message, pos+len, &len);			QString endIndex = message.mid(pos, len);			// got the range, now query the book			messageDispatcher->sendCommand("AT+CPBR="+startIndex+","+endIndex);		} else {			// not a range query, add an entry to the view.			pos = QRegExp("\\d+").match(message, 0, &len);			int index = message.mid(pos, len).toInt();			pos = QRegExp("\"[\\+0-9]+\"").match(message, pos+len, &len);			QString number = message.mid(pos+1, len-2);			pos = QRegExp("\\d+").match(message, pos+len, &len);			int type = message.mid(pos, len).toInt();			pos = QRegExp("\".*\"").match(message, pos+len, &len);			QString name = PhonebookItem::gsmUnescape(message.mid(pos+1, len-2));			// avoid double entries			QListView* bookView = bookViewList[bookDenominator[selectedBook]];			PhonebookItem* item = static_cast<PhonebookItem*>(bookView->firstChild());			while (item != NULL) {				if (item->name() == name && item->number() == number)					break;				item = static_cast<PhonebookItem*>(item->nextSibling());			}			if (!item)				new PhonebookItem(bookView, name, number, index, type);		}	}}/** this slot it called when someone activates a phonebook item */void PhoneBookControl::editPhonebookItem(QListViewItem* item){	PhonebookItem *entry = dynamic_cast<PhonebookItem*>(item);	if (!entry) {		kdDebug() << "Selected Entry is not a PhonebookItem\n";		return;	}	PhonebookEditDialog* entryEditor = new PhonebookEditDialog(this, "itemEditor", true);	entryEditor->nameEdit->setText(entry->name());	entryEditor->numberEdit->setText(entry->number());	if (entryEditor->exec()) {		entry->setName(entryEditor->nameEdit->text());		entry->setNumber(entryEditor->numberEdit->text());	}}/** called when the "Synchronize..." button is clicked.  * scans all local entries and writes back those that have changed.  */void PhoneBookControl::synchronizeBooks() {	PhoneBook bookIndex;	updateList.clear();		for (bookIndex = SM; bookIndex < DC; bookIndex +=1) {		QListView* bookView = bookViewList[bookDenominator[bookIndex]];		QListViewItemIterator it(bookView);		QString* command = new QString;		*command = "AT+CPBS=\"" + QString(bookDenominator[bookIndex]) + "\"";		updateList.append(command);				for (; it.current(); ++it) {			PhonebookItem* item = static_cast<PhonebookItem*>(it.current());			if (item->changed()) {				QString* entry = new QString();				entry->sprintf("AT+CPBW=%d,\"%s\",%d,\"%s\"",					item->index(),					(const char*)PhonebookItem::gsmEscape(item->number()),					item->type(),					(const char*)PhonebookItem::gsmEscape(item->name()));				updateList.append(entry);			}		}	}	sendUpdates();		}/** transmits a list of updates to the mobile phone. */void PhoneBookControl::sendUpdates(){	// sanity check	if (updateList.isEmpty())		return;	controlState = Synchronizing;	updateListIterator.toFirst();	kdDebug() << **updateListIterator << endl;	progress = 1;	progressDialog = new QProgressDialog(this);	progressDialog->setLabelText(i18n("Synchronizing..."));	progressDialog->setTotalSteps(updateList.count());	progressDialog->setProgress(progress);	messageDispatcher->sendCommand(**updateListIterator);}/** conveniece function. returns QString(bookDenominator(selectedBook)). */QString PhoneBookControl::selectedPhonebook(){	return QString(bookDenominator[selectedBook]);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?