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 + -
显示快捷键?