kfritz/0000775000175000017500000000000012067104216010172 5ustar jojokfritz/KFonbookModel.cpp0000664000175000017500000002160112067033012013362 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KFonbookModel.h" #include #include #include "Log.h" /** * KFonbookModel */ enum modelColumns { COLUMN_NAME, COLUMN_NUMBER_FIRST, COLUMN_NUMBER_2, COLUMN_NUMBER_LAST, COLUMN_QUICKDIAL, COLUMN_VANITY, COLUMNS_COUNT }; KFonbookModel::KFonbookModel(std::string techID) { // get the fonbook resource fritz::Fonbooks *books = fritz::FonbookManager::GetFonbookManager()->GetFonbooks(); fonbook = (*books)[techID]; lastRows = 0; } KFonbookModel::~KFonbookModel() { } int KFonbookModel::rowCount(const QModelIndex & parent) const { if (parent.isValid()) return 0; return fonbook->GetFonbookSize(); } int KFonbookModel::columnCount(const QModelIndex & parent) const { if (parent.isValid()) return 0; return COLUMNS_COUNT; } QVariant KFonbookModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { switch (section) { case COLUMN_NAME: return i18n("Name"); case COLUMN_NUMBER_FIRST: return i18n("Number 1"); case COLUMN_NUMBER_2: return i18n("Number 2"); case COLUMN_NUMBER_LAST: return i18n("Number 3"); case COLUMN_QUICKDIAL: return i18n("Quickdial"); case COLUMN_VANITY: return i18n("Vanity"); default: return QVariant(); } } else return QVariant(); } QVariant KFonbookModel::data(const QModelIndex & index, int role) const { // Neither top level nor details table if (index.parent().isValid()) return QVariant(); const fritz::FonbookEntry *fe = fonbook->RetrieveFonbookEntry(index.row()); if (!fe) { ERR("No FonbookEntry for index row " << index.row()); return QVariant(); } // Indicate important contacts using icon and tooltip if (role == Qt::DecorationRole && index.column() == COLUMN_NAME) return QVariant(fe->IsImportant() ? KIcon("emblem-important") : KIcon("x-office-contact")); if (role == Qt::ToolTipRole && index.column() == COLUMN_NAME) return QVariant(fe->IsImportant() ? i18n("Important contact") : ""); // Indicate default number using bold font face and tooltip if (role == Qt::FontRole || role == Qt::ToolTipRole) { bool defaultNumber = false; fritz::FonbookEntry::eType type = fritz::FonbookEntry::TYPE_NONE; switch(index.column()) { case COLUMN_NUMBER_FIRST ... COLUMN_NUMBER_LAST: defaultNumber = (fe->GetPriority(index.column() - COLUMN_NUMBER_FIRST) == 1); type = fe->GetType(index.column() - COLUMN_NUMBER_FIRST); } QString tooltip = getTypeName(type); if (defaultNumber) { if (role == Qt::FontRole) { QFont font; font.setBold(true); return font; } tooltip += " ("+ (i18n("Default number")) + ")"; } if (role == Qt::ToolTipRole) return tooltip; } // Skip all other requests, except for displayed text if (role != Qt::DisplayRole && role != Qt::EditRole) return QVariant(); switch (index.column()) { case COLUMN_NAME: return QVariant(toUnicode(fe->GetName())); case COLUMN_NUMBER_FIRST ... COLUMN_NUMBER_LAST: return QVariant(toUnicode(fe->GetNumber(index.column() - COLUMN_NUMBER_FIRST))); case COLUMN_QUICKDIAL: if (role == Qt::EditRole) return QVariant(toUnicode(fe->GetQuickdial())); else return QVariant(toUnicode(fe->GetQuickdialFormatted())); case COLUMN_VANITY: if (role == Qt::EditRole) return QVariant(toUnicode(fe->GetVanity())); else return QVariant(toUnicode(fe->GetVanityFormatted())); default: return QVariant(); } } bool KFonbookModel::setData (const QModelIndex & index, const QVariant & value, int role) { if (role == Qt::EditRole) { const fritz::FonbookEntry *_fe = fonbook->RetrieveFonbookEntry(index.row()); fritz::FonbookEntry fe(*_fe); switch(index.column()) { case COLUMN_NAME: fe.SetName(fromUnicode(value.toString())); break; case COLUMN_NUMBER_FIRST ... COLUMN_NUMBER_LAST: fe.SetNumber(fromUnicode(value.toString()), index.column() - COLUMN_NUMBER_FIRST); break; case COLUMN_QUICKDIAL: fe.SetQuickdial(fromUnicode(value.toString())); //TODO: check if unique break; case COLUMN_VANITY: fe.SetVanity(fromUnicode(value.toString())); //TODO: check if unique break; default: return false; } fonbook->ChangeFonbookEntry(index.row(), fe); emit dataChanged(index, index); // we changed one element return true; } return false; } void KFonbookModel::setDefault(const QModelIndex &index) { switch(index.column()) { case COLUMN_NUMBER_FIRST ... COLUMN_NUMBER_LAST: fonbook->SetDefault(index.row(), index.column() - COLUMN_NUMBER_FIRST); break; default: return; } QModelIndex indexLeft = createIndex(index.row(), COLUMN_NUMBER_FIRST); QModelIndex indexRight = createIndex(index.row(), COLUMN_NUMBER_LAST); emit dataChanged(indexLeft, indexRight); // we changed up to three elements } size_t KFonbookModel::mapColumnToNumberIndex(int column) { return column-1; } void KFonbookModel::setType(const QModelIndex &index, fritz::FonbookEntry::eType type) { const fritz::FonbookEntry *_fe = fonbook->RetrieveFonbookEntry(index.row()); fritz::FonbookEntry fe(*_fe); fe.SetType(type, mapColumnToNumberIndex(index.column())); fonbook->ChangeFonbookEntry(index.row(), fe); emit dataChanged(index, index); } bool KFonbookModel::insertRows(int row, int count __attribute__((unused)), const QModelIndex &parent) { beginInsertRows(parent, row, row); fritz::FonbookEntry fe(i18n("New Entry").toStdString()); fonbook->AddFonbookEntry(fe, row); endInsertRows(); return true; } bool KFonbookModel::insertFonbookEntry(const QModelIndex &index, fritz::FonbookEntry &fe) { beginInsertRows(QModelIndex(), index.row(), index.row()); fonbook->AddFonbookEntry(fe, index.row()); endInsertRows(); return true; } const fritz::FonbookEntry *KFonbookModel::retrieveFonbookEntry(const QModelIndex &index) const { return fonbook->RetrieveFonbookEntry(index.row()); } bool KFonbookModel::removeRows(int row, int count __attribute__((unused)), const QModelIndex &parent) { beginRemoveRows(parent,row,row); if(fonbook->DeleteFonbookEntry(row)){ endRemoveRows(); return true; } else return false; } Qt::ItemFlags KFonbookModel::flags(const QModelIndex & index) const { if (fonbook->isWriteable()) return Qt::ItemFlags(QAbstractItemModel::flags(index) | QFlag(Qt::ItemIsEditable)); else return QAbstractItemModel::flags(index); } QString KFonbookModel::getTypeName(const fritz::FonbookEntry::eType type) { switch (type){ case fritz::FonbookEntry::TYPE_HOME: return i18n("Home"); case fritz::FonbookEntry::TYPE_MOBILE: return i18n("Mobile"); case fritz::FonbookEntry::TYPE_WORK: return i18n("Work"); default: return ""; } } void KFonbookModel::sort(int column, Qt::SortOrder order) { fritz::FonbookEntry::eElements element; switch (column) { case COLUMN_NAME: element = fritz::FonbookEntry::ELEM_NAME; break; case COLUMN_NUMBER_FIRST ... COLUMN_NUMBER_LAST: return; //TODO: sorting - does this need anybody? case COLUMN_QUICKDIAL: element = fritz::FonbookEntry::ELEM_QUICKDIAL; break; case COLUMN_VANITY: element = fritz::FonbookEntry::ELEM_VANITY; break; default: ERR("Invalid column addressed while sorting."); return; } fonbook->Sort(element, order == Qt::AscendingOrder); emit dataChanged(index(0, 0, QModelIndex()), index(rowCount(QModelIndex()), columnCount(QModelIndex()), QModelIndex())); } std::string KFonbookModel::number(const QModelIndex &i) const { if (!i.parent().isValid()) { const fritz::FonbookEntry *fe = fonbook->RetrieveFonbookEntry(i.row()); switch (i.column()) { case COLUMN_NUMBER_FIRST ... COLUMN_NUMBER_LAST: return fe->GetNumber(i.column() - COLUMN_NUMBER_FIRST); default: return ""; } } return ""; } QModelIndex KFonbookModel::index(int row, int column, const QModelIndex &parent) const { if (parent.isValid()) return QModelIndex(); return createIndex(row, column); } QModelIndex KFonbookModel::parent(const QModelIndex &child __attribute__((unused))) const { return QModelIndex(); } void KFonbookModel::check() { if (lastRows != rowCount(QModelIndex())) { reset(); emit updated(); // stop timer, because no more changes are expected timer->stop(); lastRows = rowCount(QModelIndex()); } } kfritz/gendbus.sh0000664000175000017500000000007512065570711012164 0ustar jojoqdbuscpp2xml -M -s KFritzDbusService.h -o org.kde.KFritz.xml kfritz/pkg-config.h.cmake0000664000175000017500000000003712065570711013453 0ustar jojo#cmakedefine INDICATEQT_FOUND 1kfritz/KFritz.cpp0000664000175000017500000000250012067033012012077 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KFritz.h" #include #include #include #include #include #include #include #include "KSettings.h" KFritz::KFritz(KFritzWindow *mainWindow, KAboutData *aboutData) :KSystemTrayIcon("kfritz-tray", mainWindow) { this->aboutData = aboutData; this->mainWindow = mainWindow; connect(this, SIGNAL(quitSelected()), mainWindow, SLOT(quit())); } KFritz::~KFritz() { } bool KFritz::parentWidgetTrayClose() const { return true; } kfritz/KSettingsFonbooks.cpp0000664000175000017500000000700212067033012014304 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KSettingsFonbooks.h" #include #include KSettingsFonbooks::KSettingsFonbooks(QWidget *parent) :QWidget(parent) { ui = new Ui_KSettingsFonbooks(); ui->setupUi(this); layout()->addWidget(new KFonbooksWidget(this, ui->actionSelector)); } KSettingsFonbooks::~KSettingsFonbooks() { delete ui; } class KFonbooksWidgetListItem : public QListWidgetItem { private: QString id; public: KFonbooksWidgetListItem(const QString text, const QString id, QListWidget * parent = 0) :QListWidgetItem(text, parent) { this->id = id; } QString getId() { return id; } }; KFonbooksWidget::KFonbooksWidget(QWidget *parent, KActionSelector *actionSelector) :QWidget(parent) { KConfigDialogManager::changedMap()->insert("KFonbooksWidget", SIGNAL(listChanged(const QStringList &))); setObjectName(QString::fromUtf8("kcfg_PhonebookList")); this->actionSelector = actionSelector; connect(actionSelector, SIGNAL(added(QListWidgetItem *)), this, SLOT(listChangedSlot())); connect(actionSelector, SIGNAL(removed(QListWidgetItem *)), this, SLOT(listChangedSlot())); connect(actionSelector, SIGNAL(movedUp(QListWidgetItem *)), this, SLOT(listChangedSlot())); connect(actionSelector, SIGNAL(movedDown(QListWidgetItem *)), this, SLOT(listChangedSlot())); fritz::FonbookManager *fbm = fritz::FonbookManager::GetFonbookManager(); if (!fbm) return; fonbooks = fbm->GetFonbooks(); for (size_t pos=0; pos < fonbooks->size(); pos++) new KFonbooksWidgetListItem(i18n((*fonbooks)[pos]->GetTitle().c_str()), (*fonbooks)[pos]->GetTechId().c_str(), actionSelector->availableListWidget()); } KFonbooksWidget::~KFonbooksWidget() { } QStringList KFonbooksWidget::getList() const { QStringList list; for (int pos=0; pos < actionSelector->selectedListWidget()->count(); pos++) { KFonbooksWidgetListItem *item = static_cast(actionSelector->selectedListWidget()->item(pos)); list.append(item->getId()); } return list; } void KFonbooksWidget::setList(QStringList &list) { // move all to left while(actionSelector->selectedListWidget()->count()) actionSelector->availableListWidget()->addItem(actionSelector->selectedListWidget()->takeItem(0)); // move selected items to right for (int i=0; i < list.count(); i++) { for (int j=0; j < actionSelector->availableListWidget()->count(); j++) { if (static_cast(actionSelector->availableListWidget()->item(j))->getId() == list[i]) { actionSelector->selectedListWidget()->addItem(actionSelector->availableListWidget()->takeItem(j)); break; } } } } void KFonbooksWidget::listChangedSlot() { emit listChanged(getList()); } kfritz/LibFritzInit.cpp0000664000175000017500000000557712067033012013260 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "LibFritzInit.h" #include #include #include #include #include #include #include #include #include #include #include "KSettings.h" #include "Log.h" LibFritzInit::LibFritzInit(QString password, fritz::EventHandler *eventHandler) { setTerminationEnabled(true); this->eventHandler = eventHandler; setPassword(password); } LibFritzInit::~LibFritzInit() { } void LibFritzInit::run() { emit ready(false); bool locationSettingsDetected; std::string countryCode = KSettings::countryCode().toStdString(); std::string areaCode = KSettings::areaCode().toStdString(); KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if (args->isSet("log-personal-info")) { INF("Warning: Logging personal information requested!") } // start libfritz++ fritz::Config::Setup(KSettings::hostname().toStdString(), password.toStdString(), args->isSet("log-personal-info")); fritz::Config::SetupConfigDir(KStandardDirs::locateLocal("data", KGlobal::mainComponent().aboutData()->appName()+'/').toStdString()); std::vector vFonbook; QStringList phonebookList = KSettings::phonebookList(); while (phonebookList.count()) vFonbook.push_back(phonebookList.takeFirst().toStdString()); fritz::FonbookManager::CreateFonbookManager(vFonbook, "", false); bool validPassword = fritz::Config::Init(&locationSettingsDetected, &countryCode, &areaCode); if (!validPassword) { emit invalidPassword(); return; } if (locationSettingsDetected) { KSettings::setCountryCode(QString(countryCode.c_str())); KSettings::setAreaCode(QString(areaCode.c_str())); KSettings::self()->writeConfig(); } std::vector vMsn; QStringList msnList = KSettings::mSNFilter(); while (msnList.count()) vMsn.push_back(msnList.takeFirst().toStdString()); fritz::Config::SetupMsnFilter(vMsn); fritz::Listener::CreateListener(eventHandler); fritz::CallList::CreateCallList(); emit ready(true); } void LibFritzInit::setPassword(QString password) { this->password = password; } kfritz/KFritzModel.h0000664000175000017500000000303612067033023012534 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KFRITZMODEL_H #define KFRITZMODEL_H #include #include #include class KFritzModel : public QAbstractItemModel { Q_OBJECT public: KFritzModel(); virtual ~KFritzModel(); virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; virtual QModelIndex parent(const QModelIndex &child) const; QString toUnicode(const std::string str) const; std::string fromUnicode(const QString str) const; virtual std::string number(const QModelIndex &index) const = 0; Q_SIGNALS: void updated(); protected Q_SLOTS: virtual void check() = 0; protected: QTimer *timer; private: QTextCodec *inputCodec; }; #endif /* KFRITZMODEL_H_ */ kfritz/Log.cpp0000664000175000017500000000444012067033012011414 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "Log.h" #include #include LogBuf::LogBuf(eLogType type) { const unsigned int BUFFER_SIZE = 1024; char *ptr = new char[BUFFER_SIZE]; setp(ptr, ptr + BUFFER_SIZE); setg(0, 0, 0); this->type = type; logWidget = NULL; connect(this, SIGNAL(signalAppend(QString)), this, SLOT(slotAppend(QString))); } void LogBuf::setLogWidget(KTextEdit *te) { logWidget = te; } void LogBuf::slotAppend(QString m) { if (logWidget) logWidget->insertPlainText(m); std::cout << m.toStdString(); } void LogBuf::PutBuffer(void) { if (pbase() != pptr()) { int len = (pptr() - pbase()); char *buffer = new char[len + 1]; strncpy(buffer, pbase(), len); buffer[len] = 0; switch (type) { case INFO: emit signalAppend(buffer); break; case ERROR: emit signalAppend(buffer); break; case DEBUG: emit signalAppend(buffer); break; default: break; } setp(pbase(), epptr()); delete [] buffer; } } int LogBuf::overflow(int c) { PutBuffer(); if (c != EOF) { sputc(c); } return 0; } int LogBuf::sync() { PutBuffer(); return 0; } LogBuf::~LogBuf() { sync(); delete[] pbase(); } LogStream::LogStream(LogBuf::eLogType type) :std::ostream(buffer = new LogBuf(type)) { } LogStream *LogStream::setLogWidget(KTextEdit *te) { buffer->setLogWidget(te); return this; } LogStream *LogStream::getLogStream(LogBuf::eLogType type) { if (!streams[type]) streams[type] = new LogStream(type); return streams[type]; } LogStream *LogStream::streams[]; kfritz/LibFritzI18N.cpp0000664000175000017500000000176412067103262013033 0ustar jojo/* * KFritz * * Copyright (C) 2011 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ // Automatically updated by 'make LibFritzI18N.cpp' i18n("das-oertliche.de") i18n("Fritz!Box phone book") i18n("ISDN") i18n("Local phone book") i18n("nummerzoeker.com") i18n("POTS") i18n("tel.local.ch") kfritz/Log.h0000664000175000017500000000331012067033023011056 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include // logging macros DBG, INF, ERR #undef NAMESPACE #define NAMESPACE "kfritz" #ifndef LOG_H #define LOG_H class LogBuf : public QObject, public std::streambuf { Q_OBJECT public: enum eLogType { DEBUG, INFO, ERROR, NumLogTypes }; private: void PutBuffer(void); void PutChar(char c); eLogType type; KTextEdit *logWidget; protected: int overflow(int); int sync(); public: LogBuf(eLogType type); virtual ~LogBuf(); void setLogWidget(KTextEdit *te); Q_SIGNALS: void signalAppend(QString m); private Q_SLOTS: void slotAppend(QString m); }; class LogStream: public std::ostream { private: LogBuf *buffer; static LogStream *streams[LogBuf::NumLogTypes]; LogStream(LogBuf::eLogType type); //-> use getLogStream() public: LogStream *setLogWidget(KTextEdit *te); static LogStream *getLogStream(LogBuf::eLogType type); }; #endif /* LOG_H_ */ kfritz/KSettingsFritzBox.h0000664000175000017500000000337312067033023013751 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KSETTINGSFRITZBOX_H #define KSETTINGSFRITZBOX_H #include #include #include #include "ui_KSettingsFritzBox.h" // use this class to add a configuration page to a KConfigDialog class KSettingsFritzBox: public QWidget { Q_OBJECT private: Ui_KSettingsFritzBox *ui; public: KSettingsFritzBox(QWidget *parent); virtual ~KSettingsFritzBox(); }; // this is a wrapper class used by KSettingsFritzBox to enable // auto-management of KEditListBox by KConfigDialog class KMSNListWidget : public QWidget { Q_OBJECT Q_PROPERTY(QStringList list READ getList WRITE setList NOTIFY listChanged USER true) private: KEditListBox *msnList; public: KMSNListWidget(QWidget *parent, KEditListBox *msnList); virtual ~KMSNListWidget(); QStringList getList() const; void setList(QStringList &list); public Q_SLOTS: void listChangedSlot(); Q_SIGNALS: void listChanged(const QStringList &text); }; #endif /* KSETTINGSFRITZBOX_H_ */ kfritz/main.cpp0000664000175000017500000000466112067103751011634 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KFritz.h" #include #include #include #include #include "KSettings.h" static const char *VERSION = "0.0.12a"; int main (int argc, char *argv[]) { // init KDE-stuff KAboutData aboutData( // The program name used internally. "kfritz", // The message catalog name // If null, program name is used instead. 0, // A displayable program name string. ki18n("KFritz"), // The program version string. VERSION, // Short description of what the app does. ki18n("Notifies about phone activity and browses call history and telephone book on your Fritz!Box"), // The license this code is released under KAboutData::License_GPL, // Copyright Statement ki18n("(c) 2008-2012"), // Optional text shown in the About box. // Can contain any information desired. ki18n("Developed by Matthias Becker and Joachim Wilke."), // The program homepage string. "http://www.joachim-wilke.de/kfritz.html", // The bug report email address "kfritz@joachim-wilke.de"); aboutData.setProgramIconName("modem"); KCmdLineOptions options; options.add("p"); options.add("log-personal-info", ki18n("Log personal information (e.g. passwords, phone numbers, ...)")); KCmdLineArgs::init( argc, argv, &aboutData ); KCmdLineArgs::addCmdLineOptions(options); KApplication app; // create GUI elements, hand-over logArea to mainWindow KFritzWindow mainWindow; if (!KSettings::startMinimized()) mainWindow.show(); KFritz *trayIcon = new KFritz(&mainWindow, &aboutData); trayIcon->show(); int ret = app.exec(); fritz::Config::Shutdown(); return ret; } kfritz/COPYING0000664000175000017500000004310312065570711011233 0ustar jojo GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. kfritz/KSettingsFritzBox.ui0000664000175000017500000000567712065570711014160 0ustar jojo KSettingsFritzBox 0 0 392 304 0 General QFormLayout::ExpandingFieldsGrow Hostname Country code Area code MSN filter Restrict call history and notifications to certain MSNs true KEditListBox::Add|KEditListBox::Remove KLineEdit QLineEdit
klineedit.h
KTabWidget QTabWidget
ktabwidget.h
1
KEditListBox QGroupBox
keditlistbox.h
kfritz/KSettingsMisc.cpp0000664000175000017500000000201512065570711013430 0ustar jojo/* * KFritz * * Copyright (C) 2011 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KSettingsMisc.h" #include KSettingsMisc::KSettingsMisc(QWidget *parent) : QWidget(parent) { ui = new Ui_KSettingsMisc(); ui->setupUi(this); } KSettingsMisc::~KSettingsMisc() { delete ui; } kfritz/KFritzWindow.h0000664000175000017500000000737112067033023012751 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KFRITZWINDOW_H #define KFRITZWINDOW_H #include #include #include #include #include #include #include #include #include "KFonbookModel.h" #include "KCalllistModel.h" #include "KFritzDbusService.h" #include "LibFritzInit.h" #include "LogDialog.h" #include "QAdaptTreeView.h" #include "pkg-config.h" #ifdef INDICATEQT_FOUND #include #include #else namespace QIndicate { class Indicator; class Server; } #endif class KFritzWindow : public KXmlGuiWindow, public fritz::EventHandler { Q_OBJECT private: KTabWidget *tabWidget; LogDialog *logDialog; LibFritzInit *libFritzInit; KFritzDbusService *dbusIface; QString fbPassword; QString appName; QString programName; KNotification *notification; QAdaptTreeView *treeCallList; QIndicate::Indicator *missedCallsIndicator; QWidget *progressIndicator; QTextCodec *inputCodec; QString toUnicode(const std::string string) const; void saveToWallet(KWallet::Wallet *wallet); bool showPasswordDialog(QString &password, bool offerSaving = false); void setupActions(); void initIndicator(); void setProgressIndicator(QString message = QString()); virtual bool queryClose(); std::string getCurrentNumber(); fritz::FonbookEntry::eType mapIndexToType(int index); Q_SIGNALS: void signalNotification(QString event, QString qMessage, bool persistent); private Q_SLOTS: void slotNotification(QString event, QString qMessage, bool persistent); void notificationClosed(); public Q_SLOTS: void updateMissedCallsIndicator(); void showStatusbarBoxBusy(bool b); void updateMainWidgets(bool b); void save(); void quit(); public: KFritzWindow(); virtual ~KFritzWindow(); virtual void HandleCall(bool outgoing, int connId, std::string remoteNumber, std::string remoteName, fritz::FonbookEntry::eType, std::string localParty, std::string medium, std::string mediumName); virtual void HandleConnect(int connId); virtual void HandleDisconnect(int connId, std::string duration); public Q_SLOTS: void showSettings(); void showNotificationSettings(); void updateConfiguration(const QString &dialogName = QString()); void reenterPassword(); void showMainWindow(); void showMissedCalls(QIndicate::Indicator* indicator); void showLog(); void dialNumber(); void copyNumberToClipboard(); void setDefault(); void setType(int index); void reload(); void reconnectISP(); void getIP(); void addEntry(fritz::FonbookEntry *fe = NULL); void deleteEntry(); void cutEntry(); void copyEntry(); void pasteEntry(); void resolveNumber(); void updateActionProperties(int tabIndex); void updateCallListContextMenu(const QModelIndex ¤t, const QModelIndex &previous); void updateFonbookContextMenu(const QModelIndex ¤t, const QModelIndex &previous); void updateFonbookState(); }; #endif /*KFRITZBOXWINDOW_H_*/ kfritz/KCalllistProxyModel.cpp0000664000175000017500000000317112067033012014600 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KCalllistProxyModel.h" #include "KCalllistModel.h" KCalllistProxyModel::KCalllistProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { } KCalllistProxyModel::~KCalllistProxyModel() { } fritz::CallEntry *KCalllistProxyModel::retrieveCallEntry(const QModelIndex &index) const { return static_cast(sourceModel())->retrieveCallEntry(mapToSource(index)); } std::string KCalllistProxyModel::number(const QModelIndex &index) const { return static_cast(sourceModel())->number(mapToSource(index)); } std::string KCalllistProxyModel::name(const QModelIndex &index) const { return static_cast(sourceModel())->name(mapToSource(index)); } void KCalllistProxyModel::sort(int column, Qt::SortOrder order) { static_cast(sourceModel())->sort(column, order); } kfritz/KCalllistModel.cpp0000664000175000017500000001171412067033012013540 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KCalllistModel.h" #include #include #include KCalllistModel::KCalllistModel() { calllist = fritz::CallList::getCallList(false); lastCall = 0; } KCalllistModel::~KCalllistModel() { } QVariant KCalllistModel::data(const QModelIndex & index, int role) const { fritz::CallEntry *ce = calllist->RetrieveEntry(fritz::CallEntry::ALL,index.row()); if (role == Qt::DecorationRole && index.column() == 0) return QVariant(KIcon(ce->type == fritz::CallEntry::INCOMING ? "incoming-call" : ce->type == fritz::CallEntry::OUTGOING ? "outgoing-call" : ce->type == fritz::CallEntry::MISSED ? "missed-call" : "")); if (role == Qt::ToolTipRole && index.column() == 0) return QVariant(ce->type == fritz::CallEntry::INCOMING ? i18n("Incoming call") : ce->type == fritz::CallEntry::OUTGOING ? i18n("Outgoing call") : ce->type == fritz::CallEntry::MISSED ? i18n("Missed call") : ""); if (role != Qt::DisplayRole) return QVariant(); switch (index.column()) { case 1: return QVariant(toUnicode((ce->date + ' ' + ce->time))); break; case 2: if (ce->remoteName.size() == 0) if (ce->remoteNumber.size() == 0) return QVariant(i18n("unknown")); else return QVariant(toUnicode(ce->remoteNumber)); else return QVariant(toUnicode(ce->remoteName)); break; case 3: //TODO: resolve names using available phonebooks and cache result (e.g., in case of dasoertliche etc.) (suggested by Florian Petry / kde-apps.org) return QVariant(toUnicode(ce->localName)); break; case 4: if (ce->type == fritz::CallEntry::MISSED) return QVariant(); return QVariant(toUnicode(ce->duration)); break; default: return QVariant(); } return QVariant(); } QVariant KCalllistModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal){ switch (section) { case 0: return i18n("Type"); break; case 1: return i18n("Date"); break; case 2: return i18n("Name / Number"); break; case 3: return i18n("Local Device"); break; case 4: return i18n("Duration"); break; default: return QVariant(); } } else { return QVariant(); } } fritz::CallEntry *KCalllistModel::retrieveCallEntry(const QModelIndex &index) const { return calllist->RetrieveEntry(fritz::CallEntry::ALL, index.row()); } int KCalllistModel::columnCount(const QModelIndex & parent __attribute__((unused))) const { // the number of columns is independent of the current parent, ignoring this parameter return 5; } int KCalllistModel::rowCount(const QModelIndex & parent) const { if (parent.isValid()) // the model does not have any hierarchy return 0; else return calllist->GetSize(fritz::CallEntry::ALL); } void KCalllistModel::sort(int column, Qt::SortOrder order) { fritz::CallEntry::eElements element; switch (column) { case 0: element = fritz::CallEntry::ELEM_TYPE; break; case 1: element = fritz::CallEntry::ELEM_DATE; break; case 2: element = fritz::CallEntry::ELEM_REMOTENAME; break; case 3: element = fritz::CallEntry::ELEM_LOCALNAME; break; case 4: element = fritz::CallEntry::ELEM_DURATION; break; default: std::cout << __FILE__ << "invalid column to sort for in KCalllistModel" << std::endl; return; break; } calllist->Sort(element, order == Qt::AscendingOrder); emit dataChanged(index(0, 0, QModelIndex()), index(rowCount(QModelIndex()), columnCount(QModelIndex()), QModelIndex())); } void KCalllistModel::check() { if (lastCall != calllist->LastCall()) { reset(); emit updated(); lastCall = calllist->LastCall(); } } std::string KCalllistModel::number(const QModelIndex &index) const { if (index.isValid()) { fritz::CallEntry *ce = calllist->RetrieveEntry(fritz::CallEntry::ALL, index.row()); return ce->remoteNumber; } else return ""; } std::string KCalllistModel::name(const QModelIndex &index) const { if (index.isValid()) { fritz::CallEntry *ce = calllist->RetrieveEntry(fritz::CallEntry::ALL, index.row()); return ce->remoteName; } else return ""; } kfritz/po/0000775000175000017500000000000012065624675010626 5ustar jojokfritz/po/nds.po0000664000175000017500000002141312067267003011741 0ustar jojo# translation of kfritz.po to Low Saxon # Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # Manfred Wiese , 2011. # msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2011-02-24 13:50+0100\n" "Last-Translator: Manfred Wiese \n" "Language-Team: Low Saxon \n" "Language: nds\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Manfred Wiese" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "m.j.wiese@web.de" #: DialDialog.cpp:36 msgid "Dial" msgstr "Wählen" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Nummer wählen" #: DialDialog.cpp:53 #, fuzzy #| msgid "Default number" msgid "Default" msgstr "Standardnummer" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Nummer" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Ankamen Anroop" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Utslippt Anroop" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "nich begäng" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Typ" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Datum" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Naam/Nummer" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Lokaal Reedschap" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Duer" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Naam" #: KFonbookModel.cpp:76 #, fuzzy #| msgid "Number" msgid "Number 1" msgstr "Nummer" #: KFonbookModel.cpp:78 #, fuzzy #| msgid "Number" msgid "Number 2" msgstr "Nummer" #: KFonbookModel.cpp:80 #, fuzzy #| msgid "Number" msgid "Number 3" msgstr "Nummer" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Standardnummer" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nieg Indrag" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Tohuus" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "" #: KFonbookModel.cpp:249 msgid "Work" msgstr "" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Reeknernaam" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Telefoonböker" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "" #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Anner" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "KFritz instellen…" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "" #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Logbook wiesen" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Tofögen" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Wegdoon" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Utslippt Anrööp" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "" #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Allgemeen" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Reeknernaam" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Minimeert starten" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Lokaal Telefoonbook" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Logbook" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "© 2008-2011" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "" #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" kfritz/po/pl.po0000664000175000017500000002526212067267003011576 0ustar jojo# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Åukasz WojniÅ‚owicz , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-04-01 09:58+0200\n" "Last-Translator: Åukasz WojniÅ‚owicz \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.4\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Åukasz WojniÅ‚owicz" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "lukasz.wojnilowicz@gmail.com" #: DialDialog.cpp:36 msgid "Dial" msgstr "Wybierz" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Wybierz numer" #: DialDialog.cpp:53 msgid "Default" msgstr "DomyÅ›lne" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Konwencjonalna sieć telefoniczna" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Zainicjowano wybieranie, teraz podnieÅ› sÅ‚uchawkÄ™" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Numer" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Dostawca" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Rozmowa przychodzÄ…ca" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Rozmowa wychodzÄ…ca" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Połączenia nieodebrane" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "nieznany" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Typ" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Data" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Nazwa / Numer" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "UrzÄ…dzenie lokalne" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Czas trwania" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Nazwa" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Numer 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Numer 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Numer 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Szybkie wybieranie" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Vanity" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Ważny kontakt" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "DomyÅ›lny numer" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nowy wpis" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Domowy" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Komórkowy" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Praca" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Nazwa hosta" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "Nazwa hosta Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Jest to nazwa hosta Fritz!Box w twojej sieci. Najprawdopodobniej jest to " "\"fritz.box\". Alternatywnie możesz użyć także adresu IP zamiast nazwy hosta." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Kod kraju" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "Kod kraju, w którym jest poÅ‚ożony Fritz!Box." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Jest to kod kraju, w którym jest poÅ‚ożony twój Fritz!Box. Normalnie jest to " "automatycznie odczytywane z twojego Fritz!Box, tak że nie musisz tego " "okreÅ›lać tutaj." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Kod obszaru" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "Kod obszaru, w którym jest poÅ‚ożony Fritz!Box." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Jest to kod obszaru, w którym jest poÅ‚ożony twój Fritz!Box. Normalnie jest " "to automatycznie odczytywane z twojego Fritz!Box, tak że nie musisz tego " "okreÅ›lać tutaj." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "Lista filtra MSN" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Książki telefoniczne" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Lista aktywnych książek telefonicznych." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "Uruchom KFritz zminimalizowany" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "WychodzÄ…ca rozmowa do %1
przy wykorzystaniu %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "PrzychodzÄ…ca rozmowa do %1
przy wykorzystaniu %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Rozmowa nawiÄ…zana." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Rozmowa rozłączona (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Konfiguruj połączenie do Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Wybierz używane książki telefoniczne" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Inne" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Konfiguruj inne ustawienia" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Podaj swoje hasÅ‚o Fritz!Box" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Konfiguruj KFritz..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Konfiguruj powiadomienia..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Pokaż dziennik" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Kopiuj numer do schowka" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Ustaw jako domyÅ›lny" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Ustaw typ" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Wczytaj ponownie" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Połącz ponownie z internetem" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Uzyskaj bieżący adres IP" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Dodaj" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "UsuÅ„" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Wyszukaj numeru w książce telefonicznej" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Połączenia nieodebrane" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Pobieranie danych z Fritz!Box..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Historia rozmów" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "Zapisano %1." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Czy zapisać zmiany do %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "Zainicjowano ponowne połączenie." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "Nieudane ponowne połączenie" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "Obecny adres IP to: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 nie rozwiÄ…zaÅ‚ siÄ™." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 rozwiÄ…zuje siÄ™ jako \"%2\"." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Ogólne" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Nazwa hosta" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Filtr MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Ogranicz historiÄ™ rozmów i powiadomienia do pewnych MSN-ów" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Uruchom zminimalizowany" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Książka telefoniczna Fritz!Box" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Lokalna książka telefoniczna" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Dziennik" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Powiadamia o aktywnoÅ›ci telefonu i przeglÄ…da historiÄ™ rozmów i książkÄ™ " "telefonicznÄ… na twoim Fritz!Box" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "(c) 2008-2011" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Napisane przez Matthias Becker i Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "Rejestruj informacje osobiste (np. hasÅ‚a, numery telefonów, ...)" kfritz/po/sk.po0000664000175000017500000002325012067267003011573 0ustar jojo# translation of kfritz.po to Slovak # Roman Paholik , 2012. msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-10-08 14:24+0200\n" "Last-Translator: Roman Paholík \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Roman Paholík" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "wizzardsk@gmail.com" #: DialDialog.cpp:36 msgid "Dial" msgstr "VytáÄanie" #: DialDialog.cpp:39 KFritzWindow.cpp:279 #, fuzzy msgid "Dial number" msgstr "PoÄet riadkov:" #: DialDialog.cpp:53 msgid "Default" msgstr "Predvolené" #: DialDialog.cpp:55 #, fuzzy msgid "Conventional telephone network" msgstr "Typ sieÅ¥ového pripojenia" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Číslo" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Poskytovateľ" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Prichádzajúci hovor" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Odchádzajúci hovor" #: KCalllistModel.cpp:45 #, fuzzy msgid "Missed call" msgstr "Volanie stacku" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "neznámy" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Typ" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Dátum" #: KCalllistModel.cpp:90 #, fuzzy msgid "Name / Number" msgstr "PoÄet riadkov:" #: KCalllistModel.cpp:93 #, fuzzy msgid "Local Device" msgstr "Zariadenie digitálneho fotoaparátu..." #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Trvanie" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Názov" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Číslo 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Číslo 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Číslo 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 #, fuzzy msgid "Important contact" msgstr "Zoznam kontaktov" #: KFonbookModel.cpp:125 #, fuzzy msgid "Default number" msgstr "Å tandardný formát Äísla: %1" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nová položka" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Domov" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Mobil" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Práca" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Hostiteľ" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 #, fuzzy msgid "The host name of the Fritz!Box." msgstr "&Meno hostiteľa alebo domény:" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Kód krajiny" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 #, fuzzy msgid "Area code" msgstr "bkisofs kód" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 #, fuzzy msgid "MSN filter list" msgstr "Zoznam IP filtrov" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 #, fuzzy msgid "Phone books" msgstr "Knihy komiksov" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 #, fuzzy msgid "Start KFritz minimized" msgstr "SpustiÅ¥ v móde ikona (minimalizované)" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "" #: KFritzWindow.cpp:165 #, fuzzy msgid "Call connected." msgstr "Pripojený lokálne" #: KFritzWindow.cpp:177 #, fuzzy, kde-format msgid "Call disconnected (%1)." msgstr "Odpojené zariadenia" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "" #: KFritzWindow.cpp:204 #, fuzzy msgid "Select phone books to use" msgstr "Vyberte režim zápisu" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Ostatné" #: KFritzWindow.cpp:207 #, fuzzy msgid "Configure other settings" msgstr "Nastavenie koÅ¡a" #: KFritzWindow.cpp:253 #, fuzzy msgid "Enter your Fritz!Box password" msgstr "Zadajte vaÅ¡e aktuálne heslo:" #: KFritzWindow.cpp:261 #, fuzzy msgid "Configure KFritz..." msgstr "Nastavenie &filtrov..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "NastaviÅ¥ upozornenia..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "UkázaÅ¥ záznam" #: KFritzWindow.cpp:285 #, fuzzy msgid "Copy number to clipboard" msgstr "KopírovaÅ¥ kontrolný súÄet do schránky" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "NastaviÅ¥ ako predvolené" #: KFritzWindow.cpp:297 #, fuzzy msgid "Set type" msgstr "NastaviÅ¥ typ bodu" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Znovu naÄítaÅ¥" #: KFritzWindow.cpp:314 #, fuzzy msgid "Reconnect to the Internet" msgstr "PripojiÅ¥ k Internetu" #: KFritzWindow.cpp:320 #, fuzzy msgid "Get current IP address" msgstr "Geolokalizácia z IP adresy." #: KFritzWindow.cpp:326 msgid "Add" msgstr "PridaÅ¥" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "OdstrániÅ¥" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "ZmeÅ¡kané hovory" #: KFritzWindow.cpp:401 #, fuzzy msgid "Retrieving data from Fritz!Box..." msgstr "Získavanie dát z %1 nie je podporované." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "História volaní" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1 uložené." #: KFritzWindow.cpp:519 #, fuzzy, kde-format msgid "Save changes to %1?" msgstr "UložiÅ¥ zmeny do dokumentu %1?" #: KFritzWindow.cpp:604 #, fuzzy msgid "Reconnect initiated." msgstr "Oneskorenie pri opätovnom pripojení:" #: KFritzWindow.cpp:606 #, fuzzy msgid "Reconnect failed." msgstr "Prihlásenie zlyhalo." #: KFritzWindow.cpp:614 #, fuzzy, kde-format msgid "Current IP address is: %1" msgstr "Neuvedená adresa odosielateľa." #: KFritzWindow.cpp:688 #, fuzzy, kde-format msgid "%1 did not resolve." msgstr "Neskúšal som to znovu" #: KFritzWindow.cpp:696 #, fuzzy, kde-format msgid "%1 resolves to \"%2\"." msgstr "OdoslaÅ¥ na %1" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "VÅ¡eobecné" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Názov hostiteľa" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 #, fuzzy msgid "MSN filter" msgstr "PridaÅ¥ filter" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 #, fuzzy msgid "Start minimized" msgstr "SpustiÅ¥ prezentáciu" #: LibFritzI18N.cpp:24 #, fuzzy msgid "das-oertliche.de" msgstr "Roberto De Leo" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 #, fuzzy msgid "Local phone book" msgstr "Komponent adresára" #: LibFritzI18N.cpp:28 #, fuzzy msgid "nummerzoeker.com" msgstr "HyperDictionary.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 #, fuzzy msgid "tel.local.ch" msgstr "VrátiÅ¥ lokálne zmeny" #: LogDialog.cpp:35 msgid "Log" msgstr "Záznam" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "(c) 2008-2011" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "" #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" kfritz/po/cs.po0000664000175000017500000002500712067267003011565 0ustar jojo# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # Vít PelÄák , 2011, 2012. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-11-23 10:54+0100\n" "Last-Translator: Vit Pelcak \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.4\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Vít PelÄák, Tomáš Gal" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "vit@pelcak.org,tux@treenet.ch" #: DialDialog.cpp:36 msgid "Dial" msgstr "VytoÄit" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "VytoÄit Äíslo" #: DialDialog.cpp:53 msgid "Default" msgstr "Výchozí nastavení" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "KonvenÄní telefonní síť" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Číslo vytoÄeno. Nyní zvednÄ›te sluchátko" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Číslo" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Operátor" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Příchozí hovor" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Odchozí hovor" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "ZmeÅ¡kaný hovor" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "neznámý" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Typ" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Datum" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Jméno / Äíslo" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Místní zařízení" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Trvání" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Jméno" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Číslo 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Číslo 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Číslo 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Rychlovolba" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Model" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Důležité Äíslo" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Výchozí Äíslo" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nový záznam" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Domů" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Mobil" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Práce" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Název Serveru" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "Název Serveru Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Zde najdete název VaÅ¡eho serveru Fritz!Box ve Vaší síti. PravdÄ›podobnÄ› je to " "\"fritz.box\". Jako alternativu lze použít místo názvu stávající IP adresu." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Kód zemÄ›" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "PÅ™edÄíslí zemÄ›, kde je Fritz!Box umístÄ›n." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Toto je pÅ™edÄíslí zemÄ› nastavené ve VaÅ¡em Fritz!Boxu. Toto nastavení je " "obvykle naÄteno z Fritz!Boxu a není nutné jej zadávat ruÄnÄ›." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "PÅ™edÄíslí oblasti" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "PÅ™edÄíslí oblasti odpovídající umístÄ›ní Fritz!Boxu." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Toto je pÅ™edÄíslí oblasti nastavené ve VaÅ¡em Fritz!Boxu. Toto nastavení je " "obvykle naÄteno z Fritz!Boxu a není nutné jej zadávat ruÄnÄ›." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "Seznam filtrů MSN." #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Telefonní seznamy" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Seznam aktivovaných telefonních seznamů." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "Spustit program KFritz v minimalizovaném režimu" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Odchozí hovor k %1
používající %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Příchozí telefonní hovor od %1
používající %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Hovor spojen." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Hovor byl odpojen (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Nastavte spojeni k Fritz!Boxu" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Vyberte telefonní seznam" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Jiné" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Změňte jiná nastavení" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Zadejte heslo Fritz!Boxu" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Nastavit KFritz..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Nastavit oznamování..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Zobrazit záznamy" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Zkopírovat Äíslo do schránky" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Nastavit jako výchozí" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Nastavit typ" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Obnovit" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Obnovit pÅ™ipojení k internetu" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Získat stávající IP adresu" #: KFritzWindow.cpp:326 msgid "Add" msgstr "PÅ™idat" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Smazat" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Vyhledat telefonní Äíslo v seznamech" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "ZmeÅ¡kané hovory" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Získávání dat z Fritz!Boxu..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Historie volání" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1' uložen." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Uložit zmÄ›ny do %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "SpuÅ¡tÄ›no opakované spojení" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "Chyba opakovaného spojení." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "Stávající IP adresa je: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 nepÅ™evedeno." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 pÅ™evedeno na \"%2\"." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Obecné" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Název poÄítaÄe" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Filtr MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Omezit historii volání a upozornÄ›ní na jisté MSN" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Spustit minimalizovaný" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Telefonní seznam Fritz!Boxu" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Místní telefonní seznam" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Záznam" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Informace o aktivitách telefonu a prohlíží historii hledání a telefonní " "seznam ve VaÅ¡em Fritz!Boxu" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "(c) 2008-2012" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "AutoÅ™i: Matthias Becker a Joachim Wilke. " #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "Záznam osobních informací (napÅ™. heslo, telefonní Äísla...)" kfritz/po/ga.po0000664000175000017500000002100312067267003011537 0ustar jojo# Irish translation of kfritz # Copyright (C) 2011 This_file_is_part_of_KDE # This file is distributed under the same license as the kfritz package. # Kevin Scannell , 2011. msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2011-12-28 12:28-0500\n" "Last-Translator: Kevin Scannell \n" "Language-Team: Irish \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n < 11 ? " "3 : 4\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Kevin Scannell" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "kscanne@gmail.com" #: DialDialog.cpp:36 msgid "Dial" msgstr "Diail" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "" #: DialDialog.cpp:53 msgid "Default" msgstr "Réamhshocrú" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Uimhir" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Soláthraí" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "anaithnid" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Cineál" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Dáta" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Aga" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Ainm" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Uimhir 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Uimhir 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Iontráil Nua" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Baile" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Fón Póca" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Obair" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "ÓstAinm" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Cód tíre" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "" #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Eile" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Cumraigh Fógairt..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Athluchtaigh" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Cuir Leis" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Scrios" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "" #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Ginearálta" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Óstainm" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "LDSC" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "" #: LogDialog.cpp:35 msgid "Log" msgstr "Logáil" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "© 2008-2012" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Forbartha ag Matthias Becker agus Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" kfritz/po/de.po0000664000175000017500000002632712067267003011556 0ustar jojo# Copyright (C) 2010 # Joachim Wilke , 2010, 2011. # Frederik Schwarzer , 2011. # Burkhard Lück , 2011. msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2011-07-03 15:42+0200\n" "Last-Translator: Burkhard Lück \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.2\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Matthias Becker, Joachim Wilke" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr ", kfritz@joachim-wilke.de" #: DialDialog.cpp:36 msgid "Dial" msgstr "Wählen" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Nummer wählen" #: DialDialog.cpp:53 msgid "Default" msgstr "Standard" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Festnetz" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Es wird gewählt - Telefon jetzt abnehmen." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Nummer" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Anbieter" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Eingehender Anruf" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Ausgehender Anruf" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Verpasster Anruf" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "unbekannt" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Typ" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Datum" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Name/Nummer" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Endgerät" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Dauer" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Name" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "1. Nummer" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "2. Nummer" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "3. Nummer" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Kurzwahl" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Vanity" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Wichtige Person" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Hauptnummer" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Neuer Eintrag" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Privat" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Handy" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Büro" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Adresse" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "Adresse der Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Dies ist die Adresse der Fritz!Box. Höchstwahrscheinlich ist dies \"fritz.box" "\". Alternativ kann auch die IP-Adresse verwendet werden." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Ländervorwahl" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "Die Landesvorwahl des Ortes der Fritz!Box." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Dies ist die Landesvorwahl des Ortes der Fritz!Box. Normalerweise wird diese " "automatisch von der Fritz!Box übernommen und muss hier nicht angegeben " "werden." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Ortsvorwahl" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "Die Ortsvorwahl des Ortes der Fritz!Box." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Die ist die Ortsvorwahl des Ortes der Fritz!Box. Normalerweise wird diese " "automatisch von der Fritz!Box übernommen und muss hier nicht angegeben " "werden." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "MSN-Filterlist" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Telefonbücher" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Liste der genutzten Telefonbücher." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "KFritz minimiert starten" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Ausgehender Anruf zu %1
%2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Eingehender Anruf von %1
%2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Anruf angenommen." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Anruf beendet (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Verbindung zur Fritz!Box einrichten" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Zu benutzende Telefonbücher auswählen" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Sonstiges" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Sonstige Einstellungen" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Geben Sie Ihr Fritz!Box-Passwort ein" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "KFritz einrichten ..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Benachrichtigungen einrichten ..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Protokoll anzeigen" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Nummer in Zwischenablage kopieren" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Nummer als Hauptnummer markieren" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Neu laden" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Verbindung zum Internet neu aufbauen" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Aktuelle IP-Adresse anzeigen" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Hinzufügen" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Löschen" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Nummer in Telefonbüchern nachschlagen" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Verpasste Anrufe" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Daten werden von der Fritz!Box abgerufen ..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Anrufliste" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Änderungen in %1 speichern?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "Verbindung wird wiederhergestellt." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "Wiederherstellung der Verbindung fehlgeschlagen." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "Aktuelle IP-Adresse: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "Kein Treffer für %1." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 gehört zu \"%2\"." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Allgemein" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Adresse" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "MSN-Filter" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Anrufliste und Benachrichtigungen auf bestimmte MSN einschränken" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Minimiert starten" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Fritz!Box-Telefonbuch" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Lokales Telefonbuch" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "Festnetz" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Protokoll" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Signalisiert ein- und ausgehende Telefonanrufe und zeigt Telefonbuch und " "Anrufliste der Fritz!Box an" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "(c) 2008-2011" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Entwickelt von Matthias Becker und Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" "Persönliche Informationen (Passwörter, Telefonnummern ...) protokollieren" #~ msgid "Show log window" #~ msgstr "Protokoll anzeigen" #~ msgid "Resolve number" #~ msgstr "Nummer nachschlagen" #~ msgid "Form" #~ msgstr "Formular" #~ msgid "Add phone book entry" #~ msgstr "Telefonbucheintrag hinzufügen" #~ msgid "" #~ "Can not dial without a number.\n" #~ "Select an entry in a phone book or the call history which contains a " #~ "number or name and try again." #~ msgstr "" #~ "Wählen ohne Nummer nicht möglich.\n" #~ "Wählen sie einen Anruflisten- oder Telefonbucheintrag aus, der eine " #~ "Telefonnummer enthält. Versuchen sie es danach erneut." #~ msgid "Delete phone book entry" #~ msgstr "Telefonbucheintrag löschen" #~ msgid "Dialing not possible" #~ msgstr "Wählen nicht möglich" #~ msgid "Important" #~ msgstr "Wichtig" #, fuzzy #~ msgid "New entry" #~ msgstr "Neuer Eintrag" kfritz/po/x-test.po0000664000175000017500000002502212067267003012401 0ustar jojo# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-11-23 06:06+0000\n" "Last-Translator: transxx.py program \n" "Language-Team: KDE Test Language \n" "Language: x-test\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "xxYour namesxx" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "xxYour emailsxx" #: DialDialog.cpp:36 msgid "Dial" msgstr "xxDialxx" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "xxDial numberxx" #: DialDialog.cpp:53 msgid "Default" msgstr "xxDefaultxx" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "xxConventional telephone networkxx" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "xxDialing initiated, pick up your phone now.xx" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "xxNumberxx" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "xxProviderxx" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "xxIncoming callxx" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "xxOutgoing callxx" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "xxMissed callxx" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "xxunknownxx" #: KCalllistModel.cpp:84 msgid "Type" msgstr "xxTypexx" #: KCalllistModel.cpp:87 msgid "Date" msgstr "xxDatexx" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "xxName / Numberxx" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "xxLocal Devicexx" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "xxDurationxx" #: KFonbookModel.cpp:74 msgid "Name" msgstr "xxNamexx" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "xxNumber 1xx" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "xxNumber 2xx" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "xxNumber 3xx" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "xxQuickdialxx" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "xxVanityxx" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "xxImportant contactxx" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "xxDefault numberxx" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "xxNew Entryxx" #: KFonbookModel.cpp:245 msgid "Home" msgstr "xxHomexx" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "xxMobilexx" #: KFonbookModel.cpp:249 msgid "Work" msgstr "xxWorkxx" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "xxHost namexx" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "xxThe host name of the Fritz!Box.xx" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "xxThis is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name.xx" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "xxCountry codexx" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "xxThe country code the Fritz!Box is located in.xx" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "xxThis is the country code your Fritz!Box is located in. Normally this is " "read automatically from your Fritz!Box so you do not need to specify it here." "xx" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "xxArea codexx" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "xxThe area code the Fritz!Box is located in.xx" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "xxThis is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here.xx" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "xxMSN filter listxx" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "xxPhone booksxx" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "xxList of active phone books.xx" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "xxStart KFritz minimizedxx" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "xxOutgoing call to %1
using %2xx" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "xxIncoming call from %1
using %2xx" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "xxCall connected.xx" #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "xxCall disconnected (%1).xx" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "xxFritz!Boxxx" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "xxConfigure connection to Fritz!Boxxx" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "xxSelect phone books to usexx" #: KFritzWindow.cpp:207 msgid "Other" msgstr "xxOtherxx" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "xxConfigure other settingsxx" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "xxEnter your Fritz!Box passwordxx" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "xxConfigure KFritz...xx" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "xxConfigure Notifications...xx" #: KFritzWindow.cpp:273 msgid "Show log" msgstr "xxShow logxx" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "xxCopy number to clipboardxx" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "xxSet as defaultxx" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "xxSet typexx" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "xxReloadxx" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "xxReconnect to the Internetxx" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "xxGet current IP addressxx" #: KFritzWindow.cpp:326 msgid "Add" msgstr "xxAddxx" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "xxDeletexx" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "xxLook up number in phone booksxx" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "xxMissed callsxx" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "xxRetrieving data from Fritz!Box...xx" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "xxCall historyxx" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "xx%1 saved.xx" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "xxSave changes to %1?xx" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "xxReconnect initiated.xx" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "xxReconnect failed.xx" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "xxCurrent IP address is: %1xx" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "xx%1 did not resolve.xx" #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "xx%1 resolves to \"%2\".xx" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "xxGeneralxx" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "xxHostnamexx" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "xxMSN filterxx" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "xxRestrict call history and notifications to certain MSNsxx" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "xxStart minimizedxx" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "xxdas-oertliche.dexx" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "xxFritz!Box phone bookxx" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "xxISDNxx" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "xxLocal phone bookxx" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "xxnummerzoeker.comxx" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "xxPOTSxx" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "xxtel.local.chxx" #: LogDialog.cpp:35 msgid "Log" msgstr "xxLogxx" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "xxKFritzxx" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "xxNotifies about phone activity and browses call history and telephone book " "on your Fritz!Boxxx" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "xx(c) 2008-2012xx" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "xxDeveloped by Matthias Becker and Joachim Wilke.xx" #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "xxLog personal information (e.g. passwords, phone numbers, ...)xx" kfritz/po/ug.po0000664000175000017500000002131612067267003011572 0ustar jojo# Uyghur translation for kfritz. # Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # Sahran , 2011. # msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2011-05-09 19:00+0900\n" "Last-Translator: Sahran \n" "Language-Team: Uyghur Computer Science Association \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "ئابدۇقادىر ئابلىز, غەيرەت كەنجى" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "sahran.ug@gmail.com, gheyret@gmail.com" #: DialDialog.cpp:36 msgid "Dial" msgstr "نومۇر Ø¨ÛØ³Ù‰Ø´" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "" #: DialDialog.cpp:53 msgid "Default" msgstr "كۆڭۈلدىكى" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "نومۇرى" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "تەمىنلىگۈچى" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "بىرى چاقىرىۋاتىدۇ" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "نامەلۇم" #: KCalllistModel.cpp:84 msgid "Type" msgstr "تىپى" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Ú†ÛØ³Ù„ا" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "ۋاقتى" #: KFonbookModel.cpp:74 msgid "Name" msgstr "ئاتى" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "" #: KFonbookModel.cpp:245 msgid "Home" msgstr "ماكان" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "يانÙون" #: KFonbookModel.cpp:249 msgid "Work" msgstr "ئىش" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "ÙƒÙˆÙ…Ù¾ÙŠÛ‡ØªÛØ± ئىسمى" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "" #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "" #: KFritzWindow.cpp:207 msgid "Other" msgstr "باشقا" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "ئۇقتۇرۇشلارنى سەپلە" #: KFritzWindow.cpp:273 msgid "Show log" msgstr "" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "كۆڭۈلدىكى قىممەتكە تەڭشە" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "قايتا يۈكلە" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "" #: KFritzWindow.cpp:326 msgid "Add" msgstr "قوش" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "ئۆچۈر" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "سۆزلەشمىگەن چاقىرىشلار" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "ئىز" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "" #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "ئادەتتىكى" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "ÙƒÙˆÙ…Ù¾ÙŠÛ‡ØªÛØ± ئاتى" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "" #: LogDialog.cpp:35 msgid "Log" msgstr "خاتىرە" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "" #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" kfritz/po/nl.po0000664000175000017500000002643712067267003011601 0ustar jojo# Copyright (C) 2010 # This file is distributed under the same license as the KFritz package. # # Richard Bos , 2010. # Freek de Kruijf , 2011, 2012. # Freek de Kruijf , 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-11-30 21:48+0100\n" "Last-Translator: Freek de Kruijf \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Freek de Kruijf" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "freekdekruijf@kde.nl" #: DialDialog.cpp:36 msgid "Dial" msgstr "Kiezen" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Bel nummer" #: DialDialog.cpp:53 msgid "Default" msgstr "Standaard" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Conventioneel telefoonnetwerk" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Kiezen opgestart, pak de telefoon nu op." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Telefoonnummer" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Provider" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Inkomend gesprek" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Uitgaand gesprek" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Gemist gesprek" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "onbekend" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Type" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Datum" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Naam / nummer" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Lokaal toestel" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Gespreksduur" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Naam" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Nummer 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Nummer 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Nummer 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Verkort kiezen" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Alias" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Belangrijk contact" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Standaard nummer" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nieuw item" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Thuis" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "GSM" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Werk" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Hostnaam" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "De hostnaam van de Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Dit is de hostnaam van de Fritz!Box in uw netwerk. Dit is het meest " "waarschijnlijk \"fritz.box\". Als alternatief kunt u ook in plaats van de " "hostnaam het IP-adres gebruiken." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Landencode" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "De landcode waarin de Fritz!Box zich bevindt." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Dit is de landcode waarin de Fritz!Box zich bevindt. Normaal wordt dit " "automatisch uit uw Fritz!Box gelezen, zodat u het hier niet behoeft te " "specificeren." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Kengetal" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "Het netnummer van het gebied waarin de Fritz!Box zich bevindt." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Dit is het netnummer van het gebied waarin de Fritz!Box zich bevindt. " "Normaal wordt dit automatisch uit uw Fritz!Box gelezen, zodat u het hier " "niet behoeft te specificeren." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "MSN filterlijst" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Telefoonboeken" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Lijst met actieve telefoonboeken." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "KFritz geminimaliseerd starten" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Uitgaand gesprek naar %1
met %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Inkomend gesprek van %1
met %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Verbinding opgezet." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Verbinding verbroken (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Verbinding naar de Fritz!Box instellen" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Telefoonnummerbron instellen" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Overig" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Andere instellingen configureren..." #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Geef je Fritz!Box passeerwoord" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "KFritz instellen..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Meldingen instellen..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Laat de log zien" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Kopieer nummer naar clipboard" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Als standaard zetten" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Stel type in" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Herladen" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Opnieuw met internet verbinden" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Haal huidig IP adres op" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Toevoegen" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Verwijderen" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Nummer opzoeken in telefoonboeken" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Gemiste gesprekken" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Informatie ophalen van de Fritz!Box..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Gespreksgeschiedenis" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1 opgeslagen." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Wijzigingen opslaan naar %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "Opnieuw verbinden opgestart" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "Opnieuw verbinden is mislukt." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "Het huidige IP adres is: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 niet gevonden." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 vertaald in \"%2\"." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Algemeen" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Hostnaam" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "MSN filter" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Beperk gespreksgeschiedenis en meldingen tot bepaalde MSN nummers" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Geminimaliseerd starten" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Fritz!Box telefoonboek" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Lokaal telefoonboek" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Log" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Geeft informatie over telefoongebruik, belgeschiedenis en telefoonboek op je " "Fritz!Box" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "(c) 2008-2012" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Ontwikkeld door Matthias Becker en Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" "Log persoonlijke informatie (bijvoorbeeld passeerwoorden, " "telefoonnummer, ....)" #, fuzzy #~| msgid "Show log" #~ msgid "Show log window" #~ msgstr "Laat de log zien" #, fuzzy #~ msgid "Resolve number" #~ msgstr "Standaard nummer" #~ msgid "Form" #~ msgstr "Formulier" #, fuzzy #~ msgid "Add phone book entry" #~ msgstr "Telefoonnummerbron instellen" #~ msgid "" #~ "Can not dial without a number.\n" #~ "Select an entry in a phone book or the call history which contains a " #~ "number or name and try again." #~ msgstr "" #~ "Kan zonder nummer niet bellen.\n" #~ "Selecteer een item uit het telefoonboek of belgeschiedenis dat een nummer " #~ "of naam bevat en probeer het nogmaals." #, fuzzy #~ msgid "Delete phone book entry" #~ msgstr "Telefoonnummerbron instellen" #~ msgid "Dialing not possible" #~ msgstr "Bellen is niet mogelijk" #~ msgid "Done" #~ msgstr "Gedaan" kfritz/po/et.po0000664000175000017500000002433212067267003011570 0ustar jojo# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Marek Laane , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-11-26 20:19+0200\n" "Last-Translator: Marek Laane \n" "Language-Team: Estonian \n" "Language: et\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Marek Laane" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "bald@smail.ee" #: DialDialog.cpp:36 msgid "Dial" msgstr "Helista" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Numbri valimine" #: DialDialog.cpp:53 msgid "Default" msgstr "Vaikimisi" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Tavatelefonivõrk" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Alustati valimist, võta nüüd telefon." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Number" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Teenusepakkuja" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Sisenev kõne" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Väljuv kõne" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Vastamata kõne" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "tundmatu" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Tüüp" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Kuupäev" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Nimi / number" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Kohalik seade" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Kestus" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Nimi" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Number 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Number 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Number 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Kiirvalimine" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Tähtnumber" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Tähtis kontakt" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Vaikimisi number" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Uus kirje" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Kodu" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Mobiil" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Töö" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Masinanimi" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "Fritz!Boxi masinanimi." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Fritz!Boxi masinanimi sinu võrgus. Tõenäoliselt on see \"fritz.box\". Soovi " "korral võib masinanime asemel kasutada ka IP-aadressi." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Riigikood" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "Fritz!Boxi asukoha riigikood." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Fritz!Boxi asukoha riigikood. Tavaliselt loetakse see Fritz!Boxist " "automaatselt, nii et siin ei pruugi olla vaja midagi muuta." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Piirkonnakood" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "Fritz!Boxi asukoha piirkonnakood." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Fritz!Boxi asukoha piirkonnakood. Tavaliselt loetakse see Fritz!Boxist " "automaatselt, nii et siin ei pruugi olla vaja midagi muuta." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "MSN filtri nimekiri" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Telefoniraamatud" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Aktiivsete telefoniraamatute nimekiri." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "KFritzi käivitamine minimeerituna" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Väljuv kõne kontaktile %1
%2 vahendusel" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Sisenev kõne kontaktilt %1
%2 vahendusel" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Kõne on ühendatud." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Kõne on katkestatud (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Ühenduse seadistamine Fritz!Boxiga" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Kasutatavate telefoniraamatute valimine" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Muu" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Muud seadistused" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Kirjuta Fritz!Boxi parool" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "KFritzi seadistamine..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Märguannete seadistamine..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Logi näitamine" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Kopeeri number lõikepuhvrisse" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Määra vaikeväärtuseks" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Määra tüüp" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Laadi uuesti" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Ühendu uuesti internetti" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Hangi aktiivne IP-aadress" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Lisa" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Kustuta" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Otsi numbrit telefoniraamatust" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Vastamata kõned" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Andmete hankimine Fritz!Boxist..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Kõnede ajalugu" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1 salvestatud." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Kas salvestada %1 muutused?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "Algatati taasühendumine." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "Taasühendumine nurjus." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "Aktiivne IP-aadress on %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 ei lahendu." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 lahendub: \"%2\"." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Üldine" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Masinanimi" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "MSN filter" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Kõnede ajaloo ja märguannete piiramine teatud MSN-idega" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Käivitamine minimeerituna" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Fritz!Boxi telefoniraamat" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Kohalik telefoniraamat" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Logi" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Märguanded telefoni tegevuse kohta ning Fritz!Boxi kõnede ajaloo ja " "telefoniraamatu sirvimine." #: main.cpp:50 msgid "(c) 2008-2012" msgstr "(c) 2008-2012" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Arendajad: Matthias Becker ja Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "Isikliku teabe logimine (nt. paroolid, telefoninumbrid jms.)" kfritz/po/fr.po0000664000175000017500000002567312067267003011600 0ustar jojo# translation of kfritz.po to Français # Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Joëlle Cornavin , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-04-18 17:16+0200\n" "Last-Translator: Joëlle Cornavin \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Joëlle Cornavin" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "jcorn@free.fr" #: DialDialog.cpp:36 msgid "Dial" msgstr "Numéroter" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Composer un numéro" #: DialDialog.cpp:53 msgid "Default" msgstr "Par défaut" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Réseau téléphonique conventionnel" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Numérotation effectuée, choisissez votre téléphone maintenant." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Numéro" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Fournisseur" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Appel entrant" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Appel sortant" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Appel manqué" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "inconnu" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Type" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Date" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Nom / Numéro" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Périphérique local" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Durée" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Nom" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Numéro 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Numéro 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Numéro 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Numérotation abrégée" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Numéro vert" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Contact important" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Numéro par défaut" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nouvel élément" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Domicile" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Mobile" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Travail" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Nom de l'hôte" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "Le nom d'hôte de la Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Il s'agit du nom d'hôte de la Fritz!Box dans votre réseau. Il est fort " "probable que ce soit « fritz.box ». À titre d'alternative, vous pouvez " "également utiliser l'adresse IP au lieu du nom d'hôte." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Indicatif de pays" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "L'indicatif du pays dans lequel se trouve la Fritz!Box." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Il s'agit de l'indicatif du pays dans lequel se trouve votre Fritz!Box. " "Normalement, celui-ci étant lu automatiquement depuis votre Fritz!Box, vous " "n'avez pas à le spécifier ici." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Indicatif régional" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "L'indicatif régional dans lequel se trouve votre Fritz!Box." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Il s'agit de l'indicatif régional dans lequel se trouve votre Fritz!Box. " "Normalement, celui-ci étant lu depuis votre Fritz!Box, vous n'avez pas à le " "spécifier ici." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "Liste de filtres MSN" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Répertoires téléphoniques" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Liste des répertoires téléphoniques actifs." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "Démarrer KFritz en mode réduit" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Appel sortant vers %1
à l'aide de %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Appel entrant depuis %1
à l'aide de %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Appel connecté." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Appel déconnecté (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Configurer la connexion à Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Sélectionner les répertoires téléphoniques à utiliser" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Autre" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Configurer les autres paramètres" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Saisissez votre mot de passe Fritz!Box" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Configurer KFritz..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Configurer les notifications..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Afficher le journal" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Copier le numéro dans le presse-papiers" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Définir comme réglage par défaut" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Définir un type" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Recharger" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Se reconnecter à l'Internet" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Obtenir l'adresse IP actuelle" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Ajouter" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Supprimer" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Consulter un numéro dans les répertoires téléphoniques" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Appels manqués" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Extraction des données depuis Fritz!Box..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Historique des appels" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1 enregistré(s)." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Enregistrer les modifications dans %1 ?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "La re-connexion est effectuée." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "La re-connexion a échoué." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "L'adresse IP actuelle est : %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 n'a pas effectué la résolution." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 résout vers « %2 »." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Général" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Nom d'hôte" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Filtre MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" "Restreindre l'historique des appels et les notifications à certains MSN" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Démarrer en mode réduit" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Répertoire téléphonique Fritz!Box" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "RNIS" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Répertoire téléphonique local" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Journal" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Informe à propos de l'activité du téléphone, parcourt l'historique des " "appels et le répertoire téléphonique sur votre Fritz!Box" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "(c) 2008-2011" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Développé par Matthias Becker et Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" "Journaliser les informations personnelles (ex. mots de passe, numéros de " "téléphone...)" kfritz/po/hu.po0000664000175000017500000002276512067267003011604 0ustar jojo# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Balázs Úr , 2012. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-07-24 13:43+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.4\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Úr Balázs" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "urbalazs@gmail.com" #: DialDialog.cpp:36 msgid "Dial" msgstr "Tárcsázás" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Szám tárcsázása" #: DialDialog.cpp:53 msgid "Default" msgstr "Alapértelmezett" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Szám" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Szolgáltató" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Bejövő hívás" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Kimenő hívás" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Nem fogadott hívás" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "ismeretlen" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Típus" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Dátum" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Név / Szám" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Helyi eszköz" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Időtartam" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Név" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "1. szám" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "2. szám" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "3. szám" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Gyors tárcsázás" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Hiúság" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Fontos partner" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Alapértelmezett szám" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Új bejegyzés" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Otthoni" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Mobil" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Munkahelyi" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Gépnév" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "A Fritz!Box gépneve." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Országkód" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Területkód" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "MSN szűrőlista" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Telefonkönyvek" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Aktív telefonkönyvek listája." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Kimenő hívás hozzá: %1
%2 használatával" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Bejövő hívás tőle: %1
%2 használatával" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "" #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Egyéb" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Egyéb beállítások módosítása" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "A KFritz beállítása…" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Az értesítések beállítása…" #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Napló megjelenítése" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Szám másolása a vágólapra" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Beállítás alapértelmezettként" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Típusának beállítása" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Újratöltés" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Újracsatlakozás az Internethez" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "A jelenlegi IP-cím lekérése" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Hozzáadás" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Törlés" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Szám keresése a telefonkönyvekben" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Nem fogadott hívások" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Adatok letöltése a Fritz!Boxból…" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Hívás elÅ‘zmények" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1 mentve." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Menti a változásokat ide: %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "A jelenlegi IP-cím: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 nem oldható fel." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Ãltalános" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Gépnév" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "MSN szűrÅ‘" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Fritz!Box telefonkönyv" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Helyi telefonkönyv" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Napló" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "© 2008-2011." #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Fejlesztette: Matthias Becker és Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "Személyes információk naplózása (például jelszavak, telefonszámok, …)" kfritz/po/sv.po0000664000175000017500000002532212067267003011610 0ustar jojo# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Last-Translator: Stefan Asserhall , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-11-25 11:00+0100\n" "Last-Translator: Stefan Asserhäll \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.4\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Stefan Asserhäll" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "stefan.asserhall@comhem.se" #: DialDialog.cpp:36 msgid "Dial" msgstr "Ring upp" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Ring nummer" #: DialDialog.cpp:53 msgid "Default" msgstr "Förval" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Fast telefonanslutning" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Uppringning pÃ¥börjad, lyft pÃ¥ luren nu." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Nummer" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Operatör" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Inkommande samtal" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "UtgÃ¥ende samtal" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Missat samtal" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "okänd" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Typ" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Datum" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Namn, nummer" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Lokal enhet" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Varaktighet" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Namn" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Nummer 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Nummer 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Nummer 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Snabbuppringning" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Vanity" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Viktig kontakt" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Förvalt nummer" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Ny post" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Hem" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Mobil" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Arbete" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Värddatornamn" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "Värddatornamn pÃ¥ Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Det här är namnet pÃ¥ din Fritz!Box i nätverket. Troligtvis är det \"fritz.box" "\". Som alternativ kan ocksÃ¥ IP-adressen användas istället för " "värddatornamnet." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Landskod" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "Landskod där din Fritz!Box finns." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Det här är landskoden där din Fritz!Box finns. Normalt läses den automatiskt " "frÃ¥n din Fritz!Box, och behöver alltsÃ¥ inte anges här." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Riktnummer" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "Riktnummer där din Fritz!Box finns." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Det här är riktnumret där din Fritz!Box finns. Normalt läses det automatiskt " "frÃ¥n din Fritz!Box, och behöver alltsÃ¥ inte anges här." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "MSN-filterlista" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Telefonkataloger" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Lista över aktiva telefonkataloger." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "Starta Kfritz minimerat" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Utgående samtal till %1
med %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Inkommande samtal från %1
med %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Samtal uppkopplat." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Samtal avslutat (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Anpassa anslutning till Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Välj telefonkatalog att använda" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Övrigt" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Anpassa övriga inställningar" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Ange ditt Fritz!Box-lösenord " #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Anpassa Kfritz..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Anpassa underrättelser..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Visa logg" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Kopiera nummer till klippbordet" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Använd som förval" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Ange typ" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Uppdatera" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Återanslut till Internet" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Hämta aktuell IP-adress" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Lägg till" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Ta bort" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Slå upp nummer i telefonkataloger" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Missade samtal" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Hämtar data från Fritz!Box..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Samtalshistorik" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1 sparades." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Spara ändringar i %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "Återanslutning påbörjad." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "Återanslutning misslyckades." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "Aktuell IP-adress är: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 gick inte att lösa upp." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 upplöst till \"%2\"." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Allmänt" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Värddatornamn" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "MSN-filter" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Begränsa samtalshistorik och underrättelser till vissa MSN:er" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Starta minimerat" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Fritz!Box telefonkatalog" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Lokal telefonkatalog" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "Fast telefon" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Logga" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "Kfritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Underrättar om telefonaktivitet och bläddrar i samtalshistorik och " "telefonkatalog på en Fritz!Box" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "(c) 2008-2012" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Utvecklat av Matthias Becker och Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "Logga personlig information (t.ex. lösenord, telefonnummer, ...)" #~ msgid "Resolve number" #~ msgstr "Lös upp nummer" #~ msgid "Last missed call known to gui" #~ msgstr "Senast missade samtal känt av det grafiska gränssnittet" #~ msgid "Used internally." #~ msgstr "Används internt." #~ msgid "Show log window" #~ msgstr "Visa loggfönster" #~ msgid "Displays a tab with logging messages" #~ msgstr "Visar en flik med loggmeddelanden" kfritz/po/lt.po0000664000175000017500000002031112067267003011570 0ustar jojo# Lithuanian translations for l package. # Copyright (C) 2011 This_file_is_part_of_KDE # This file is distributed under the same license as the l package. # Automatically generated, 2011. # msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2011-03-07 04:01+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n%10>=2 && (n%100<10 || n" "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #: DialDialog.cpp:36 msgid "Dial" msgstr "" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "" #: DialDialog.cpp:53 msgid "Default" msgstr "" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "" #: KCalllistModel.cpp:84 msgid "Type" msgstr "" #: KCalllistModel.cpp:87 msgid "Date" msgstr "" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "" #: KFonbookModel.cpp:74 msgid "Name" msgstr "" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "" #: KFonbookModel.cpp:245 msgid "Home" msgstr "" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "" #: KFonbookModel.cpp:249 msgid "Work" msgstr "" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "" #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "" #: KFritzWindow.cpp:207 msgid "Other" msgstr "" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "" #: KFritzWindow.cpp:273 msgid "Show log" msgstr "" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "" #: KFritzWindow.cpp:326 msgid "Add" msgstr "" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "" #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "" #: LogDialog.cpp:35 msgid "Log" msgstr "" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "" #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" kfritz/po/uk.po0000664000175000017500000003136312067267003011601 0ustar jojo# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Yuri Chornoivan , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-11-23 07:34+0200\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 1.5\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Юрій Чорноіван" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "yurchor@ukr.net" #: DialDialog.cpp:36 msgid "Dial" msgstr "Ðабір номера" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Ðабір номера" #: DialDialog.cpp:53 msgid "Default" msgstr "Типовий" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Типова телефонна мережа" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Розпочато набір номера, підніміть Ñлухавку." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Ðомер" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Ðадавач поÑлуг" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Вхідний дзвінок" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Вихідний дзвінок" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Пропущений дзвінок" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "невідомо" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Тип" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Дата" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Ім’Ñ/Ðомер" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Локальний приÑтрій" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "ТриваліÑть" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Ім’Ñ" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Ðомер 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Ðомер 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Ðомер 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Швидкий набір" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Марнота" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Важливий контакт" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Типовий номер" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Ðовий запиÑ" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Домашній" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Мобільний" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Робочий" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Ðазва вузла" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "Ðазва вузла Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Це назва вузла Fritz!Box у вашій мережі. Ðайімовірнішою назвою Ñ” \"fritz.box" "\". Крім того, ви можете вказати IP-адреÑу заміÑть назви вузла." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Код країни" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "Код країни, у Ñкій розташовано Fritz!Box." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Це код країни, у Ñкій розташовано ваш Fritz!Box. Зазвичай, ці дані буде " "автоматично отримано від вашого Fritz!Box, — вам не потрібно вказувати Ñ—Ñ… у " "цьому полі." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Код облаÑті" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "Код облаÑті Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Fritz!Box." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Це код облаÑті, у Ñкій розташовано ваш Fritz!Box. Зазвичай, ці дані буде " "автоматично отримано від вашого Fritz!Box, — вам не потрібно вказувати Ñ—Ñ… у " "цьому полі." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "СпиÑок Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ MSN" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Телефонні книги" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "СпиÑок активних телефонних книг." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "ЗапуÑкати KFritz згорнутим до лотка" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Вихідний дзвінок до %1
за допомогою %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Вхідний дзвінок від %1
за допомогою %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Зв’Ñзок вÑтановлено." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Зв’Ñзок розірвано (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Ðалаштуйте Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Виберіть телефонні книги, Ñкими кориÑтуватиметеÑÑ" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Інше" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Ðалаштувати інші параметри" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Вкажіть ваш пароль Fritz!Box" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Ðалаштувати KFritz…" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Ðалаштувати ÑповіщеннÑ…" #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Показати журнал" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Копіювати номер до буфера обміну даними" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Зробити типовим" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Ð’Ñтановити тип" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Перезавантажити" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Повторно вÑтановити інтернет-з’єднаннÑ" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Отримати поточну IP-адреÑу" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Додати" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Вилучити" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Шукати номер у телефонних книгах" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Пропущені дзвінки" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з Fritz!Box…" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Журнал дзвінків" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1 збережено." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Зберегти зміни до %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "Започатковано повторне з’єднаннÑ." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "Спроба повторного Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð°ÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "Поточна IP-адреÑа: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 визначаєтьÑÑ Ñк «%2»." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Загальне" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Ðазва вузла" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Фільтр MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Обмежити журнал дзвінків та ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿ÐµÐ²Ð½Ð¾ÑŽ MSN" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "ЗапуÑкати мінімізованим" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Телефонна книга Fritz!Box" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Локальна телефонна книга" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Журнал" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Сповіщає про телефонні дзвінки та надає змогу переглÑдати журнал дзвінків та " "телефонну книгу вашого Fritz!Box." #: main.cpp:50 msgid "(c) 2008-2012" msgstr "© 2008–2012" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Розроблено Matthias Becker Ñ– Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" "Веде журнал оÑобиÑтих даних (наприклад, паролів, номерів телефонів тощо)" #~ msgid "Last missed call known to gui" #~ msgstr "ОÑтанній пропущений дзвінок, відомий графічному інтерфейÑу" #~ msgid "Used internally." #~ msgstr "Ð”Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ викориÑтаннÑ." #~ msgid "Show log window" #~ msgstr "Показ вікна журналу" #~ msgid "Displays a tab with logging messages" #~ msgstr "Показує вкладку з запиÑаними до журналу повідомленнÑми" #~ msgid "Resolve number" #~ msgstr "Визначити дані номера" kfritz/po/ja.po0000664000175000017500000002003312067267003011544 0ustar jojomsgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2011-02-23 01:29-0800\n" "Last-Translator: Japanese KDE translation team \n" "Language-Team: Japanese \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Accelerator-Marker: &\n" "X-Text-Markup: kde4\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #: DialDialog.cpp:36 msgid "Dial" msgstr "" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "" #: DialDialog.cpp:53 msgid "Default" msgstr "" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "" #: KCalllistModel.cpp:84 msgid "Type" msgstr "" #: KCalllistModel.cpp:87 msgid "Date" msgstr "" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "" #: KFonbookModel.cpp:74 msgid "Name" msgstr "" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "" #: KFonbookModel.cpp:245 msgid "Home" msgstr "" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "" #: KFonbookModel.cpp:249 msgid "Work" msgstr "" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "" #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "" #: KFritzWindow.cpp:207 msgid "Other" msgstr "" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "" #: KFritzWindow.cpp:273 msgid "Show log" msgstr "" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "" #: KFritzWindow.cpp:326 msgid "Add" msgstr "" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "" #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "" #: LogDialog.cpp:35 msgid "Log" msgstr "" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "" #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" kfritz/po/it.po0000664000175000017500000002424712067267003011601 0ustar jojo# Copyright (C) 2010 # This file is distributed under the same license as the KFritz package. # # Richard Bos , 2010. # Fabio Pirrello , 2010 msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2010-12-15 14:33+0100\n" "Last-Translator: Fabio Pirrello \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #: DialDialog.cpp:36 msgid "Dial" msgstr "" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Chiama" #: DialDialog.cpp:53 #, fuzzy msgid "Default" msgstr "Chiama" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Numero" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Chiamata in entrata" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Chiamata in uscita" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Chiamata persa" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "sconosciuto" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Tipo" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Data" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Nome / Numero" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Dispositivo Locale" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Durata" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Nome" #: KFonbookModel.cpp:76 #, fuzzy #| msgid "Number" msgid "Number 1" msgstr "Numero" #: KFonbookModel.cpp:78 #, fuzzy #| msgid "Number" msgid "Number 2" msgstr "Numero" #: KFonbookModel.cpp:80 #, fuzzy #| msgid "Number" msgid "Number 3" msgstr "Numero" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "" #: KFonbookModel.cpp:125 #, fuzzy msgid "Default number" msgstr "Chiama" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Casa" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Mobile" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Studio" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 #, fuzzy #| msgid "Hostname" msgid "Host name" msgstr "Nome host" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Codice paese" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Prefisso" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 #, fuzzy #| msgid "MSN filter" msgid "MSN filter list" msgstr "Filtro MSN" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Rubrica" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 #, fuzzy #| msgid "Local phone book" msgid "List of active phone books." msgstr "Rubrica locale" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Chiamata in uscita per %1
met %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Chiamata in entrata da %1
met %2" #: KFritzWindow.cpp:165 #, fuzzy msgid "Call connected." msgstr "Comunicazione terminata (%1)." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Comunicazione terminata (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Configura la connessione al Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Seleziona la rubrica da usare" #: KFritzWindow.cpp:207 msgid "Other" msgstr "" #: KFritzWindow.cpp:207 #, fuzzy msgid "Configure other settings" msgstr "Configura Notifiche..." #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Inserire la password per Fritz!Box" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Configura KFritz..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Configura Notifiche..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Mostra il log" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "" #: KFritzWindow.cpp:326 msgid "Add" msgstr "" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Chiamate perse" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Recupero informazioni da Fritz!Box..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Storico chiamate" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 #, fuzzy msgid "Reconnect failed." msgstr "Comunicazione terminata (%1)." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "" #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Generale" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Nome host" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Filtro MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Restringi lo storico chiamate solo ad alcuni MSN" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Rubrica Fritz!Box" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Rubrica locale" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "RTG" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "" #: LogDialog.cpp:35 msgid "Log" msgstr "Log" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Mostra l'attivita' sulle linee telefoniche e consulta lo storico delle " "chiamate e la rubrica del Fritz!Box" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "(c) 2008-2011" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Sviluppato da Matthias Becker e Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" #, fuzzy #~| msgid "Show log" #~ msgid "Show log window" #~ msgstr "Mostra il log" #, fuzzy #~ msgid "Resolve number" #~ msgstr "Chiama" #~ msgid "Form" #~ msgstr "Form" #, fuzzy #~ msgid "Add phone book entry" #~ msgstr "Seleziona la rubrica da usare" #~ msgid "" #~ "Can not dial without a number.\n" #~ "Please select an entry in a phone book or the call history which contains " #~ "a number or name and try again." #~ msgstr "" #~ "Impossibile chiamare senza un numero.\n" #~ "Selezionare una voce dalla rubrica o dallo storico chiamate che contena " #~ "un numero e riprovare." #, fuzzy #~ msgid "Delete phone book entry" #~ msgstr "Seleziona la rubrica da usare" #~ msgid "Dialing not possible" #~ msgstr "Impossibile chiamare" #~ msgid "Done" #~ msgstr "Gedaan" #, fuzzy #~ msgid "Done." #~ msgstr "Gedaan" kfritz/po/pt_BR.po0000664000175000017500000002546412067267003012175 0ustar jojo# Copyright (C) 2011-2012 This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # Translation of kfritz.po to Brazilian Portuguese # # André Marcelo Alvarenga , 2011, 2012. # Marcus Gama , 2011. msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-11-23 23:10-0200\n" "Last-Translator: André Marcelo Alvarenga \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "André Marcelo Alvarenga" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "alvarenga@kde.org" #: DialDialog.cpp:36 msgid "Dial" msgstr "Discar" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Número a ser discado" #: DialDialog.cpp:53 msgid "Default" msgstr "Padrão" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Rede telefônica convencional" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "A discagem foi iniciada, escolha o seu número." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Número" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Provedor" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Chamada recebida" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Chamada enviada" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Chamadas não atendidas" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "desconhecida" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Tipo" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Data" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Nome/Número" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Dispositivo local" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Duração" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Nome" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Número 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Número 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Número 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Discagem rápida" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Vaidade" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Contato importante" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Número padrão" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nova entrada" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Residência" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Celular" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Comercial" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Nome de máquina" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "O nome da máquina Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Este é o nome da máquina Fritz!Box na sua rede. Provavelmente, será igual a " "\"fritz.box\". Alternativamente, você poderá também usar o endereço IP, em " "vez do nome da máquina." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Código do país" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "O código do país onde se localiza a Fritz!Box." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "O código do país onde se localiza a sua Fritz!Box. Normalmente, ele é lido " "automaticamente da sua Fritz!Box e, por isso, talvez você não tenha que " "definir nada aqui." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Código de área" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "O código da área onde se localiza a Fritz!Box." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Este é o código de área onde se localiza a sua Fritz!Box. Normalmente, ele é " "lido automaticamente da sua Fritz!Box e, por isso, talvez você não tenha que " "definir nada aqui." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "Lista de filtros do MSN" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Listas telefônicas" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Relação das listas telefônicas ativas." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "Iniciar o KFritz minimizado" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Chamada efetuada para %1
usando o %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Chamada recebida de %1
usando o %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Chamada estabelecida." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Chamada desligada (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Configurar a conexão à Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Selecione as listas telefônicas a serem usadas" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Outra" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Configurar outras opções" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Digite a sua senha do Fritz!Box" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Configurar o KFritz..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Configurar notificações..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Mostrar o registro" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Copiar o número para a área de transferência" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Definir como padrão" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Definir tipo" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Recarregar" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Reconectar à Internet" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Obter o endereço IP atual" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Adicionar" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Excluir" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Procurar o número nas listas telefônicas" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Chamadas não atendidas" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Recuperando dados da Fritz!Box..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Histórico de chamadas" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "%1 salvo." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Salvar alterações para o %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "A reconexão foi iniciada." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "A reconexão falhou." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "O endereço IP atual é: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "Não foi possível resolver o número %1." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "O número %1 corresponde a \"%2\"." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Geral" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Nome da máquina" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Filtro do MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Restringir o histórico de chamadas e notificações a certos MSNs" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Iniciar minimizado" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Lista telefônica do Fritz!Box" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Lista telefônica local" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Registro" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Notifica-o sobre a atividade do telefone e navega pelo histórico de chamadas " "e pelas listas telefônicas da sua Fritz!Box" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "(c) 2008-2012" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Desenvolvido por Matthias Becker e Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" "Registrar as informações pessoais (p.ex., senhas, números de telefone, ...)" kfritz/po/es.po0000664000175000017500000002273012067267003011567 0ustar jojo# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Eloy Cuadra , 2011. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2011-12-27 14:51+0100\n" "Last-Translator: Eloy Cuadra \n" "Language-Team: Spanish \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.2\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Eloy Cuadra" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "ecuadra@eloihr.net" #: DialDialog.cpp:36 msgid "Dial" msgstr "Marcar" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Marcar número" #: DialDialog.cpp:53 msgid "Default" msgstr "Por omisión" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Red telefónica convencional" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Número" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Proveedor" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Llamada entrante" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Llamada saliente" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Llamada perdida" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Tipo" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Fecha" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Nombre / número" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Dispositivo local" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Duración" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Nombre" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Número 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Número 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Número 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Contacto importante" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Número por omisión" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nueva entrada" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Casa" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Móvil" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Trabajo" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Nombre del servidor" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "El nombre del servidor de Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Código de país" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "El código de país en el que está ubicado Fritz!Box." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Código de área" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "El código de área en la que está ubicado Fritz!Box." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "Lista de filtros MSN" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "Iniciar KFritz minimizado" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Llamada saliente para %1
usando %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Llamada entrante de %1
usando %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Llamada conectada." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Llamada desconectada (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Configurar conexión con Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Otros" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Configurar otras preferencias" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Introduzca su contraseña para Fritz!Box" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Configurar KFritz..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Configurar notificaciones..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Mostrar registro" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Copiar número en el portapapeles" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Fijar por omisión" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Volver a cargar" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Obtener dirección IP actual" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Añadir" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Borrar" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Llamadas perdidas" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "Obteniendo datos de Fritz!Box..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Historial de llamadas" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "¿Guardar cambios en %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "La dirección IP actual es: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 no se puede resolver." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 se resuelve como «%2»." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "General" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Nombre del servidor" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Filtro MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Iniciar minimizado" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "ISDN" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Registro" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "© 2008-2011" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Desarrollado por Matthias Becker y Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" kfritz/po/fi.po0000664000175000017500000002015512067267003011555 0ustar jojo# KDE 4.9 Finnish translation sprint 2012-06/07 msgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-07-04 13:39:25+0000\n" "Last-Translator: Ei tietoa\n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-POT-Import-Date: 2012-06-15 09:03:32+0000\n" "X-Generator: MediaWiki 1.20alpha (r113129); Translate 2012-07-04\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #: DialDialog.cpp:36 msgid "Dial" msgstr "" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "" #: DialDialog.cpp:53 msgid "Default" msgstr "" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "" #: KCalllistModel.cpp:84 msgid "Type" msgstr "" #: KCalllistModel.cpp:87 msgid "Date" msgstr "" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "" #: KFonbookModel.cpp:74 msgid "Name" msgstr "" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "" #: KFonbookModel.cpp:245 msgid "Home" msgstr "" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "" #: KFonbookModel.cpp:249 msgid "Work" msgstr "" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "" #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "" #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "" #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "" #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "" #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "" #: KFritzWindow.cpp:207 msgid "Other" msgstr "" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "" #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "" #: KFritzWindow.cpp:273 msgid "Show log" msgstr "" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "" #: KFritzWindow.cpp:326 msgid "Add" msgstr "" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "" #: KFritzWindow.cpp:450 msgid "Call history" msgstr "" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "" #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "" #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "" #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "" #: LogDialog.cpp:35 msgid "Log" msgstr "" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "" #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" kfritz/po/gl.po0000664000175000017500000002526312067267003011566 0ustar jojo# Copyright (C) YEAR This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # # Xosé , 2012. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-03-12 21:25+0100\n" "Last-Translator: Xosé \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 1.4\n" "X-Environment: kde\n" "X-Accelerator-Marker: &\n" "X-Text-Markup: kde4\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Xosé" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "xosecalvo@gmail.com" #: DialDialog.cpp:36 msgid "Dial" msgstr "Marcar" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Marcar o número" #: DialDialog.cpp:53 msgid "Default" msgstr "Predeterminado" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Rede telefónica convencional" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "Comezou a marcar, colla o teléfono agora." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Número" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Fornecedor" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Chamada entrante" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Chamada saínte" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Chamada perdida" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "descoñecido" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Tipo" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Data" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Nome / Número" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Dispositivo local" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Duración" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Nome" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Número 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Número 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Número 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Chamada rápida" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Vaidade" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Contacto importante" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Número por omisión" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Nova entrada" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Fogar" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Móbil" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Traballo" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Nome do servidor" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "O nome do servidor de Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Este é o nome do servidor do Fritz!Box da súa rede. O máis probábel é que " "sexa «fritz.box». Como alternativa pode tamén empregar o enderezo IP no " "canto do nome do servidor." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Código do país" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "O código do país no que está situado o Fritz!Box." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Este é o código do país no que está situado o Fritz!Box. Isto normalmente " "lese automaticamente do Fritz!Box, así que non o hai que especificar aquí." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Prefixo" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "O prefixo do lugar no que está situado o Fritz!Box." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Este é o prefixo do lugar no que está situado o Fritz!Box. Isto normalmente " "lese automaticamente do Fritz!Box, así que non o hai que especificar aquí." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "Listra de filtros de MSN" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Cadernos de enderezos" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Listaxe dos cadernos de enderezos activos." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "Iniciar o KFritz minimizado" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Chamada saínte para %1
empregando %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Chamada entrante de %1
empregando %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "Ligouse a chamada." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Desligouse a chamada (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Configurar a conexión a Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Escolla os cadernos de enderezos que desexe utilizar" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Outras" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Configurar outras opcións" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Introduza o contrasinal da súa Fritz!Box" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Configurar o Fritz!Box..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Configurar as notificacións..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Mostrar o rexistro" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Copiar o número ao portarretallos" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Pór como predeterminado" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Configurar o tipo" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Cargar de novo" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Conectar de novo á Internet" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Obter o enderezo IP actual" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Engadir" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Eliminar" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Consultar o número nos cadernos de enderezos" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Chamadas perdidas" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "A obter os datos da Fritz!Box...." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Historial de chamadas" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "" #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Gardar as modificacións en %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "Iniciouse a reconexión." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "Fallou a reconexión." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "O enderezo IP actual é: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "%1 non resolveu." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "%1 resólvese como «%2»." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Xeral" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Nome da máquina" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Filtro do MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "" "Restrinxir o historial de chamadas e as notificacións a determinados MSN" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Iniciar minimizado" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Caderno de enderezos de Fritz!Box" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "RDSI" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Caderno de enderezos local" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Rexistro" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Notifica sobre a actividade do teléfono e examina o historial de chamadas e " "o caderno telefónico da súa Fritz!Box" #: main.cpp:50 #, fuzzy #| msgid "(c) 2008-2011" msgid "(c) 2008-2012" msgstr "(c) 2008-2011" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Desenvolvido por Matthias Becker e Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" "Rexistrar a información persoal (p.ex. contrasinais, números de teléfono,...)" kfritz/po/pt.po0000664000175000017500000002517212067267003011606 0ustar jojomsgid "" msgstr "" "Project-Id-Version: kfritz\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2012-11-23 02:59+0100\n" "PO-Revision-Date: 2012-11-23 10:17+0000\n" "Last-Translator: José Nuno Coelho Pires \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-POFile-SpellExtra: Box box Matthias POTS Joachim MSN fritz nummerzoeker\n" "X-POFile-SpellExtra: Wilke Becker KFritz oertliche\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "José Nuno Pires" msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "zepires@gmail.com" #: DialDialog.cpp:36 msgid "Dial" msgstr "Ligar" #: DialDialog.cpp:39 KFritzWindow.cpp:279 msgid "Dial number" msgstr "Número a marcar" #: DialDialog.cpp:53 msgid "Default" msgstr "Predefinição" #: DialDialog.cpp:55 msgid "Conventional telephone network" msgstr "Rede telefónica convencional" #: DialDialog.cpp:80 msgid "Dialing initiated, pick up your phone now." msgstr "A marcação foi iniciada; escolha o seu número." #. i18n: ectx: property (text), widget (QLabel, label) #: DialDialog.ui:19 msgid "Number" msgstr "Número" #. i18n: ectx: property (text), widget (QLabel, label_2) #: DialDialog.ui:33 msgid "Provider" msgstr "Fornecedor" #: KCalllistModel.cpp:43 msgid "Incoming call" msgstr "Chamada recebida" #: KCalllistModel.cpp:44 msgid "Outgoing call" msgstr "Chamada emitida" #: KCalllistModel.cpp:45 msgid "Missed call" msgstr "Chamada perdida" #: KCalllistModel.cpp:57 KFritzWindow.cpp:156 KFritzWindow.cpp:614 msgid "unknown" msgstr "desconhecida" #: KCalllistModel.cpp:84 msgid "Type" msgstr "Tipo" #: KCalllistModel.cpp:87 msgid "Date" msgstr "Data" #: KCalllistModel.cpp:90 msgid "Name / Number" msgstr "Nome / Número" #: KCalllistModel.cpp:93 msgid "Local Device" msgstr "Dispositivo Local" #: KCalllistModel.cpp:96 msgid "Duration" msgstr "Duração" #: KFonbookModel.cpp:74 msgid "Name" msgstr "Nome" #: KFonbookModel.cpp:76 msgid "Number 1" msgstr "Número 1" #: KFonbookModel.cpp:78 msgid "Number 2" msgstr "Número 2" #: KFonbookModel.cpp:80 msgid "Number 3" msgstr "Número 3" #: KFonbookModel.cpp:82 msgid "Quickdial" msgstr "Marcação Rápida" #: KFonbookModel.cpp:84 msgid "Vanity" msgstr "Vaidade" #: KFonbookModel.cpp:107 msgid "Important contact" msgstr "Contacto importante" #: KFonbookModel.cpp:125 msgid "Default number" msgstr "Número predefinido" #: KFonbookModel.cpp:209 msgid "New Entry" msgstr "Novo Item" #: KFonbookModel.cpp:245 msgid "Home" msgstr "Residência" #: KFonbookModel.cpp:247 msgid "Mobile" msgstr "Telemóvel" #: KFonbookModel.cpp:249 msgid "Work" msgstr "Trabalho" #. i18n: ectx: label, entry (Hostname), group (FritzBox) #: kfritz.kcfg:8 msgid "Host name" msgstr "Nome da máquina" #. i18n: ectx: tooltip, entry (Hostname), group (FritzBox) #: kfritz.kcfg:9 msgid "The host name of the Fritz!Box." msgstr "O nome da máquina Fritz!Box." #. i18n: ectx: whatsthis, entry (Hostname), group (FritzBox) #: kfritz.kcfg:10 msgid "" "This is the host name of the Fritz!Box in your network. Most probably this " "is \"fritz.box\". As an alternative you can also use the IP address instead " "of the host name." msgstr "" "Este é o nome da máquina Fritz!Box na sua rede. Provavelmente será igual a " "\"fritz.box\". Como alternativa, poderá também usar o endereço IP em vez do " "nome da máquina." #. i18n: ectx: property (text), widget (QLabel, label_2) #. i18n: ectx: label, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:14 KSettingsFritzBox.ui:40 msgid "Country code" msgstr "Código do país" #. i18n: ectx: tooltip, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:15 msgid "The country code the Fritz!Box is located in." msgstr "O código do país onde se localiza a Fritz!Box." #. i18n: ectx: whatsthis, entry (CountryCode), group (FritzBox) #: kfritz.kcfg:16 msgid "" "This is the country code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "O código do país onde se localiza a sua Fritz!Box. Normalmente, este é lido " "automaticamente da sua Fritz!Box, pelo que poderá não ter de o definir aqui." #. i18n: ectx: property (text), widget (QLabel, label_3) #. i18n: ectx: label, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:20 KSettingsFritzBox.ui:50 msgid "Area code" msgstr "Código da área" #. i18n: ectx: tooltip, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:21 msgid "The area code the Fritz!Box is located in." msgstr "O código da área onde se localiza a Fritz!Box." #. i18n: ectx: whatsthis, entry (AreaCode), group (FritzBox) #: kfritz.kcfg:22 msgid "" "This is the area code your Fritz!Box is located in. Normally this is read " "automatically from your Fritz!Box so you do not need to specify it here." msgstr "" "Este é o código da área onde se localiza a sua Fritz!Box. Normalmente, este " "é lido automaticamente da sua Fritz!Box, pelo que poderá não ter de o " "definir aqui." #. i18n: ectx: label, entry (MSNFilter), group (FritzBox) #: kfritz.kcfg:25 msgid "MSN filter list" msgstr "Lista de filtros do MSN" #. i18n: ectx: label, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:32 KFritzWindow.cpp:204 msgid "Phone books" msgstr "Listas telefónicas" #. i18n: ectx: tooltip, entry (PhonebookList), group (Phonebooks) #: kfritz.kcfg:33 msgid "List of active phone books." msgstr "Lista das listas telefónicas activas." #. i18n: ectx: label, entry (StartMinimized), group (GUI) #: kfritz.kcfg:41 msgid "Start KFritz minimized" msgstr "Iniciar o KFritz minimizado" #: KFritzWindow.cpp:154 #, kde-format msgid "Outgoing call to %1
using %2" msgstr "Chamada efectuada para %1
a usar o %2" #: KFritzWindow.cpp:156 #, kde-format msgid "Incoming call from %1
using %2" msgstr "Chamada recebida de %1
a usar o %2" #: KFritzWindow.cpp:165 msgid "Call connected." msgstr "A chamada foi estabelecida." #: KFritzWindow.cpp:177 #, kde-format msgid "Call disconnected (%1)." msgstr "Chamada desligada (%1)." #: KFritzWindow.cpp:201 msgid "Fritz!Box" msgstr "Fritz!Box" #: KFritzWindow.cpp:201 msgid "Configure connection to Fritz!Box" msgstr "Configurar a ligação à Fritz!Box" #: KFritzWindow.cpp:204 msgid "Select phone books to use" msgstr "Seleccione as listas telefónicas a usar" #: KFritzWindow.cpp:207 msgid "Other" msgstr "Outras" #: KFritzWindow.cpp:207 msgid "Configure other settings" msgstr "Configurar as outras opções" #: KFritzWindow.cpp:253 msgid "Enter your Fritz!Box password" msgstr "Indique a sua senha do Fritz!Box" #: KFritzWindow.cpp:261 msgid "Configure KFritz..." msgstr "Configurar o KFritz..." #: KFritzWindow.cpp:267 msgid "Configure Notifications..." msgstr "Configurar as Notificações..." #: KFritzWindow.cpp:273 msgid "Show log" msgstr "Mostrar o registo" #: KFritzWindow.cpp:285 msgid "Copy number to clipboard" msgstr "Copiar o número para a área de transferência" #: KFritzWindow.cpp:291 msgid "Set as default" msgstr "Configurar como predefinido" #: KFritzWindow.cpp:297 msgid "Set type" msgstr "Definir o tipo" #: KFritzWindow.cpp:308 msgid "Reload" msgstr "Actualizar" #: KFritzWindow.cpp:314 msgid "Reconnect to the Internet" msgstr "Ligar de novo à Internet" #: KFritzWindow.cpp:320 msgid "Get current IP address" msgstr "Obter o endereço IP actual" #: KFritzWindow.cpp:326 msgid "Add" msgstr "Adicionar" #: KFritzWindow.cpp:333 msgid "Delete" msgstr "Apagar" #: KFritzWindow.cpp:340 msgid "Look up number in phone books" msgstr "Procurar o número nas listas telefónicas" #: KFritzWindow.cpp:371 msgid "Missed calls" msgstr "Chamadas perdidas" #: KFritzWindow.cpp:401 msgid "Retrieving data from Fritz!Box..." msgstr "A obter os dados da Fritz!Box..." #: KFritzWindow.cpp:450 msgid "Call history" msgstr "Histórico de chamadas" #: KFritzWindow.cpp:506 #, kde-format msgid "%1 saved." msgstr "O %1 foi gravado." #: KFritzWindow.cpp:519 #, kde-format msgid "Save changes to %1?" msgstr "Deseja gravar as alterações em %1?" #: KFritzWindow.cpp:604 msgid "Reconnect initiated." msgstr "A repetição da ligação foi iniciada." #: KFritzWindow.cpp:606 msgid "Reconnect failed." msgstr "A repetição da ligação foi mal-sucedida." #: KFritzWindow.cpp:614 #, kde-format msgid "Current IP address is: %1" msgstr "O endereço IP actual é: %1" #: KFritzWindow.cpp:688 #, kde-format msgid "%1 did not resolve." msgstr "Não foi possível resolver o número %1." #: KFritzWindow.cpp:696 #, kde-format msgid "%1 resolves to \"%2\"." msgstr "O número %1 corresponde a \"%2\"." #. i18n: ectx: attribute (title), widget (QWidget, tab) #: KSettingsFritzBox.ui:21 msgid "General" msgstr "Geral" #. i18n: ectx: property (text), widget (QLabel, label) #: KSettingsFritzBox.ui:30 msgid "Hostname" msgstr "Máquina" #. i18n: ectx: attribute (title), widget (QWidget, tab_2) #: KSettingsFritzBox.ui:61 msgid "MSN filter" msgstr "Filtro do MSN" #. i18n: ectx: property (text), widget (QLabel, label_4) #: KSettingsFritzBox.ui:67 msgid "Restrict call history and notifications to certain MSNs" msgstr "Restringir o histórico de chamadas e notificações a certos MSN's" #. i18n: ectx: property (text), widget (QCheckBox, kcfg_StartMinimized) #: KSettingsMisc.ui:17 msgid "Start minimized" msgstr "Iniciar minimizado" #: LibFritzI18N.cpp:24 msgid "das-oertliche.de" msgstr "das-oertliche.de" #: LibFritzI18N.cpp:25 msgid "Fritz!Box phone book" msgstr "Lista telefónica do Fritz!Box" #: LibFritzI18N.cpp:26 msgid "ISDN" msgstr "RDIS" #: LibFritzI18N.cpp:27 msgid "Local phone book" msgstr "Lista telefónica local" #: LibFritzI18N.cpp:28 msgid "nummerzoeker.com" msgstr "nummerzoeker.com" #: LibFritzI18N.cpp:29 msgid "POTS" msgstr "POTS" #: LibFritzI18N.cpp:30 msgid "tel.local.ch" msgstr "tel.local.ch" #: LogDialog.cpp:35 msgid "Log" msgstr "Registo" #: main.cpp:42 test/FritzEventHandler.cpp:29 test/KSettingsFritzBox.cpp:31 msgid "KFritz" msgstr "KFritz" #: main.cpp:46 msgid "" "Notifies about phone activity and browses call history and telephone book on " "your Fritz!Box" msgstr "" "Notifica-o sobre a actividade do telefone e navega pelo histórico de " "chamadas e pelas listas telefónicas da sua Fritz!Box" #: main.cpp:50 msgid "(c) 2008-2012" msgstr "(c) 2008-2012" #: main.cpp:53 msgid "Developed by Matthias Becker and Joachim Wilke." msgstr "Desenvolvido por Matthias Becker e Joachim Wilke." #: main.cpp:63 test/FritzEventHandler.cpp:35 test/KSettingsFritzBox.cpp:37 msgid "Log personal information (e.g. passwords, phone numbers, ...)" msgstr "" "Registar a informação pessoal (p.ex., senhas, números de telefone, ...)" kfritz/.krazy0000664000175000017500000000004612065570711011340 0ustar jojoSKIP /build SKIP /libfritz\+\+/cc\+\+ kfritz/MimeFonbookEntry.cpp0000664000175000017500000000312012065570711014126 0ustar jojo/* * KFritz * * Copyright (C) 2011 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "MimeFonbookEntry.h" MimeFonbookEntry::MimeFonbookEntry(const fritz::FonbookEntry &fonbookEntry) { this->fonbookEntry = new fritz::FonbookEntry(fonbookEntry); } MimeFonbookEntry::~MimeFonbookEntry() { delete fonbookEntry; } QVariant MimeFonbookEntry::retrieveData(__attribute__((unused)) const QString &mimetype, __attribute__((unused)) QVariant::Type preferredType) const { return QVariant(); } bool MimeFonbookEntry::hasFormat(const QString &mimetype) const { if (mimetype.compare("application/x-kfritz-fonbookentry") == 0) { return true; } else { return false; } } QStringList MimeFonbookEntry::formats() const { QStringList list("application/x-kfritz-fonbookentry"); return list; } fritz::FonbookEntry *MimeFonbookEntry::retrieveFonbookEntry() const { return fonbookEntry; } kfritz/DialDialog.cpp0000664000175000017500000000517212067033012012667 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "DialDialog.h" #include #include #include #include #include #include "Log.h" DialDialog::DialDialog(QWidget *parent, std::string number) :KDialog(parent) { setButtons(Ok | Cancel); setButtonText(Ok, i18n("Dial")); connect(this, SIGNAL(okClicked()), this, SLOT(dialNumber())); resize(300,100); setCaption(i18n("Dial number")); QWidget *widget = new QWidget(); ui = new Ui::DialDialog(); ui->setupUi(widget); setMainWidget(widget); ui->numberLine->setText(number.c_str()); QRegExp rx("[0-9\\*#]+"); QRegExpValidator *validator = new QRegExpValidator(rx, this); ui->numberLine->setValidator(validator); ui->numberLine->setFocus(); // populate msn combo box std::vector names = fritz::gConfig->getSipNames(); std::vector msns = fritz::gConfig->getSipMsns(); ui->msnComboBox->addItem(i18n("Default"), ""); QString line("*111# - "); line.append(i18n("Conventional telephone network")); ui->msnComboBox->addItem(line, "*111#"); for (size_t i=0; imsnComboBox->addItem(line.str().c_str(), prefix.str().c_str()); } } DialDialog::~DialDialog() { delete ui; } void DialDialog::dialNumber() { DBG("Dialing number = " << ui->numberLine->text().toStdString()); std::string number = ui->numberLine->text().toStdString(); std::string prefix = ui->msnComboBox->itemData(ui->msnComboBox->currentIndex()).toString().toStdString(); number.insert(0, prefix); fritz::FritzClient *fc = fritz::gConfig->fritzClientFactory->create(); fc->InitCall(number); delete fc; hide(); KMessageBox::information(this, i18n("Dialing initiated, pick up your phone now.")); } kfritz/TODO0000664000175000017500000000115512065570711010671 0ustar jojoThese are collected feature requests and todos in no certain order: * Support multiple FBs (via profiles or similar) * Add "find" action * Copy phone books * Show status information of FB in own tab (suggested by Sir_Aim ) * Configure Port forwarding (suggested by Sir_Aim ) * Configure DynDNS (suggested by Sir_Aim ) * Handle empty FB password (reported by Richard Bos) * Check categories in kfritz.desktop (reported by Richard Bos) * Use default number for actions when no specific number is selected in a phone book or call list (suggested by Richard Bos) kfritz/KFritz.h0000664000175000017500000000232512067033023011553 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KFRITZBOX_H #define KFRITZBOX_H #include #include #include #include #include "KFritzWindow.h" class KFritz : public KSystemTrayIcon { Q_OBJECT public: KFritz(KFritzWindow *mainWindow, KAboutData *aboutData); virtual ~KFritz(); bool parentWidgetTrayClose() const; private: KAboutData *aboutData; KFritzWindow *mainWindow; }; #endif /*KFRITZBOX_H_*/ kfritz/kfritzui.rc0000664000175000017500000000336112065570711012377 0ustar jojo kfritz/kfritz (dev-install).launch0000664000175000017500000000403112065570711015226 0ustar jojo kfritz/icons/0000775000175000017500000000000012065570711011312 5ustar jojokfritz/icons/export_pngs.sh0000764000175000017500000000061112065570711014215 0ustar jojo#!/bin/bash sizes="128 64 48 32 22 16" # input: hi--.svgz # output: hi--.png for icon in *.svgz; do for size in $sizes; do png=ox$size-`basename $icon .svgz | sed -e 's/^oxsc-//'`.png inkscape --without-gui --export-png="$png" --export-dpi=72 --export-background-opacity=0 --export-width=$size --export-height=$size $icon > /dev/null done done kfritz/icons/ox16-status-missed-call.png0000664000175000017500000000145212065570711016333 0ustar jojo‰PNG  IHDRóÿasBIT|dˆ pHYs;Ù=tEXtSoftwarewww.inkscape.org›î<§IDAT8’[HTa…׿ÄA#Ër’Á;d’ˆ¥‰ ˆ¥„‘R(]ÔðA£ ^Š †Qty- Ê"»údÈT£5Ö†÷ñ6ŒŽ6—fÎÌ™sþ¿‡R45\°Ÿû[ìÍ"Œ1,G‘¹õëíKz$rêMß-RmÄü¼ãúî d9€“×Úoú))µ„©Ü> ðy<°õ—ÿUõ#0г½þÖgKs05Âc£æù–þ^ ·ÔrIƒ9:1neÞdM3[œN÷O{÷Œ/ºœÌïß- 8ñx|oô:ÉðyX;í;¦Äö4æ!‰âmÛèð=ëàÀSm^þ‚Šë† ¢µšûÍ­ÝÜÈÀè{0š9ÔtÐWOH`!cü³0|ìiÌŽíñ¦¦—FµÄ †’ÖÓ%ZÇÈÅ ÆÒ€`/0æžðÀÙ"J]ó‘¹õêÜìľ7mÝZ‡Ÿë¬xQ\_}„( ª9‰ý„X=@ÒQJGg°+3¡¹ãÓ VT©¿ætÜÊ×I®;:QxdΈg,L€€¢ª—&&]™ï&—³qðmV8cÁ!yyàCC<Ùc4"Ô`Ȩã¸($<Œ8\ýÑŸPØÄR*Z0ÆPCÈÝ/»ºØbš¬¬dm«!ä—’º¡fŠjxÝæh֬ݙzFŸ£6e©‚ü•òg¦øAš­²Wð‚°JöùθlN $'ܪ0Y†Y:ùq‡ €ÇA‘5ž ¢‘¤m‹¤O˜&ä|¥vn¬o¤Ñi›Uˆ®_%I_J)óûM„´OP^fBh/!7dàêl¶”µ”»íŽ+*ApªÕº®ÚTy&­†ã²®bÀ¨¯ŽSjœñöaYÁ^¼2IEND®B`‚kfritz/icons/oxsc-status-outgoing-call.svgz0000664000175000017500000001667112065570711017277 0ustar jojo‹í]ÛrãF’}Þþ ¬üâŽ% º_äVoìØë‰‰˜‰˜Kì¾9Ø$¤æ %*H¶ûòõ{Nð"PMÉkïÈ1Ób(TežÌ<™U(½ù÷Owóìçr¹š-î¯/d!.²ò~²˜Îîo¯/þö×óp‘­Öãûéx¾¸/¯/îÿþöÕ›Íóìûe9^—Óìãlý>ûÃý?V“ñC™}û~½~¸º¼üøñc1Û4‹åíåë,Ïß¾zõfõóí«,ËðÜûÕÕtr}±¹ááÃrž.œN.ËyyWÞ¯W—²—ÛË'ÛË'|úìçr²¸»[ܯÒ÷«oZ/§7ÍÕÍG.’1ÆK¡.•ÊqE¾ú|¿Ê»·bŒûnUBˆK|·½rØUWŸæÅÁÁ¤oÛO‡øð¿æ†º¡X->,'å î,‹ûr}ùÃ_h¾ÌE1]O[ÝÔÒï<·£’ûñ]¹zOÊÕeÝžîïà gÓõûë %Tá¥w>5¾/g·ï×lE¬î•·øt}!2‘Éè -¼3™4¶Âøê¢ÙôúâãÏåò'Yø* äúâaY®ÊåÏÕ@êQ]5#…ñ¸ÄdK¥ŒqéªZWÓÅ„Sº¾X|ZMrÀvýa•Ïç;À9ŸŒçózùrñöÍ]¹OÇëq=˜ú³vßWþáÇ·o&“«ÿ^,ÿÁ«øÃöñ»ÅLWM'WÐÄÝxývv7¾-©òÃDÞ\n¿à5ëÏeÝAÕf˜ô¸úÓÉÝŒ·\þe=›ÏÿÀž/²Ëª§Ùz^¾Mý׿nˆßš1_Ösyû¦ ¥2¥f8t9YÌËë‹onÒO’â»ÅrZ.ë/\úi}±€z00`"5.Þý½œ¬×‹y¹ßs*²BÊíPÙmý0›–»Íz9¤æ{¾[½OµîWg÷hÎ7è”*ˆ½ß×@õF5èk$¢mÉÕûÅGþúâf<_õà÷e±¸£5£½í~5ÔseŠè¬“½ñM0k ¥¢ nïÐx³Ùû nÍõÞoîÆŸfw³/å´ÖÅöy–K¸Í|NÓÚZX‚Oy³ªçÎßÑ€ðVȰ¯(µÂjbñú¢{¡®ÜLÛ>~J&•ÁÖ¯2¹çûÏÕ÷Þÿˆ=W|I:<ØÇæÑùb9»Á¤«Œ*R}û̱5!ítÁáÉöoA?öpQX΢ЛŸ“æ”ÒuöÉRÙȵÛÅcêá|UÊñò÷ËñtPlgú?úã~øIý´éêvsÁßîgkijð¾¡+þ¯û¿mÌþYÂöÂæÃg|°¾°õwªý¢ýÂó¬µÓ[ÜܬÊum×iôëÏsŒšåÉá\}óãÿùb{Çɯ¥ÊmšÌ¾åñ¿ÿ~_‡fÓáeW<ÄÕXÖb>8®/ÆóãÏ«zê ÜWï—%ˆÆ7Ýûep.´ðØýÖH©O}Í_á>W -×kþ:ÿú6w…±ÁÉQnÀ–BˆþuKk¹Ž…ÕRÙ–ò|h©nç´YväíAUZÞ§þ4Ú°2Ñ]IUrìê¿Ñepþ(¨ÚÂ8|—š6áåJ~w± Ì>ÂÚOPGžðñýl]vû»ýËç\eÇR›ŸJOqŠøã Î gâ(·ºÎIÛHóлQ- HWø U '!ÂH/T kR*HsØc=A"ò˜D¤y)‰ 6E„þ»B   -¡hˆÉ©(d[(¢ð*ú3 %—‰)™8(µè·ÄÐÊÎU” úõùÒ9¥"ŽIE‰—’ŠÔ…A¶d¢lÉú–LT(¼1f‹&bÇF¹°‘ G0ž­L|lˤÛ'dr¾¸uD&$Õ@EpÑÕ-Ÿ+™€ã7–Š«4LLžsöáèìÝ Î^+ãÛ³7…²¦Öþ ¯ñ…ò66ˆ¸ùœÚb”¡i[Væ¥ÅY…ä )¾”O´W²Åש¬nMßøä:ž×FÜ1hõb(³ á8Lp‘wÍE %°­ ]#çŒÂÞs­Ú¾„ˆèZaGQ‰Ø ¦ðÖÖ<€ÎUÊXȨê¦o65æ(j^„©5”+ªfY‚ÐÇjÀ@¤¨#ËàÔYÅÆgýæRç'ç‚Z5Df-s !%¤ƒÓö²tVJ°ïÐÆt€Zµ6m¾ ܸC[0º¯—³Oߊ"âf¤…#ÁÿšO¹F\ θ2ÇFå„°¯Vöˆ£›oíÉÝ&Ó²¼¹»õs6tovº=˜ª2”ÓÉÛž¸áÝQK•Λ" QFü"Hàë>Ÿ€·hâM©“HLb§ž~µõŽlóò@h;Ñ #|qð5Åaí{‚ñ?ª?§ËøD€l2«GPÕÆŸÛÜÈÍl¾.—Ç˧ä³{4<,€†Ùâ>¯¾‡.Vþýï†á U¬ÓmZ±Ý”¿X­fãûßÍ?,›±ï…˜þPþÚY0‹¦z³yP§oXßÉwi£lÉk´…v›Þì¹îfÏu ¹Öd”á9A‰îƒEü @‰aª |\:…”Ök¡kE×KÁ…‚ö¨s‘ÏÕµÊ[mçzY[+|lsôMD5i•ôLU3/—öhD5ƈ¨{’pÞgdLbÃxŸ1 ^8B /¤ÝŽ0ÒÝŽlÏÑމQîÁ>'3ÆYë¢<†=ˆ‰íÁôÏ™Š Ÿ7ê™×zQÐsqPˆFœRñLL´°½"K…k˜Gb¡‚•¼µHñm´áí„SQ‡Nœf0 ø¿ÂhÇÍS¨hšùþ „¯Üì ,A–º|4$µŽ€`Ï`wÓÒì}À3#äxÇ™¯\8x¬*# aà'¼í—e¶˜;GÕè9jcGr<ÈílEQ ]P£ÙõÞ‡Î>‰óä†/.{¾%J )¾V@O+=“€`çIP '`(ÁT‰Ê(w FÁÿ¦ð$ÄWn8$.%# €€ñ«C×ÑÒýIÿ˜¸¬“Æë¸Slw…Câ~e.ý¨Ì¾vÿM/š°'jç‘Ðý¶b¡0_¹õb#¸¼oœ.Y$ÈÃoË•™óxþqÅ¥báìoË•™óxþü ]*í a]xf“¼äîö·¯ö”A{Kß» ßeïWY{·t½t\8o_ýK“ÈìÉN||gË~E.uÛÍžêü'Mèx—f&Óx´Ë‚õ1QϱɭôíC˜ná£ã+L¡Ówx¼o]úñä‘qÜθ¥x¼suãÌNå³×y4Úcà¾Û¹й07cy¬óÞ€+-¾¹ì’oÂíÚ÷þv•Í*í­*=ÌÚ3`öݸ”;µŸ#˜­ >Çû”cçÞïsSi ËòüŠQz£˜^aàÕ!ßÑÙlÕßjÕÚCÅ;û®ú»®ZjrgPÓ¾Êë15©6:À]!c„¯Œ-wYUåÎÓ¹qn×qé6ú¸WìõyØF÷C¡»ñ°¿í°³é°§lÿ ([ŸÉ&ƒöÜl¥»Aj€iŠ‚xÄ!Gcйêv®OTL{ÛìA•[íì ÝÝ?ÛR\øgžÓJísZ©}+µ§Zi{ùîþñíîñž¦ã/ i{&uJïr&÷ ÑÓ¶Ìý´¦ýŠCÿ‡Ý׺/7tT¿´ñ¢ rLñTV;8ö2ý2ì¾Óuf÷Å™îk3=)Ê_€VûŽÎÀ­°;­Úsôµjï©(žª¢m‚™^µÔ…PAµpÞ¾@%Ziû>(¨_âa@¾‰äú1…#ÉïQ„0 Ùœ˜Ò>ÚñN¢9À(@´µFêŽã€Øxjøª¶ÆìƒÒq,ÙL©ö¡ôö[0ÙMp ý

wI‹ö7ÄL¬uj‡ÿkñ ‘QËáq?׳¡BnsóÜNÙ¨kª—jÓhð;:=GFæ§øÏŸ 9 –éçÏåT_r¢`iËGi=bVèõ<À ­µÞê­ä‰¤>Y«µ[E#c³bsÖÂ2½†£6¢R¥”Á`¼¤¦ñÂó?ÀxOÎÝÕã}R†Ô€ÞßMß¹GâL·ã!õŸÇr€åé! !Ãöxþ®7ÓHÐãâîIZ»C o~»5Áˆí’…F:m%±Lœ¤Ü!øRó¥©NN)Y ðlS=õ“Ç8YT¾×óÏ6DñÚê°+ÎâÝÕ±âÜœpÒ¶*ŒÖ!“‹5ªêE°!ìz:unO…õ£˜)3ÊÁŸ¬1gwt&b)OUoàìœåOP¯âÄjˆÑÈÔ6Oˤ®¡¤í¯™$ÆÂyvô|ŽJÕ©lîè9|¯´'ü‰yv,JÜT÷š-­ï]Q‹Ñé¾õ zÒqsÉ7o°Œ"F_<g§ñvÈêäÉ‚o–'‡ ¾{¨MÿH›ÝmÚÇÙôŽÔ€rQoÆý©ùŠU'ç¥0qi!ǰ•#OÝê:öªZ®0»i©>G~j)Ï¡'—øõ©%ÑÖ©Sý3§vOœjŸ7Õ—á96xœŒE=À—žŒE}ЗbB»ßXèÆ™jg·UËÞuýn`[ŽçXÍ>‹æ,[eúËMî€ßÜÖ×Ýj°t×zßžêæŽÍ1AáÍÃxýžwT=ðSsËfÔ7³ùüêÃrþí7]:Á3Bê-S¸õOYn ”DÏ#k ËÍ.û>#EÓÈýFšÇŠàC†!p·™v#8h#´ :ã·!ââ‘*Ló*sž»¥Q£\CëèҸ̹B(pûˆFSبœVYp…ô:pK׿A¥²I&AÁDÐ~”;Dd¤p>Óš;DTév¸0)1 ¤Ð&ÀF_§mpYûÄxÜ!y+³Ü"¥'çÔ#iá"ÁŠ=®’†ì½+{qânøLd[HmG½U4Ë](FäÌ(ªTê“B7AiÄ÷l$ç qJà~Du©(}†ä Ï0¸5Çp­GÌ¢Ðð¯¶Ið&NHi³/i÷Ù®r›Wxv”»{&NG¹AC‹ÒG<Úp؆raT”ô¨=æ­³´ÍÒ)ãЈÛ`ªÖRè)ÄÆEÚ(-¢r^ï#â ‡›M–«B ˜;4™nÆ…,÷|ïMiˆÈ"æ{ïðü\BÀÒ+¯GÖA ¤B‚)~£ÔDŠI¡¢–¤‡"ŒV|; ©¼²€‹¿Ž$q¥”C‹ÃÀ„«¹Ë")O0I1’£KŠ “«ÃeüJ3ÆkSkFZg~íF¯¤bâåt Þf|“ *äNgÈ‚Z¥eB)·’[/hH…ˆ.„fÄ1á É4Ž4kh"@ÔœFáC%¼?ˆd=ÜM©’ï2™ô’ì…eX)` 0+½…ë*M3Z7´ 3…AÅ&PxáGFo8!™;âÇè¸ tò¡ÂR(’Œ.Òù¾8úàþ”1•}“ÐÄ€Xaߘ‘¬ ® )ã/pƒ¼žÄé€Ö0Í’Uµ•/KØÿ-}ÇHQ >“%‡€[Fr7‰;©¿9¿z£þæýúÂ~w˜‹*ÑwQ”&×6!&£°$ä-ç‚Ð$x#ÁYh,C“>ƒ±e4€ ¢ˆLÃsjÌÉ§à€«¡MÒ–wéÖÑ t@G“Àº¹Wpˤḙ½ðµ%ò&X%‡ žŠ¡AŸFQÆÞ¤©É{…Ú=hdåø¾Mr;\ÝÓÉ=DÀ09‡`< Âb0'Íà3žÞ’ˆg¢I°|£ö ëvš3ͤï¦~`ˆdÎ.=Â8•¢ëË ¦$1~< :Ý ½¿c¤±\@n`PŠà$/dhRà¾4=K†È 7‚ ÈŠàkN„d5ЛÈ0'r:xC7ˆFZ3ìB&roSÐ$  Çžqll-¡…n“AW„D¥ C )Ž–P?!Üæð¾ˆíÒEÆr@\01’uÃ錽,¡Ÿ1;Bê‹à<2†4Ù,$ùEÌtˆÆ`m @؉ OBND^V–^©Çc] 7ÕD(2iSfèBм–qð>?›#’שéP¾úáh÷$ãPc4š`"p·h/„K„®4œÖHƒr0wuÄ:2aS¡;‚.Hh;Rޤƒvh™(ØôAY{m÷?woãÁ97î>:g:svÜô‡¤Œ ®ÖÛ!RŽL*sóW"s!¤d‘/“EÆx\ 3pÉ1óxMÔ!+Jy˜Lti&ø_4ÉY1ð‚¼Ëlž8$¸=ßz×ð³[Gzy{ø2 Bèíãê:í2! ã"{|¥A2¡ËSˆU,ððæŒÃ!¦DH¦#_ϰœÉ#“ºe1;`71¬qYIÛ»ºTŸc'wVõ¶¯`²j­%’ף닽¡õ‡þ¶+û­j¡Ø¬i¯/ m^“ôÕRËÖÚ–õ6ðÖA'éãòü¼*.ïS©³\ü£¼º_Ü—íèA÷þïȺ¡×N‚¹ÀW Ñ@¬”îΰ04aŒ†™Á¿¦ /©Ä—çÈè€;ð@k[-`I$Y<Ê yrXºË”^1þ»”ŵ.Eò7Ï ÈOb‚ÿöüc>’4>]jø2ü‹«É«$$ÃÏ‘N©ùœ£„~DbWppõHšX±PSýŒL‚å¦ÌMâX¾zQCŠUH]rløŠÔ<+>0@Mà[y'ïYÓ䌲ôÍ-¬ìé$o‚ƒÓ¤;,^NRÿLú@SGÄt S2B§„ÃP¼J3€[êÕMs¢÷öÏ|-¦%O5†O™LV“íOÏmïPA¨ cw滢ëŸèJµ>Ûb2ºv›à2dJÜ}'Ü1}Õ‰1<<üu ªI`_ðPõx`FJH °CBH8¤¡2E„ßSçYûd&µ§Ü-²Rp)Ökª3­¥åG‘v·0-«„¨˜±j–šÀ¨ •òðAÐaY!·äˆ©ã/{ÐS é»ê·Š£9Žüÿ²‹Û…‰‚ FÏæð÷¤:˜–ô°0Ö} e˜$àÊxþ.Öb*qA ±žuzBÂséÏ»*Þnp«Mð 1ÉÀ¥;þub.ݺ‘Q\¦“Ûã¦X}ÛÆÛˆ:[®Vc)HfË@‚Á8Mrth¨ÖæY®•ÕÚCÁJ׈ï|FÖ?Sa– [| QJ_uò-ºJ/ÆãW˜œ¤e)¸P%—Ù˜XÇožïœá7±qø±\ò ™ÞxY“þ%¤Ç ã…[bÐ1µã…‹ \{#ÓR!-V9oÒJîæéº4æF÷ü¥™þ6šzÓ4v [6zyÛˆ‹Oˆsi“‰Ká.‘häæFˆZ…û _@øëÍ÷Õ,¾’EªV)çëvÞ_sµ\|¸Ÿ¶ÿ¾˜Ýw[ïf°³ù ÿ\™º­Ì|:^½/—ãÏ UÒ{ÅîãóÒ¿ð¼ºÆ¢|Øg,æ\Æ‚öcáa0" žmß³™Þ7Ï`:òdÓÀVVβ­J44±r]ÂðÜG$xHV­•äYüãb4½<ëµ”¼õÒ° é¹ÄÏm4F+ <ÜD|ÀeiËVäRê .*RCÒ‰*zhI l¡·¤G–ÔUeƒ TúÕÒÊ:EO¤8-ªiÍ |½–Ô´$Wyž(æR7p±×I‘b¬c>Ž nSlæÞ¨Ìó ®2Ô˜(e”÷ê(ÁÔ•Ü“\Áq «»w¹Ô)®"ÂWxtNÚ¥MœID z›òQEŠÎ-Q*mB×>• M¾°Ã–è²ðc¡n(mJ}ª$šÓŒ¤…ÍÔþHì# ÑÜÑìëóÜDTuƴȦK½M9X=wÆùêí•aâ$¼t‰£€¥Z®8*ͽ‰µHæ1Í=”2r"ÃhŠL/ æâÒ_iÞ–ñV'ÂIHþ]x<ŸVÜšÕÓÉ7ó‰¼!']#ø7 ²Zì€pA»ihi¼• < 3_²»m·à^à”HL›² 7†Ä&Ô×­y«ù„Ìé)À"²ö¥Ü¢ù“~\1Ó¦û&®¸l”Ê:OHI+û"m”ãð!íJ4TÓ@ qIEš –D1T\!å–ðu õµŒ'#“Œ%0aª´*‰Hˆ—¢ªTêòÒG*ZUô¡jEU!Q)•@¢E]ÓBhÀÚPb‚ã$Æ†Äøz¹›ï½g?}p’p«Â[?éh4ëÿw¾™ùfFDQÄ'm}@Øýó(:´G´GÐcÝõ‹(8°O(;~ÚÊO\PmÖ§Cv>ŸÐ#¸¦{#X6©ƒ{E—)ùÜó{DÓ§ ÄvXßÑvd{åHnCËH$ìºÖx¤}ƒ¶KˆK`?)ÅÃ÷ x DW@AKåÅÆûÌÇ*ï'cí==ë†í¯]¹ë3{Ç~úêƒDÄÞ+zœk]_ýÙLÓɨ¡žR-Ò†)!HD%áêÛÞ~hó¦­¥ÝvÉ;•ê}waoäW<¡&´È¯y^uiîä³/?Ùv]÷¦òÔÙ÷ß}¹öƒUúïzªÿªáÞ}m[3Ií³é˜zE*¦X† º*‘ÂBVúJÎû´Q&yv?·ŒÎ ›BÆ@\âä ",Yš84vì‰×VŽ^¬ýæÓF½‘xÄöƒ½z[Kß\-¤:UF×5t]ÁÐ%–©b –¹’×´aÏ‹`y½2C¢f Râ¶]@‰ðÏ´VY›ÿGýÝ#“‡‰H’Ew<6ñÅTLì·,U˜93G£îÓ”M£[YË¥Ò1,©¤!"„+žp=:‹/pkîin~›ÖΫ!v¨ÿ‹`ãUÆ(œž^8RÞ/nôĶþîød“".ì‰ ˆ˜-¸8 ©ÊsÕ†Óžj2üpÙñƒqˆß8¡(…¹(ŠB2XÈÅ”ÊWrá¹ÁÒ0îÞñ;¤A L+@D¹ÒÃo>ȸ¿!ªÎîQm×ý±Z©°¾Ídû@’Ÿ¼X •P™­¯Íês •zÜ´Ùdhf"®ß¨«ê¦—n"ŸvœzÈê‹á·ý‘…J*ÊeŠÀ Ž—$ž(pÓГœ{óÛb*3ò-¥môëwäãŠiHjnÈÙ²G±ø!ŽæS k°­¹ÉlIYF2n(¦®¢©U |×0À44 ÕgÈþƒmâ/o|ž…ùf±~à8Ëft½A¥‘¥fÇùõ ߥa[4GosºÔÕª6lWz^ˆã†œYtÿÖ@Q ©¯,‹•Åæz”fgéPgéÊB*¬¸µ®0³rÜdjy;±˜ÃÍ=ßàȱ­DAG44x@<{p÷lûªæqÄ|Ç©P[µ½°Z-×ÓŠÇó#„\rʼnŒ¤%,} ¾T¤ËgCb!`¨ïjÚZÛ©V«Ôì*Æ[x®OÉn¹Åb3‡K1?!2…·8!w²ÿ“¬þËË»)G-êKKʺ-û6–ªö5 C#ˆªïc——+u¬S™„™³tÕ«ÑáŒqõ:زi ÝLžš¤Þ¨Q®”˜_˜gçö]äÛòX,âUç˜ î Þ:‚áûè¥ÂÜXãÖú9e}|q¹%ZX¨†,–(]£ûŽÖÝp÷\ÉNÆeP\®¹¿ãÔì-ÝëîÊ&õÞ&S¯O“KXF‡ÿ~ˆÙÙs ¯'™L¢ë:Áá—^brò$ÝWâ86¶ÕŠ–n'03Ùáã'N¾wýY'›™®§²g\­0·ô޹÷^6ïybúÔ@WS_W«Å™??Ng.ƒ¼þúëŒ\¿‘|>€ëº,/×( œ>u†×mDU¦g¹ê·™-:\¹.~úKCzÿj:we⦊¡+ÌÞ'¦ ‚€R±„„Àó<õµåA0==C2‘¤\ZÂÐ U¢H‘¹œÈeTEÄ,CÁñCÌtžM›7Q,yeì~ ë&ÍÙfJåŽëâû!ù|ŽÍ›6“J¥xîЫ8~ˆe(H!b—ÓYu öýh<«çS‹›†š‰€zyŽãÏÇèèÿô©Ö럳iv“\»¡ )ÅÆ‹kßÅ¥Êt½fÓ“L|¨FЛŽ+GlæP>$øa[lD¸¡xwÍ'§|ûàÄÔÄ;¥B,nøº¨ªD»ø 4U ª š誂z¾LSåJ[E\8´TOÈœªgͪT½SsõÞxbå¦kò#©¦…ªD×"´óe† š¶ÒÇÐ"4U k (X«i­~-‘¹jùÿf«Ž¹*€KÄÇÏëcž29]\UkÕ)hT+ߨAbÙÐP¤DUŠE(B ¥@UVnÈRE¨B"zI½çùÕx¤þ­Èk~|Zöi=Íþ°fû7Ê9,ôJÂßIEND®B`‚kfritz/icons/ox22-status-outgoing-call.png0000664000175000017500000000221212065570711016672 0ustar jojo‰PNG  IHDRÄ´l;sBIT|dˆ pHYsuuDwfætEXtSoftwarewww.inkscape.org›î<IDAT8Ó{LSWðï9}ÝÒÒò ­È#À63ƒU§Y˜Æ96EÇ0²ÌÍì‰K¶øÏÇ–,1¢.3Ù#h@7˜ÙÆb›:DA@ÀŒG¡ÌB)--½mo{ïÝ<X”y’óÏÉ7Ÿ“ß÷ÜKDQÄã.SyKáæŒøSTÁÄÛüVÓñóÌ¿Ç{ªÌÇó5îÍÏ1žÔ I³ÅqA~Þ± ôõ ‚°åÁ‰ûjTÛ.¦mÒïm¼qª d‚sowÓºáWNô祫çš.߆–¿FoDÔ&cÈìp×ß.ézÐ’¯‡KŒ1ÊÚfj1Oü,k°iuÖϲø}#ôQhy½å£Ù±¼ŽZÌ6€›¼Ýý]A€ó‹9>ÄäÈÐŒe ï²2\“ýÐ*ŽÔMTmI8ú{ç}tµ÷Á=ëj·ÉvwãÁÀbfWeÏnÓñ´eÌéqÌœ¶\)g`Møð9óWy‘ïÿÒ6‚¡»#p¹Ù›Dà·6•5åšðŽ#ÍG‹÷çT}{þ:œ./9Ó AØjn(æÖƒÀç¾üêë…9'ë¼§Ë žQÝðür4²a£AuF;¥<^GPòVf–^Ú|ðµg›®¶õ“1‹|Xx“¹¾È·<§)2I†"BbR3uU•…÷Õ(vïÌh¹÷ϤôvÏ8¨N×`ëØû—PÒ@$ä"mñD àžñ)òcê †7WÃK}v­æ©´¸²šKDEOÛ·~ˆ×Œ-‘ Bp>$‚B„RÆ|IS ‚ò $“Ê|wáèÕEX ¦w~Ú±+?½ôb};˜0(%'|ý5—삨if‚Ë"Ý[#›3Ó§ î ,U‘•pîJk/‘2JDÇêÌ}gó¿Ñ/^üÚ.ðŒÌ9êm×+ šûn³I¦R'ê“S”õ4Ô1qŒéã?ÏQR@¹{øBì ñ+¡°D@âQ;^¤9yOÖN¸ $2ÙBë$†ò^ÜP©Î®ÿrª… p€H–½ APë_o…ò{: [üÔU:Z½Ô±RfpÛÝ+F“1 D îIvT=ËDP¤1†( RQ-}Ž¡tB ±C¨fˬË é°ÕÃP¬€årøYßœø‰8¢Ò»Ñ¶—c=ƒ]"5kÁwøó–YßZ¢Ö1k[0XqȺÝÔ‡@ç/¶¹ä%<®‰Ý©•{BeHî‡è<ÎÙNJ%É*ŽÃœÃéì¯= _ &D vt‹gÄßâÒ’ýAëžY×i¢Z¯}éÖ—/¶¯¯gý½ »E²ñFÚIEND®B`‚kfritz/icons/ox64-status-outgoing-call.png0000664000175000017500000000772212065570711016713 0ustar jojo‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYs<<h$BtEXtSoftwarewww.inkscape.org›î<OIDATxœÕZixSeÚ¾ßs’“½Iš´I7‡T±Ê*Tg•ã…¨(nƒ#΢Χ—ú|#Ê̸!è8¢ƒŠbÜe‘ad‘¥ ´Ð(´¥-´MÚì9ëûý‘6Ý’†Åûºò'ïóÜÏóÞyrλ<„RŠŸ*&/¬ä@éuŠ¢ü #–¹@ €²°¿µÆW¼º¦lÿ ­Ûç)qŸ¢.·§ ÍnûcfŸ¼»8V›™¦†QËNúE„ùS󅂨.ÝWO©2÷Èdz—uÄõ“Àåö0n&„<–si^ÑÍãûapúek‘nP¡¾EÀò­^l©¢ýŒj”ʡ߃ÕZ¼éô6ÕpÑ àr{€éž4èÔ…¿»½·þ*Á˜ŒuQ„yÕÍ<6 BV:ŸKåÎíPdiÇ‘gŸýýE-€Ëí)ðšÕ¤)ºkJ?Ü:¡›*ÂXW@­OHˆKQ”~½zSÚÒŠ÷n¿ç‡ï/J\n À™VÝã÷¸ ÙÛÆ_ŽNbɆ&ˆ>i^‘a߯uÔêÌúãÁå3_.B\nO_B°bö´þÙ5Í­1Ì_º kwGAñ0†ékã TìØJù— )}{Æ÷ªå¸Üž{íí‹/<0JÕÀ,¼ñi^ùh?¢¼£ÕÒëÉ€%Ó ‹ÃI‚>ï§ú\àr{2¼yõàì© Öß>» ‡ûÏØ8óû =Ç™’xÑ`%k¾@öe¿¿à0ðןOáÔÌ[Ì’1{ZlÜs.Ú‚PDlcg°šSSg2Á˜nC$èÿŸ &À„çêcÐB»ÍpßÄIÐ¥›pߢíXûÍatT•„¤6¾Ö`€¿ñdþ`ê¢ÊKð•Di¿(Ñâ½Í7”A;õ‰Bàtº”å …Àª9±÷O•qÃ?Ø®bi?›Ý§Ý¾¾¾ËÉ@$Ðõx"ð5Ô!ÔâƒÎdª8¯pÓ«G®b¬x¹Ù’nâàma݆2DB‘î\ÅH0¸À@\orð75âЮo¡5yÑtíy«€™Kª¦h8fý £s-£:@)Áæok F;sQl  Ó~zW±bÆp'Ÿ* ª÷ïEéæ 0X,UÖ¬ìüž[ÏKÜöFÕ: ûæÄ+³T#‡½‡Z°f[ ø‘çãZU2Fú쎊v#‹\ `|"ñ#?íÜŽX8L}ò_ªxwÖCgBëuÀmoT=bÔ©ž›0<›u*”T¶`cÉ ðÁ0‚ÞøNœzê§~tfÙÑϺ»3¾É +3lЯ»Øæ&ÔUDˉ˜32­é3Kßž±çl›s&À¬7«ˆ¢`ÅÈ=AÐׂÖ   *5¥²øDõÊYM$΄çdDþÇ¢QØïÏù˜]ˆF$ªÐZ£qµÉfeÏâIǺâH¹7.>¬ðÑ%äë†9Á2›÷5aÏA/dIŽ"ì Ðì…À PÔÊHâCG?¹õ¥”&ÒC¤ô!xýK‡, ø² ×T#ì@Q(dY|áØG7ÍKEüÞ %š}/\š1cÒ¨<€+×”£¤´²(BˆñàÃH¢JP½ DäWxÓ£©ˆÝ[ôZ—Ûóà%¹éÍœZ–!øäóï°áë (’E9ë–a èÓ@daiõ‡7ÝßÛ¸©B¯p¹=Óí6ã¢ûïFÕÿÝ5k÷ÇÙQÂ@6˜A$aEõ{7ÞÓÕCҸܞQ&£vŃ¿½†1§éðÍŽÃø÷ßÅÙQ†@1˜AdieÍ{Óg%‹üäAÂ&0(…‚™tív÷ÔS$µr¹=§úü÷ŽÕ82Óðý¾Züëýíñ†„lJdù?5ïÞ0=™Xä)¢%”}_«1åsŒ~³(žÎ°.·ÇÁ0ä«9w_muõ±£òðI¼ñÎf(í/%Éœ"Kÿ©y×íN6A:ÆÔ:.Ó6$¶1y°deÏ!óÉÃÉòµGB¸Ü€U³n)î3 0µu>¼òúˆ¢ÜŽ•d¶ÈÒg5ÿº>éÉŸÅÇ‹VÞ«jÁ±°Ø³ù$©ŠŠ£î©áéËŠ¦M4tôÈËÐØÄß_]‡X¬íá%Ñl‘ÅÏk–O»>I„á C„X#TE&b²8? O½eN¤þ⪾§L Š¿/^‡@0Ö.O’5D’¾¨Y>mZo“;‹ £À@b¢ð8]‘ƒ5X2¶çÈ%½aî‘.·gLN¶õþ™7^ YV°øhò¶;£cX ÃHòµË§LíMRñ óãI˜¨ £µø(LƒóÕ&½”X¹ Ǫ›Û¦Ç2Ð8³IZUë™”âÉ 8-Àgã€oÄAX‡^aÒPk%yŠ$õFë‰Ó‚ë§þYN¶»öæ-mO©Ã@Ÿ› E×}kâ”d’òÑ牉tt@€U í À7t/lC;9δ7™¸].„\nϸ‚¾Î9×þª?NœôÃóþ¶¶, .;1A,=üúøëÈ3$>žp&6Ø…ó¡Úv¢j£‰ëì^P0ûÑ<¤vùÊ+43­áç:/ìT—Ûc2è5oÿzÖ("þùÖ×àyé̸¢3@1Û ’åc‡_7t*ÇXSžk Í¢ ĵj$@A$ídtÜ ¤·Â7xlҰ븧MK„ǃszÊÞU,¸eÆ•yV«K=ß ¾¡õÌ€dÉ€¢ÑA§f¤æµæKÏQ•V•f@ãÕÛ ©;=î>'à3½ðª€Mt¯æ™´£üŸÏöįúr¹=× ÚgΈ¡.lÞZ‰owWµçÄ!ÐSþ¾–ò¢6=7”vÚuNA¡ šÓ„PQ ,} ŸÖ?eº¥'~q¸ÜSzºqÙm3F¢¦Ö‡÷?Ùçät˜à4’ýû^¹vi\"Ê…($D\ ˆh$†Ë VèŸÑêΧ£ XxçÌâŽc±dÙ×$9ÎÀê°A¥ˆOv˜„o>¡@D¤ †£Íé»I÷¬µOWömp¹=Cæþ¦_A6l.GSSü…¤Þ¤‡JÍÊ;[Ùá…ú œ ÊCfÙד&ê(¨œUWãäš­rLð^E¥Ç{ÃÉ4ÕoåÃÉß5J’„h( µV-kjSo’é ”‘ÁB‡ÌšbøÖ쥑ЉèŸéžî=»£Ñë_­)+—C¾Öî­;€Äóˆ…ÂPk¸/{›LçPMÌŽÜ#ãüïQ„šªï§OÐÏSÁÌlyfd§Ó.­)+‡·®!a‚ ¯ DQÝ©H¨=‘Â1¦iÃ6Ô~¸ †CÏÓ§èâTñ3PºÌ=Go68YUcûÊözäôúhòBk4l<øÞøÄ–‘=¥Š"|n­“D!´„Σ¥’ÿÌvX£× Ãþ@nõ¾0XÒf·A£×C£×R I $G É‡P«*N-1ÃŒT&‡RÌÅ ¼ˆjøRM×(9xÎêwMÞ;”nB`qÚï.ymâ²T'v¾Ða§è°?¬›ò¶|ÌG£]žÝ¤Ùm÷¾9yì9Ëî< Ã{ݯ\óeZ†Íiΰ­fUªKAg2¶hôºIç6½sn{…‡?°Þ!Æø×„hì—|$jUk¸˜Æ ß®Ñé&î|ylÂë÷‹ ÿ¯:Ymûà¨IEND®B`‚kfritz/icons/ox128-status-outgoing-call.png0000664000175000017500000002214512065570711016770 0ustar jojo‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsxx×u)tEXtSoftwarewww.inkscape.org›î< IDATxœí½y|ÔÕ½ÿÿ<ŸÙ'3YÉJXd\@T—xÑâ~kýU{Õ«·¿.zk+RÛÛÚ[¬µV«U«q¹¢Ö¥j¥‚à( ;’’=™}æóùœï“2I& çã1™Ç|>çœ÷Ìy}Îò>›R2Hÿ³hyÞàj`<0¼ñ•Ô5@5Pòû××W]¿ù—mEºbPýÇ¢åyã€ÿ®%’áQôùh¨ª8êk¨ÿÜ`4þxû_¯-é® ƒèλû“™ñC’Ÿ°Å;§!Dwãñ»ÝämÞ ™­¶m™cÆ.^ÿØ¬â®Æ1(€>•“;Á’´‘ÃïOÉÊÈŠÒæzV’™3Ò-˜ mõPVf÷‡ñêšFþÖ¯q×Tk®Ñÿÿ¶g¯~²+v  qåäÚ€;€›E™‘5î â‡$c6 ÆdX™eã̬È{¼ÍÐ&lY]˜76V³v¯Mïò‹¤ŒÌù›þ0/ƒè\9¹àNàg@†ÑlfÄÄqLŸ˜Êç$2}tF¥ý’¿Î§ñêú*>ÙÕUÆ·æð¾=íÚŽ#9¥6)=sìÎWufP1Ä•“kn~ HI´s×-råÔT2M† ©’w¾©åí¯kð‡ônÛP´k;‡÷íÁ™œR•˜‘éÚùÂbωî@ påä€[‡ÀŒIÜ´`,—_8S«zýHmˆuy¶ùð4¼AoPÃÒ‰UVäoýšò‚ƒÄ§¦IHMµó…ÅVÆØ$yzâÊÉÀ À#ÀX€óƧòßßÊyãS›ï;\Éôuyn +ƒ½nרsÏÃ[WGCeÅPƒÁ°ƒˆo¡]K€nâÊÉ<\0jhC‚ŒÑcoÝ“»äÕcï@påäN^&Ù­F¾Ÿ3‘;s&b·FjÒòjzs+V uä’³2úÕ^€’=»(Þ³‹Í®¦ŽtÝõâu…­¯¶¢À•“ü ¸PÌΣwM'5É€.%/þc/Ë_ÛF ¤?$¥ßìmMö„‰T)Á[_g¬¯8ºHo}}°èWNîà/ÀÈD‡…GîœÆ5³\Í× Ž4ð“'׳ueówÖ8;£¦œÝ÷Æv€»ºŠkWîýìþ×oùAÓµAt€+'7ø‘îsÏÏæî¾€´VOý ïïaùëßl|ê›HÉÎ"ÝõØNŸppËfŽæc²XôŒQgŒÚùâuE0X´‹+'÷bàÿ€¡ñqf¾ã|_:ºùzþáz~ò§ lkõÔ·Æ‘”Ð7†v‘gKMéaÂÁ â©­ý'0K€64ö댳§ å·÷\@FнùžçßßÃï_ÛvÜSß„PÆ_0•c{GòöqhÇ6‚¬3Æ~oOî ,i,òs+v?¿}*Kæi¾îñ…ùÑ×ñɦ½Ç%ÄÈÌH6<")qWWý/0(€ñ7½u!°È7"‰gœÃˆLgóõýEµüà±Ï9TÚÐi\q°øoÂl³?$•†ªJ<µ5)“nëÌÓZþxz}?V †ÿŒ×ÌÅ£?˜ŽÍbDÕ"Uã{Ÿðð³›ðÕ¨ât$\ 6‚†ªJ¤”„üþ‡O[\ºtK²¢(/ E¹Òl2rý5g1wÆH¶EÏTMçµw³fã¡.Å+ ³øo‘”ÔüÙW_wùi)€¿Ù=!VE ·ÛLLŸ:{’¯ö×àñùdí^*ªÜ]Ž;b¶Zcmr¯à÷zâO;\ñ¿ûîEð¸Âd2ˆKt’W"¯22bêmðR´¿5]‘,¡@¸Xcž¶S§®~•iòÀ}Bj¼AªÝAh5gFø½(õÕôd`>äïxþÞ@ ¶üHóg‹=Î{Z çÉqD;WI$!5D¼ÓL¼ÓÜ|ûhµuΠêwu-é®=ާ7¨¯¬ ²¤eâ°=>~Ó)/€ÅOÌ>D2Ù @’ÈÑÐò³¥”,§¡¼ç™òx¼X«"PC!ò6Õ\ºÙΠÍÝ)-€ëÿ|ð)ùI¶ÍjàŒ,;&cËô,UÕùfkÕuHÙýyxÇÒPUã³:âìßÙ7H)9øÍ&B~ŠÁ@Jö°w¾¸¸î”À’gòʈsÇ™žleÚødŒ­ææ¹½!>þì UU¤®#»8·T`7ð’39qEãç¤é}Bû7®£¡ªqÜBÒF¸^Þõ·ëß…S´xÃ_òï–’'¥ÄpæÈfJëõ7G*}|üå!jëH]G×tº9&¾þRøÞm¯·¾°hyÞR K‹4b»ºŠ}×57Lf³LîzxÏ+7üªéžSJ·üµ@Ñ$¿—ðC LŸÂä1m‚Rï®) à £kº®£kí윀2àæÂ÷n[{‚{žî¢qÔ­/‘ºÎá}{(Ù·©Gª6›3ÞŸ24{ᮿ]ÿyë{O™ÑÀ[ž/°ë:¯ëR^‚Ùg§rÆPg›{òJÜ|¸¾„?H8$èóðúð5¸QCQ-¤ !¸§ðÝÛžææEËó.Ö}ærWWqpËf| õ!Hκٞ¸pç‹‹k޽ÿ”À­/¦èº\©ëL5óÎË +ÅÖæž½E ¬Üx5¤†½~/>·»ùIišjÿQ?üʵkçtÉC´hyÞbàM W}Äj(Dñž”åhnéÛ㼉™wìyyÉŠŽÂô¸õ…Ât]—«uÉ$»ÅÀ‚©™$µêßì*¨gõ7ehšŽ †úü‘Àã!àõ¯ "Ò3 n,|ïÖÿÄÎX´<ï^àOÝ "tM£ôÀ~ŽìߋޔbF“Y&ef½gu8n8Ñ¢8ÉpËóÙRò©®36ÑaâòiYØ-mY~{°Žµ["uMUQƒ!B!Ÿ€×‡ßíA ‡ÛFl0‚¦‚ªÔ•‰‡Þ¿9¯§¶.Zžwð8`îìÞhRr´0Ÿ’½»šyŠÁ(ÓÒךm¶[ö½vsY4ñœ´¸å¯.]ò©”¸’œfNËÄjn›ùßì«aÝÎ*t]Gjj(L8&Ôüô{ñ{Z/H£ ô0B'lrÔÁwo;+›-Ï;Hu0ª»q}>*‹qôPOd°J( ñ)C6Œ¦[ Þùÿ ;‰¢ '¥nz®`¬„O¥.³‡$XX8- ³©m»qO5wWGºyºŽV# ú#ð»=­ÝdBH‰ÐÔ°®‡ýýÆòXÛ¾hy^ð;àßK4a45Lõá*ŠQ_y´ù{“ÕªÛñ¥.¿_üáÝ{ºcÏI'€Ÿ-˜$¥\-!=-ÑÊåÓ21ÛfþºU|³¿)eKÑ £Äü~‚îÚ€·idL ›Í€@QÃ~EQFæ¿}cEoþŽEËóÒuM»/àõÜòûƒ£É„Püî|õõø_î†æFª5Ρ9SRöÅ%$½–:bäW=tÎñ ˜.pR `É_ò§HÉ'HR2’m\>-Ó1™ÿÙ·|{ ®9óõÆ¢_ … ‚„ü‚>MÕˆ<ùPèZ%l—÷Þõ½šù­Y´<Ïì­¯›^_Qžã÷xfùêGª¡Åh6kF³ES †z!D)BڜΕÙãÎ\ñÑÆvÙqÑ'®:R®”•bcáô¬6®])aõ–rv6´Íü°Š 6f~ãÓ‰<ù H­FhÚ˜C¿é¸¾ò©ÌIá \üÔÁÙÀ‡Râ–fgá´Ìæ…˜Y¤ñ¯Íåì/jÌ|)Ñ4 -¬¢…ă!Â`¤ÿï÷·d¾¥1óu½Vèúi—ùp çÉ €w‘ØFfÄqùôL ­¶WÑtÉ?¿*ãàwË“¯jhªŠV›3?Ôèù ú"]&i±‚¢€¦Õ ];ãÐÛ7žv™\WÿáÀ"àï€et–ƒË§g ´Ê|U“|°þ…e]‹4øš†[ܾA_¤½¤[l @×ÜBׯŸ®™¸ °hyÞl`%`;ÌÉüVCzaUç½/J(®ð5?õº¦¡©Z8Òèk@¨±Û'¥D·Ø‘B×|BSÇzë†no²x*0 K€…¿Û;!þXÇ gáôÌ6ùÁ°Î;Ÿqø¨·¹±w\懋~€P Dž|i0‚ÔBSÏ=Ý3 æÿzç8!X)„ˆ=ôøÌ÷5V¬Ê§¼ÒÛìäÑUM Gœ=á–._8hvóê[£—O U=ÿÐ[7è§Ÿ8 P˜óó¯‡ E¬BˆÔ‘™ñ\uqv›:ßëóúGyTÔøÐµÈ“¯iºªFœ=aµq°'H8lžä¡[lH“tMjxfÑ[Kvõ×oh L¿mªP”UŠA–ÏuóGalµÊ&TyùÝ­ôF|ûºŽÖ\ï7=ù!ÔP]kÚd¾¤® UWôÖ’¯ûã÷ T„&}÷ýxƒÑø/EQÆff$póÕgb6µ ì„U—ÞÞFqI-Roqòhª)ú]½Ç6hu‹ i¶‚®ë"º²èÍï|~lÚ§;ý.WN®M(ʃarzZw,™‚ÝÚ²£¦®KþöÆföí+‹d¾ŒÌák*ú;êÅèºÅ†Ðu)ÔÐ’¢7¿³²¯~ÓÉD¿ À•“kÞ’º>+>ÁƽߟM¼³eö””ðòëøfs~—âÕ-Vt‹¤.E8x{ÑŠëߎ±é§ ý¶”µq7Ž—EN§•ÿºg>)ÉmS¼ýþ7|ÕÕÌ7[Ñ­q %J8xoÑŠë_ŽÕ§ý¹–ù)à&»ÍÌÝ=Œ´ø6ÿµz7«Ötmˆ[š­è6 QÂÁŠÞ¸î騙{jÒ/U€+'÷!àn‹ÙÈ}?˜Ë°¡Ém®¯ßx¿ÿcK—â”f+šÝyòCÁ_½±øw149jÄ‹$,Üàc¹TnêºBŸ»‚]9¹×7ñŸ?˜Ë„q™m®oßYÂ3/|†Þ…•:ºÙŠÉü ÿ÷Eÿ÷o?‰±Ù"‚eÜB¤Zkr^¼$—ÊÛûÚ–®Ð§U€+'÷là@ÜrÃÇeþü ž{é‹.g¾Ù–E þ·?2€ßc'²lë“ ¾+–‰¥ýbO”ô™\9¹©À?€¸ËçMâÂé£Û\?\ZËSÏ­!Ž~²‹n±¡93?è¬èõkC“»F-vÀ—Äøq3aülâìIKÅ2qk¿ÙÕ }"WN®x1ùìá\{Õ”6×+«Ý<ñôjüþ¨VçÇeþoŠ^¿öÁšÜü8“GêÊLû)·ç‘uÖ™$ÇÀKâQ1§_í뀾*žf–Ì·Íl3¸ÓàðÄŸWÓÐýκŎæH$JÐÿëâ×s~s‹»Žj¶$ Ë•v¼WÖP=¤˜!gŽ")n¨‚Î'âWbLçÑô-½.WNîýÀ‰ vî½óRÌæ–ŽG æÉgVSم͘t‹ÍÙ˜ùÿ/‹_Ëùyì­îB0Zm„°Q?µŒJG>igM Á–nBc›X&’;©ïèU¸rr/–›ÍFî½óRZöLPU?ÿu-Ň£ŸŒ£[íhΤHk?à_VüZÎk` „b ‰†Šû¢J*Ìydž5§uH°WÜ%:>=ªé5¸rrÇ+„ÀpÇm3>¬Eøº.ùëK_²ÿ@ôë.t«ՙܨÕó=\üÚ5ÄÞê"Âh¤u§Ä;§š eY“¦gML#‹˜œû zE®œÜDà ñÚ«¦0ùì¶[§¿öæF¶íˆþ”S݇ߜù¿(~õšGckqìJ[„„ÿ¼zªÄ†Ž¿›É9A,Ÿö“‰mˆ¹\9¹ ‘­YÆ^4ã .Ÿ7©Íõ÷>ÜÆ—¢ŸŒ£ÛZ2ßðþ¬øÕ«Õy¨þBAQL´÷·ú µøçÕSc($kìEX ¶KÅ2ñBßÛØ–Þ(.;cT·,™ÑæÂ§Ÿí域ìŒ:"iw Æ§4eþƒÅ¯^ý›ÛcŠYbÖ>sÁKêñXËÉ=£0}O,õ­m‰©\9¹K+wÞ> C«=[·óæ»ÑOÆqNdâ¦Ì ø•«‹¥­½F;U@kÜq¥øgÖLð0tÄÅÄ£âQqcZ؆˜ À•“›¼&†ïÝ:³M‹¿´¬Ž¿½º.ê 8 '"¹1óýž¿rU¿ ìt!ÈŸßX„wj9z:deÍè¼*~-fö‘•mˆe ð,0ráü³˜8!«ùKŸ?ÄÓϯ%åvëF‡cjH‰ðy,~åªå1´±—ÅYnÖ õi…4L,Â42‘Œô *ŸŠebt§cLLàÊÉý°dÌè4®¾âÜæï¥Œt÷**£sô˜,é %Òë^vèåE'G±ß„£ÙAàXê‡åS3r/ö±#HMb¶‰ÇDbïÙ–  ±¿ÿ¤ÓaåûßÕf÷»nc÷Þ#n…ÙéÀž•…4û±‚¿-z¤§¶õ5RŠNÛÇÒ0æ Ui[H€UÑ¿Îv¯‹ebðFwmìM›êtÔ­o—ät¼S¶æs2'ÏCß¾L,ÏÊ¥ò®nE%Ý€+'7 xÙg­ë})%Ͻô•Õ'nôIEA&$ã³Ø‘A ‹AîÍúÒiíÜ:ßdq’9r6 C&b4[‘Z÷Nòèm$:%âᨾ®[•«Fïœ#”­úœÌs oýðN±LÈ¥²×ÃÝ-žÒn¸nZ›zåê]ìÙWz‚`ÍîˆLä H°(Ëú’3;á°d`ÉB¾’‹O)C‘&è×CÙ;Á º±û[ø¨Š‡ÀÜ£T¬Ú@æÙ 8¼ýÃ߈GE¡ü…|3†V6Óe¸rrç7ž51›içµ¢|¨¸Š÷?ú¶ÃpÒbEu$#-IZMŠª™JFv–¦ÁjÆ<9Ÿ¡ pg·Ÿôµ(—˜¨Y³¬ —‰Ã»>|]<"Jä#ò«X§Õ¥‚ª±Õÿ´ÕbâæïLo18¨òüË_žp2§f¶µÉ|!F-˜sè7w:LWf±ß›ø­fUÒ`Ì'sÌ|ƒÉdûLüJ¸:Ù5ºZSý{íÕSHNjYÅóooêÔÙcôÔ!ZÕßVEß°ÿ™ùE“¨Ôc¶+ÚI…×qÿôrŽ*2FÎ5tã·b™ˆïZÙ5wu³‚áWºfâéÝ8ÏÙ…”[¿dÈäi$'Nø±Lôh)Ü ÐØð»ÿœ³†1Ê•ÚüýëonDÕ¢?gÏî°a‹³¡©šÔ4­Ëëõå`Ð÷´ŽÈ5¤OCbü˜ÇÄ/Å¿u7®ÎJ€…ÀxÍ¢_ÿ¦o Ø—×µmô‡d¦àsûo|b^ôë¿9Ýíὸ˜ÃÁOHŸ<[8íÃWt·gÐa WNn6ðïçOq‘9zÍçñÖ»ßt9‘”ŒˆBà'Ý1²Ǻòè„1Ì1°Uc²'ùœw'ž¹‚¢(Â|õç4ñî[ip: „À9$$‘¹uc²±;l„Up(üTwŒD@`}5LR;½ûôAX“Rp‹|èæ)¥í  q´ïûN?ƒ´Ôˆã©°¨Š/Ö·?Ÿßh6‘”™NRF:FsÛUOо „üAobÖ°ýÝ12aèX¼£J¬€ÍDŽ]JR€!DyðÊ)„Ær;q2qÄ@Ð])I§[ë%:*~d4lW^~v$=]òêÛ’Íætœ•A|j ¢ƒiPºA0Úâ€ÒEËóžøèGc£_ ( &h0Ö€  ($r€+D*4`ìí¼ú}S¼n"£€ Md$Ì$q׊·¾‹×_ö ùSéí$–v9î/qåä&ÿ1{æØfÿæ-…)¯#.1{¼›Ó‰ÍéÀ`êò?šüø¯EËó~ <Þ­ãO Dª‚öª ø/‘?¬8Üø9|Ì}M˜‰ÄFä14¾·þ|ì{ÓçXn´³Évˆ¨ ÈBfhIÛÏ¡xÓßið?'—Ê_w7Éörð~EÎ&§”’ÅÆ]p~‡Oy—’ºÊªdƒÑø;ƒÁxýŒŸmºaãÿL/èyÄZžøh Ò"•ȯRÓçÖß·~ïÎÔ„¦RªÉÞ¦w×øÊÇM_DÊ®©”¬ú†‚{:c¨\9¹Vྠã²HˆXxà°ŸnìÊD×#£‘€Û p>Bl»ðÁõ·oøíEïÄ(…®cá¤hG¤jÓIÛ;“Ãë? ¶~ÿ·r©¼¢§qÛ œ$Í™Óràõæ½±?LÃ×êñ”2^õ߸ø¯.yB§)r YûçRöåJjjv•0›óbﱸ&5+•‰cÓÈQëUõÁX¤Ó“Å‚blUJL¡@àÍYm>+æ‰$sÙû/£üó5TVm«%žqrŽŒÞ{šàÊÉU,vûµsæžÛ|Û¦^xú›0™Û¡+¥t}ÞOfýô‹Áž~+’˜ÄÐ ¨\·‰£HΔ?”Ño¨Ô Í0Û¬³†9&åLWdeRi•Ÿ£5;}zŠÑr|¥+5™ÖE¯œ²}2’À8²òçS»~;e¥Ÿ©˜˜&‘1=ζY)ÙY¿HÏÐ!‘Æ_þO‡bÉÒþ69ZX]<ë§Ç÷jâ'ñŒbhÉ|<›ò)/Y«KM.’?“Ño®%F€EËóââ‡$Ï=´¥ß‘_Ú-¿Bô ›-Dú>Çô£¤4¾çæåÒiÁ*Ó±RƒQ³10‰üUx)uètËÁ02Kçáß\AiÁ§RÕBß—Ëd·ÆQ:à ~a¶Z ©‰‘b¹Æ¢ÎÓåA».!-&Ôàñé„ÁS²Ã‰ƒ:w ”Ú=;Éð\ÀPÓ¼;4¬ëaâŒÃ`˜Îž¡¦Ö¸»[ñØH'³â´-~Jó>!¬y•Ècln3F£Ét+@JBD¥½[ü7a²˜Û€Ô4ƒ¬ùw|®†¼w•ZK页}bSOHJGº}rX÷è’Ȭ™ƒ²ÍBÉž÷ †ë^’Ke¯n…g\´›qZ{B?2%–ˆ_ŠÑù%‚’ò/ʨOJêŽÀ´ûÖÌ®);ºF ‡“KL mD6¶xg·ô5¸©+¯ ¡²:Òê„"dBzúômÏ\ý±bñ HÀFñÔÆrGoÑ®ÎÿÏÕÓÝÕµk‚>»ël-vŽäDII˜­„¢ „@Sè¡0jXE …Ñ¡æÏAŸÿø1gJÒG;^¸êÊØþ´A¢¡CL»oM¢¯Áý·®¾WŠf)ÁlµÓSã7?yi¿z#OWN(€&νóã UÕ߉¹@BòÐŒ{¶<}Y7<¤{D%€©÷®žë­«;àñÆìX3gJò¦/\9£ó;é-¢žxùÍSó>u&'¥$¤¥®P †·l­Ž¸zkœ}VOã¤gD]´æüÿ\=Ã×àyÛWß0´;‰M&=1#mòךÛgÇ£ Ò>Ý@SïYu½ßãù£¯Þm“ÕŽOI¾é›?Ï»Û 3z$€&¦Þ³ê&¿Ûó¸ÏíI?‘ß#.!¾Ä–àœþõ“sËzœè 1!&hâüû>¡…Õ{ÃÁàA¯ €Éb®1˜M…F“iíÖgü,f‰ þÔRlSEKIEND®B`‚kfritz/icons/ox128-status-incoming-call.png0000664000175000017500000002210012065570711016727 0ustar jojo‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsxx×u)tEXtSoftwarewww.inkscape.org›î< IDATxœíw|”Uöÿß÷™>™I!!”€ÒmHUì²€5®"p]]×®[\õgCVWׯ¢"ŠâW‰¢‚}-kA±ÐTjè% ==™Lžçþþ˜T dfR(ÉçõÊ‹až[Î3çÜsï=çÜs…”’N~\ò̶!šÐ/AÐ_"{D  P ”Id©ä«Õ¾Å¥E‹—O³¦5úpø0þéÍýƒr+ÈË€áÖ xTùNhdfe€ÉÀ#@&ÀÈÁ]¹fl_ÆÖSƒy}Wy€E[ªYUà¡Ú§áöë¸ýž€Nk±"wåoìÍÛFlJÊ.ç³z¯tP“Ó±uºì˜ÈÌÊÀUÀ£@_€Sû§ðÿ®Ê©ýSêÊí, 1}ÑùÅþ6§«÷ÉCqWVPU\ÜMY³8õoªl§ˆ™YÙýÙÀé½»Årïä!ŒY¿ÏÛçã­%¥üšçnwú^«|EÐï§K¯Þs·¼;yÒÁÊu @„¨™çï,ÉñVî¾ê$®ÓCª/ØãâÅ7²ÉÏáüu+öíeâBÖ§ïäõÙßÞ¿L§D€Ì¬ìáÀëÀ`»ÕÈMYƒøsÖ ìÖÐLº·ÔËós˜·`+)½z˜žvXé(ܸŽë×b¶ÙÕÔž™}×¾qE~Ãçk€0™•<Ü(cGöà±›G’`@—’ÿûïFž›» _@±Éɇ“ä:tï?ˆ²];pWT+Kö-R>ïÔÍ 3+{,ð Ð+ÞaáÑ?çÒ33ëžçíªâ/,fåæâºï¬1vz9±ý‰mUe%¬]ø-HèҫϬ-ïNº¥öY§4̬ì$à?„¶wœ7,ƒ'nE—£þõO7ðÜ;«ñ´Fu“2ÒIÍ Û·Ó.ضâWöåçb²Xônýúõ^=ë²èœŠÌ¬ì3€wn±1f¹q—ŸÛ§îyîÎJþñâV5õ áHˆkB#@¯N¦l÷N‚~¿RYTò%0:5@#ÔìëïŒg éÆ¿oE×${]™ÙŸnàÙ¹«õµP…~£†"ösö صy#Û×®í Žï{Æ9W½Ñ©jP£ò³ výq(Ç_÷¼ÚäïÏ/â›_íz·Ç9Hæ¤ôèÉöu«‘Râ*)yè€þ×¼0Èè×3Y÷ŸMÏ4gÝóÍåÜòÔlß]Õl[1ññmGh a¶Ùq&¥à*)¦º¼,©ÿ ìÐpÚ=‹„ßí¹G1žŒ—žÙ›ÇnÍbDÕBSã'?æñȬ_ðúÕ°Út$¹’ÑWI1RJtû‘+çNY‘¨(Ê¡(™MF&\zçìŪ‚óLÕtæ~¾žï—m¨]Ñ„›÷H#!¡î³»²r\‡€±O®‰ó„"zØm&F íƒ=ÁÎÒÍT»ý|³p#E%®ˆÛúü˜­ÖÖ&¹Mà«vÅv8¸à™Mw ˜&„0™Lbâl)°¥8ä1uW¹)Ø\ˆ Oåï ¯í½}-ÏÓ8< ÃÀ%Ó·*š&ÿÜ%„ Ìí§Ôå‡13ÂëF©,¥%Žy¿§éø½#å»÷Ô}¶ÆØÝB²^ØCȰs±DPÄ:ÍÄ:Íue\ûJ(¯h6‚ªYT••“Ú»g‹Ûi TQ²³ îÿ6gÜ/Ǽ\>c[:ð9’S $8Œ õ¯-¥¤`Û^ªö¶œùA¯oµ›#¦UÚk-¨Á [~]J­áÏêpúÕ˜ø+Ži˜ðÒ¶“¤äs$6«ãÒ혌õ«tUÕY¾²€Ò¢ ¤Œ>o¸JË<6GŒ½ù’í)%[[FÀë@1HNïqõº7/«8f`â˹ãeȸãLM´2¼"Ʊy.w€ÿý°’’j¤®##ŒÀ=T`=ðf¢3nˆõ š«ÔÖø|l^¶ˆª’ßBA—ž™sÖ͹âc8FW½’{›”¼ %†½â8óÄDƒíù®bÿûy;å•>¤®£k:QúD|ÀoÀ+ùŸ\÷NÃ=·uŠ„ˆi´6ªJKؼt_haj4›er^lzëêÇkËS0éµ·O• 5ÖAš‚Ûó?¾nv8…/~vÛ(]èßífª*+aÛŠ_ñVV!•Ÿ–þkjB÷ñKg-Û¿ü1!“_ÏOÒuù•®3ÔhœjWÒ“lÊl,¨â«e»P*A€€Ï‡ßíÅWíÆãr!õêNn øºge‹.<;" Ñ…Ó¶^Ž”ó6uª…ëײ7okÝtfs'tM»qýœ‰óšªwÔ Àä×óSu].Ð%ƒíc‡¦‘Ð`°.¯’Ë÷ i:ª?@ÐÀïñ†4@u5>·ç€v¥P¡quþ'“›ü›ÃÏn¹C^Œ¶þ¡ k»·nf׿¨Á3šÌ21=íSÿaWêPå0iv^†”|§ëôw˜7<»¥ñ!ËÕÛ*X¸rR×ÑTÕ à ðxð¹=x]Õ¨Á`ㆠFÐTB•º2hû§×ni)­NÛr;’i€¹ÙÂa@Jɾü\vlXW·ÈSŒŸ’ºÐlvLÚôÞÕ{ši8Š`Òky™ºä;)ÉLpš?< «¹1ó—o*cÑÚt]Gjj H0$P7úÝx«ÚÆÒh=ˆÐ „ì½íãëv¶Í=·éT‰2èm‡¢ÛÙ—Ÿ‡¯:ä¬RgRÊi4M*üèÆüfšh„£R®y5¯¯„ï¤.3’ã,ŒžŽÙÔxŠ]¶¡”eëKCÛ<]G ª!ðùñ{CàuU7Xü t“ !%BSƒºbìQðáÕ{[›ö1OåÅ™ŒêÓþX©£©*¥; )*̧²¸ˆÚÓ&f«U·ÅÆ.Ó5õ¦Ÿß¹!zŽ:¸zVÞ`)å ©]â­Œž†Ùؘù‹rJX¾¹ )e½êQýA^/~¯_µŸ»öÈ–@7›¢½Š¢ôÊýàꢶ|KŸÏO ¼wy«Ý·½žxƒÁˆÁdEàs¹pWVà­ªÄ]U‰ÏU…^³Hµ:š3!y“=>~nnßÿlJÚ ˜pT ÀÄWr‡HÉ7H’º&Ú7¼+¦ý˜ÿÃê"Vo­¨c¾^£úÕ@€ÏOÀëÃïñà«®FS5B#ߊ]«° ý¶|2¡M™ßWNÝ`.ÑÜ#Ê‹öeùª]gzª*z©€Åh6k³Y3Œ•B»‘"ßæˆýªßØKçÍŸ@Ć‹¦pÔÀ„™¹#‘ò+ qéI6ÆHodÚ•¬ØËúüªÆÌªh A ókFÐï'4ò- Z™Ð´ã·xÍ{åcG…%ðòÛÎ>—G÷.vÆO«;ˆ ¡C_ÿº—Í5Ì—MÓЂ*Z0HÐ èó‡öÿ^o=ó-5Ì×õr¡ëŽùp@Ö [Ç#±õêøiÄÝiºäË¥{ضËU?òU MUÑ‚jó5–¿Ú€ i±‚¢€¦• ];nûWw8æÃ.—ügë…À‡€¥Oºƒq#º¢4`¾ªI>[¼‹ü=Õ %ºZðÕ @Ð è¯7ûú=¡õ’n±b]s ]ëßQ™GðàÂç¶œ|Xûvw†˜ßÀ¥Tu>ùi…EžºQ¯kšª¡C‹¾ZÔlû¤”è;Ò`@èšGhjÿíï_u’ÅcG¤ÿôÆ!ñ_ÀÚ¯G,ãG¤5rçúƒ:ýPÀÎ}îºÅÞÌÔ¨~¯€Ï„F¾4Aj>¡©'wtæÃ(cþµ¶Ÿ|%„ˆíÓí@æ{ýó¾Íeo±»ÎÈ£«:š {‚õ[¾ ÏWgæÕ-¶+Ÿª:lûûWm=L¯xDሀ³ú­‡PÄ·‘Ò+-–‹ÏÈh4绽AÞùb Eet-4ò5MCWÕ±'¨Ö8{üýþ:¯˜n±!MfÐ5U¨ÁÑïO\w¸ÞñHÃ##î^˜"å[Å tÏèËczc4Ôy|~•9¯e_±;dÛ×u´ºy¿väPt­Þµb¾¤® U=¿àý‰¿Ž÷;RqDÀàë?5_+ŠÒ7­k×^2³©Þ±TuÞü`…;Ê‘z½‘GSµê¯1õî¿ Õ-6¤Ù º®‹`ࢂùWþ¸ß‡]2³²mBQ>3 §¤v‰ãƉC°[ë3jêºä÷~eÓ¦=!æËP _­êoj£[lèB×¥P æ_ùU{½ÓÑ„Ã*™YÙFà}©ëgÆÆÙ¸ã¦³ˆuÖGOI sÞYÂò_s#jW·XÑ-vºAÿ æMø •I?fpØ2Ôdã˜\ètZùËícHJl|˜âƒO—³4Ræ›­èÖ%è¿£`Þ„9­Gõ±‡Ã™ÊbpÝfæ/·O×.±~½`=ß~™‹[š­è6 Q‚þû Þ»bfë‘{lâ°L™YÙ·YÌFîºå<ºwKlô|ñ²m|øßµ)ÍV4»34òþ¼wùÓ‘Ò%»ö:H´pFòëòì)­wTèF»›‚3³²/>4qç-ç1 _ãlškÖîàå×@ऎn¶¢ÇĆ˜ï÷>[ðîïÿ)]bêìµpýàИXÄ0½|èÓcÞRØ®S@fVö‰À[€˜tÕ¨˜¿5·ˆWßü)bæk1¡´lJÀ÷L”Ìÿüip½B<Ç„vÆâHÛ9Ñn™•üˆwþ`NѧÑó»Ë™ñê÷ƒá»èš£†ù~ïSï\vo¤t‰©Óg ãìf8ÁYÈq±µŽÁáé‘¶u4¢]Ö™YÙfà# ç)'öಋ‡4z^\êbúÌx½aÎ0?¤öŸ,xç²"¥KL}âð÷[V…îÞiä­Ú…©çº¤Í¤È•ÜjaWG2Úk8Ý£{"7^7º‘s§ÊåcúK ¨ª ?³†n±×Œ|ÅïýWá;YEJ˜ò蔿´û6ÿü>UßÓdQÅÐ)-ÁƒÀïŽëÝ…IG6zðÝùò›µa7$íÔØ¤Zæß_øö%OFC˜úÚ—på‰'u/%ÿ——©˜û È&Rº P:5@tÈÌÊ> ˜âtXùóÏÄÐ ¢gåšBæ~0Žˆq"ã“k™_á[—< MâŸÓgÀã¦{Ù»öJßxôCì~ˆN 92³²ã€¹B`¸aòèF+þÝ{*xãíEa'à48œˆÄæ{«ï)|ëâˆ;Pcè‘·ÜÞ§«¤2ÿ1öͺ‚¶f*‹Àh0 è5~Ì PoEõxÌœ½˜éÖÆ”. %ÂS}á[? 1bʣට2R¬hE±kÆà #k› RdfeßL<¾O.¹àäºï¥ m÷ŠŠÃ3ô˜,©]AJ¤Û5uûœ £Sû5†ž.IñÂæy†‚¯W˜¦}Í:/ØAÐâ7­Ùï¿àtX¹éú3…qüù*ÖoÜV;f§{z:Ъ]Oå½qá£ÑÐSkèIˆË0$+³È}ñ\dqßðëK ÒpdçüoM´Hjœ<ï AÌþóþŠU|õmxá÷§G÷nx>—ûƒ­³Çß =!CÏ9Ž˜æ±ï²eF_ôÂS#jCê–úÔ`-u= œ²ÿ¼¿kw9oÎ ÏnqÆ`IK§¤ÂA .Ì{uÌ„h©5ôX-#cûvû‚µÓì¨ω¼!ÝB(hšYLý² ¹âawÃi+ÁÝeÑA^–Sˆê¼CÔ™•=øëþó¾Ç`æk?à4ÿ˜âbQã’pUú°*úo¹³Î;7Zzø±ÿJ“ilú }~&ç¥r‚ËzYv³ª¨/à‚hnUÇÑ"¤­&‹©dÈ)ì‹´zT™•ݘ㈱ˆ†ó¾”’Wßü‰âÒC/ú¤¢ ãñXìH¿†Å 7æÎÔÁ³~¸g+"¶Õ²Ãµì©qÙÉ”†ª]£i#bÈÌÊ>¸ú„A ?µþåí…%|úÅê&ëI‹Õ‘ˆ4Öwi5)ªfÚÑ+Rj!þùäßÐÿzûЋØðß7q¿±wø 9Wp4DƒXh€¡™’M#¢]@ͪ¦ÕbâÚ+GÔ}ï÷«Ìžóó!ƒ95³­ó…5Ööÿ\~Xˆ>ú{ä­Ïž20ÀÖï^ÀõÖƒ ;Îþ½ºÞ²;Š"ýÅîú^vÉêOñ¼ûÁ/Í{ŒÕ­~ahUô%›_óE„ý5†ù§ùƒŽ·‹Âeÿ¦bö uómCHÙN™•Ýxð¸Þ]8{t¿ºï[¹%¿„q|KJ’,¡³&ƒÐýVëùSK¡çÇãz¥J6ú¾˜úú7‹×Üø»3íÉÒ;ƒx{ýú„™Pz|$ï{dÁâ{É–J0úBêT(éùçª@9ÄàC7H“™•œwöçÄß`Ùoy¼ùÎlN'¶Xv§k¬£1jßwRü;¦çñÓ¹þDL}?Çj™pÂé+Xô‡xü5sC#CHPTÄ€'Ü)! akú„F?üÿ5úþÑ ¶²CM@4Ð\5ŸÎZÐìI_|XZ.i0¤Ü›¶ðW9…鑾ÖÁ8x·¢g­ÑGJIN¡—þ£†·N¬œ”T—$ŒÆ§=U+&œ¾†«?~jÞ!뜵ádß_.Û2¶Û鯗óÓäTPÖ'ô!ņÔeú °׌"IèîG*c+ KØôÖ¼´T@³€j©ù×ÚàsÍÿ5 øâ@ëúÎbjðˆ¹Iþ4€Ì¬l+p×€~éÄņPlÝYG7µ^ ¤ŒF|.7À0„X5êþÅ\úïÓ?jªŠ<{Š.6ÝÛϽ/v×Ê£âFÏ.ã§?$¢7¼ïQ*PÑ+ô׉°±ÿ6ð| áì³ëͬ¿nlýË4¬1 F„”±š×ÿÞèû–Ž;TyËÓn¬Ÿ ®¨Xï[_šÀé/—u¤ðý6Ãþ?á¥)é) ê› „®Z/©l™³á`0Y,(ÆQ,SÐç›?úá_N8T=yßS;QæŽ*.-TsÕ8FLë°7½´ê 3+[±Úm—}îÉu×±ýÒ£¿&sãš”Òty¾9óŸSš¨*÷ð«Qf_º{o¹Üët0djy›ÑØP'›íÌŒý’öŽ`w‰—}eM}Z £åÀówR—]ƒAÑì-ÛòáǾD¼róöAÜ™Vý¥¢¹*hu˜‘öpJ²“nÉ¡Å_î®ê&+µLÓA¿×ÁËϸç—þÍÕ—<ôÌ|bsž ÃH#Çÿ!üDS¨‡`ì³91±É‰gõéVZ•»ÛÝd¥VéØl!´µØÏ‚)¥1pÏF7׆œòÅÔ=r6Ý>iØÅ.z”y(ü¬å[®˜tÑÚ¶ìQ‚7†@÷ó°Ùj4¤Ä‡Ôr™+@EuTÁºaC0ZL¨þûñû|#Gß·Ù¹è©0¬…Sî˜,¦¾™ñÛºëÏ>íO*öþ}–¯˜t8óÝ"öí‰Æ×ž8£î;äî©ûÕàÌ{Ë V)]•R`÷Îk¶ôŠª~»£Þ>Õu8Æ‹¦oí- †tE’bC+óü6Vÿu›nªUŒ¼Õ•׺S <ìþæ$™W¸håù]Ïz¢œwÅS¹­Ö+á6D¸° dæBJ{nMj‡æGSÙˆ&ÇÄ;MuwòVûÚçp«ÉÒ„ \ÕÍ.BΚOým€æ‹-üyÕpçY/”±ôO‰¸uRí(ôË)Ãb›/wtC‘p@r\ý¶,’tí-ÁhD4ç隆l.™Ï÷M«ÀðþIÁàÆÀâœDF½VŠ%Œ¬0 Óð¦®ö#à`Z@SUÑzåCÏ䣼}º×·S[¶1‰3Þ(ÅÓ|½Ž Hðê½²Z;i™…÷‡®ª@a@>ü¯åˆ×.¯®.“Ë·'rÆë¥(7;tx(„ö.x|!Ø[æÃh¿TùMÕBi‘’Lý^¾«¢ÂËÚ’xF¿ZÒé<:BY ðøT¤„ïWFœd¢E0šL v-D‚MT rʃ3àågŠK 7ËÈçK[Úä1(„ÈÉ­ ¨¼õ½‡‚PÆwèšJ0!ZÅ!§üý^Ä«ówí1³7ÆÆÐÇ;=ˆ ¡ CûG·Oeɺ’ÃB„É\? ø=¡Pg“ÉÔj):ä#·N„·–äÚ©îeä„{:=ˆµPr;„~þàáº*¯~ ð»C`´Y?iÍä”ɧçÛ6m‹E}o¨jÍæZ(RSn"ôšÄº¦ ŠKbbÄŽÍb÷—aañš Ä_¤gVËÏÖíPvì*ÌI±IDATü¶º¼¢m=?Í@ÓB»_uÈm±[ª~yrx«¯Øä¬YAø¢?¬pÿº&‰î7zH?»}×zj+Jö9ºÜ­ÿ¼"…“ž('¾o‡¸*ø(‹ž>ýe›Ã^¾cÃföææ#ÛÑ,5]ÓðT…F¿ÕnËÙ2çÊð2L·¤ß‡_‚òêÕšV!Z‘ÂéÅt=M#ù$jµÞf²™ïG@Ùî}ä­^‡ßÝ> $MUñVU!¥DE »ùêvé?:ñò=Á —§’tÛ>º\_@áÎŽ“w¨ÑѰSnùßÊŠ½Å§(ŠBjïž$¤¥¶)å{‹Ø»-)%Öû¦s¯hß\»€˜úŸàî;!”½4´+]Z)§ŒŠooZÚ¬ã]œCÎp$Ä•èºÎžmùl_½wEe›tî­v³7w{èЩ˜-–kÛ¤£f §üõ.xí#И$vD“,ø¨C#øú™TwLjê)f»­n[èq¹(X»‘í9ðT¶žñ$àõQ¸nSÝzÃêˆÉ[óG—@ª §Ü|9mѹ”`¶Yü¦þƒc×?:è°Z#;*)µ8ùæÿÍs—^©·} ±[Úí+^3³ÕîDXK†ÝùýyÕeåøÜîVÛ9“~Éyýâά‡aIýöâ¹ßm:þò¤¸Ô”yBQZ4huÄTjÝ{ŸÙÒv:Ñ2„­bÄ­ßt»«>p»ªºE“œÌh6éñÉI§ü6ów‘å›íD«#*¨Å°;LðTºž÷T¹Ò­c²Zƒ±‰ ×,Ÿ9惨;îD«¡EP‹¡·~wÇ]9Íçr§ª={\ìŽxg̈Å3Æìi²P'Ú­"µy÷žþ€ÿÕ¸Àïñ`´˜ÊLfs¾ÁhZ¸ò•±´ZghüGÔ~½UléIEND®B`‚kfritz/icons/ox128-status-new-call.png0000664000175000017500000003760712065570711015737 0ustar jojo‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxœì½g´d×ußù;çÜPùåºÐ‘3ˆA$AŠI$a™"•,Y\3Òˆ^žñ²dٲ䙱Æôئ-e&idQ”d‚(R R@#g ÐèøR¿\¯Â '̇[Uï½n4Ñ Ñ¢5 {­»î©º·n8ûöÞg‡SÂ9Çôƒ§oý¤ð±t!(9Б8ÁÚŸsÍ‹y_ñ~ðtÿÇEà8€@5§…äÌíÿÕé‹uoïb]ø ºprŽ0Œd˜`I€…‹uï7pèÀ‡…ˆò„BÀsP¿ÿ¢ù/Ï•¶_ý9!Š‚œ€0LzN0À ÿÖ ïö/ž+þê„ȯR<u'X»ý¾ —êò{}É7èüçéFlu0 ŒÞ~”û~Bœ3àŠ1È€’òÝã ]Ê–ÖçCœý»oü´PùUúɤƤƒíÎ1(&éù«_âBŸõ ¼ÎtÿÇEè°Ø ì.q‚1áè»÷ãgÀ°ÎìBß6&º'˜hòî,|ýcBúš^`ˆLeìjÝkÒÁPa…Ê…>ï*àu&% ‹L§_øÀ Ù`sÊáîýi±ø–Ï:Cöeà G‹Ù•&‚‚è—'FN²€{?.d èk]ˆLÂŒ´{ÀâÂùú^g€Ë¥‘ýì˜y®ÓÏU¾ýSb±^Âæ‚-)Pì÷'U ~.)¥QÁ·~R(Ày‚^çè†ÉFÿøÈ>öμÀq™ÍqÁ’ý ðú“¢ÖÖèÛʶí·r=0ÞÚ†€AkèͯÛÀü|×(ý^>_ª v2ÖþÈcÉaÏeþØ›¸|x—áh´î© ¶ßÀëLÎM ÔŽñòÄuåÞv#×1m‚tÃ:ú·3*ƒW¦{RL²nä€ ÐÇ:óÇF.cÿŽ*¿ouŠ@½µ5€øBŸ÷ ¼Î¤±Ë˜PgqÊ:?ÝrËÈ“×q%™hƒ ‡uý_¨Œ‡“x%PÊ£…Èe60h{w¾}àÂË{³9Æû~`ôÖÏ;#èH†5ÔëóÍãƒbÛ?2~W°m狃¥IDDŽ\OyØ )¶ŽåÈ ½ `t`'—î¾säC27êÇ«ñ\c‰e2Ð5q4Ýi’ }Þ7ŒÀï¾õ“Bh‹ —šèýñ9þôˆŒ!5 ¶|¼y´¼Uîá¨Üþvõ>«ëég°dºzŽÌúïó =%TA¯Ø5;6ó,'Èf=Àhß6vïyߨGd~<ÀZV§jG[÷ÉÄ¿ >Ûôk¿&¸ãe|g‘ÎÃlt-¿€×BBð­§AÁËúNô牿õqãˆSŸømŸuÆ béhÒ˳/ðòä­5ðFÁµóêƒV5³/àÈ®SèßÁ^?ÙäP=[ÔÄ̳¦@&ú{{&Ùµ÷ãwÉüöì$·È‹æhë>5 áD&þïý¸’Ìy„6s(ùš÷L¬¥yÖÞúŸ{¯¾õ±Ž!6J6Õ³"õM _ÓøÖÇE,!vµ5YNÖÖæƒþÜ€(ìðv½W~ȘÍüa º¶”¶âumº_y¬{ ,æž®1vîÿðä?På=ùöqU›ó/2M&mšÂáßÿqQP-ï¢ÛhGüÖyË^Ä`á \ }ë'…t“éímdV¹fÝøj[à  !ÖÛu ¶rbá¥Á‘™]²°Çßó~ñûå#¸x”¹âPÿ2ÜtÏ\oÿˆ ‹…†.¿kòÇT×…ÌÓQ}f鸳ñß €Q·nWÈÔG±µ…ÀpXûöÇ„zHN#„Ä#c|O®Â%*À«/°Ä¹ h3%n·Žè£ƒWWoD u®)ËWû~”pôGîöʃå³ Âa5qÍáÝã7l¹Mõ^WÚtÐTY:Z{iÃ}C2Ïc›Ù%2”€b®‹n©%Ž‘E‹V{HÒëÐ"Óí¨ÊÚþ÷óöòhiËÚTüòüáôè™#œvæ04æü¦ls>–•‰M\–]׆;ßé>ˆ7⬘O0ÂÖÛ·¼›ÒÍbãÈ w³Ïu¦y2æçi3_PìßÁÈÀno{÷daG´\]xêùjçÙýÿ üÜï=îkopÀJ3(¥èQŠC¸P8B)eA(%9¬ …$G6Ür­KD`cg‰"¶–Gl­œ ƉX¼åh<°p ›¿7Zy4êj™~îÏ’¿Þ÷¾ä­×¼å†þkÄ »›§“úÌÔñ¥#K/Î>ÇËÍVhu¸³ÔkssÇ+=¹Ýç¼@ùVÁùx•·¼â±håÌ\Te•̈܃•‘ýlëÝUÙYß&ócydžÕƒß|î©ÿÆÝÎrŠ,.±Š£vûç\ü?4Þû›‡ËaÙÛ…sÛ„`HÀ òä 0 ƒRˆA!”A_)ÈúÊe{@ȬÿDk )áÜñ„C"$8Rdó3)%Î9àPœé½žÕÒNŽF /Plžj<÷ØÉæMÉ#«Wݼ¥Kvß”»ÙUÞYݵåm']cif¥zìôáÅCÑ‘ù™]zqéÅÊ®æî³½×L6aåØÌ ìÝÆÕ{Ôöîíc;sýã#Ÿø=Ùyzågþò©§ÿ¨qŽSÀ40ã`Nf¶À>%ìÃ_FUO¿°Í3þn©Ü.„Ø-»…»¤`TB $„ž¤JÊ9I1§(å¥@P Åœ¤(ržÀW ”À“OˆN[Jð¥@I”ç°Œm݆½C[‡¶`ŒE[ˆRG½Ù¤Y]$Y™EWg1Õ)DuŠ}Ûžà¦ÛzÀßvÖHO¯MÛ¥™…úÈöÉ2¹+¾¿NK^¢qò;'ÃÞ­}ª4YÄŸáo>GϲøØ_<úìWš_NSÀlk[¸ýó.‚¿c¸ýŸ?¶Oò&Ïóo’žºNH¹CáK)(…ŠÞ’¢·¨è)*z Šž‚GwAQ$¾ú;{ÔïN&Å5—pµ9l}W®žfhàq.¹ªáÎóÿÖÅ Âó¿² ÈsrDÖ)=ÅüÃ~àù?‹îeùs¦…eé¶/ḋ‹ €ýþrIò×ûùð&7ap£ ü®BÁg¨;Ç`w@Ù£’ÏFµ'/8‘åOV#ãedã ²9¬M£jÓŒ =Í7•…}?˜çJ^fö;òíC_Mï'cþià Ž‹w|ÁmмîØþ#_œtÒ~!4Èç¯)” j°¿L_o‘Þî=¥€|ø½… R ÖeAuçÀÑÒÑxœXogJ_à!Ö#@8pRdgºõëçȺ$ÓýÒf÷iŸ'Zß Òi‚t™ ž'Œ)$3š3\2r[Þ–G¯üžÞó{¦ø0Óßü“{üuú™3oû¼;'Fðº`â=_ó<ñ!œûp}¡ŠþÁn‡{¨tÎkàžM0NâœÀ 2F 2Ó"ÓãBˆŽÁ'[F^ÛNȾoŸ×ú^€ë¿bmr-Æ;×™u­vko³s¬#3l‚0 ÂÄH“’‹çñô*Åhšb4ÃΑüç½!²tý÷Ý¿DÍgÜ©¿ùò×þyˆuæ¯ÐÊ.vY|"‘ŠäÍ¿Ÿe#Á÷€ïút¨ƒ®ŸpŽJÁÍA± ]e ]%üð<ú)Šƒ”BJÙÚ+””%^™r‘›°éûWÅÆß·gíÇʘïZŒ^g¶³`EêL›é)BGH!L„2 R7Q¦‰—ÖP&¦O³uøïÿ€D•ßü=õñSó1w➯Üsì~óp‚ÌU¥‘d=A¥‰#B‰$¯yxÍÏýž¿8—û)‚®_vRM¸B ]¬ ¥¤á€ hpe ¾„œ'Éå|ra€ò=¤òPž‡”!e6_ƒú}ÖÚ4˜¿K;;O´5úp®¥Bd"¾S#ЄÉ**]C™&26j1<ÛKemÓÄÓM<1Ð;Ï@ß kKUº‹ûÀ¾ð|-dV¨-<ëª~ïîý‹kK‡mhÒMnéŒñíÏ‚fû;çˆ.X¼ó×^Z­/ÿ¾ïDø^!2–f¤[±õ,Íi­Žš8­ r9Â|? ðÂ0ÛûÒó2 l€Ü$¦Ï#Z£ùµH…ìç— pöho‹|&%ˆñ£E‚d •ÖP­‘ßf¼g"<[g wž±áY¶m Žuãå·B°ýû·ø/”\ É1l|ÔEóÇÎÔŽ¿øÒÒQ}rþS&Ùì•dõWÀŸ:r…Ñú?¾÷f'Iš¦ë5 ¾§Ï÷ˆ1'¥¶¼ŠTŠ ¿~¢ülôOh1û•ÜùíÆã¯h¬Ÿ×– ×bþF5àiBý¹Æùæ ^ZE™Ï5ècth†±ÁiF†fñs]Ðõ1w]$¿FJOÂòçpÉ´n.3]›åÔò1NÍdJÇÔÈ@P=/îüÔ‘!àß+%þ§„PÒ"Ú¶ƒx¾‡ïµ¸Ô2œ¬uXë˜=9ÇÔ‹'P~@˜ÏuF¿†¨àU`ê«kº»ðCÿuíÁ µ¬søñ2ùÆŵ£Tj/2Ü}š+÷=ÁøÈi|ï<åzÁv(¾òWø»v\8ˆžú½|å3,¦¹Äé©Çxdê1^zEÜù©#WHÉÝž’¹PPÉKTË?j×îÀ¶2m‰MÓò¤í¨×c¦_ž¦Yð¿åû) UÆü ãr4¸lï0/œáä©%œôéî+S®”Ö]½-7/­ßFu¶ÉVß !×u\¢`·IXëâòÑ¥ÆI Ñ ~ZŧÉPßƆg²mhßOÏíiY‚Üe»ÂË@¿þ¾Ù¢ç!~šÏ€]9çc$õe5Í¥/·¤ÀiQVÎÀŸ:òÃJНxž(öwù õ„ ê‰FÊ̵ºQ·G±`ŒC‡ÖŽ$µD‘fya¨ÞD*o£Pj<%d“­}ìéf¹s|z™g_˜av®J¡”§\)R.…H%[€sXã:mcÖÚ³>·ÚfC»µ¹öÜh;Dk¯Ðt¹ez9CÅ­£Aà|bBbB"B31²Ä%“ólß2ÏÖ‰EráÙ€™dv€?ÞX¶…×ÈìÌ4$§ÁLAr ’ð>«k1ÜãÌÂ0§gG81=ÌÔÜ Q&cµG¿4^ô)Öí€Ú&Üù©#—+%ð=Qì ¸t¢‚æ«1‹µO MŽ­ù£³Œ L380…ïŸ'GSõ€êÑJÿWùV[€k‚mf{×»z‘WJùׯã̳gFY\§º:‚EŒÊs¦)YK="’˜ Úµø¿´³úhÍ:¸óSG†¤øž˜ì ¹e?ÆÂñ35ά6ñ<ï <%‘¯âÈÓÚ‘hGšXâtqâ¨.¯eïî{äBŸþî€b^áœcqµy&¶npãµÊù€®"¯G=Ò¬5cW’ƒ©µ¿ýgŸØû—ù.Ý÷—–B«F/ •ËŸøaáÀè?¹«Ž~0 ÔDAi‘ ÊÄøÑyžw¿í/èéZ½˜G’øÎ÷qza€f8€Syü\°P!È—8rF³XD6$6rúò3_z÷• 0%Iïüw‡¾” ¼ø‚m#%IJœ<¿ÅxOâ{›CÓÅ@R %R¢Ô²Ü\EÆ8’Ô'6c~«mŒ£+ž'©ŒµÔ›f¦™¸4·Zÿ„î]缡€b ¡ŸÙ#@”¦4¢Ô6ãäPjô—ôþêšÊÈ“õŠé_^K*:1¥[Áز¶®Œ¥¢qeç¨àZ{À9ªRˆ5'¨ ìVTdM ±æ¬¨úJÔD ª6(/¤+Ç®öLóN_©æ¹«è;Y†@¯‚®ã×Nã5fÌç®ùkº+k“÷JÓx//m£Ó,Œ’£éuæKL/kšÚ§™*š©üÒ_ü“½?-Oà5ÿì‘wvw¾Ú]ÉÉÀÏíû™hö}Aà |_nbþPÙg°äÑ[Pä]Â×ó„z޼™g¼÷$ûÑ¿¡Tˆ^媯?y^Ìm7ÿwÒoßÉéåÖ FYŒpÙ…Vß“RJ~¸É»ú{x¢ZknWª)2ÆË–'幯ž’‚B )’‚/Èû2KÔåPRÉ)Ê¡b-6ó³Ímh o¹n79e£ú‹õd³5ÛvÞž$ð2›!ÿVÓxŠÐätƒ|¨)¤1å¤F)©1Ò=ÅGÞû ò¹ ®ÌzÝÉóSÞvûW¹÷Û†“ ë Æ·iÑ¡e:ãçu·þÚS^’ê_µ.Ëz‘rݹ"庇mãè÷%¨Vç ÔâšXgÙ3R€¯Ö°LR:”Ì@(ù¾þçãNJn—BŒ÷UŠý‹+ ò9Ÿr> R 3ñþ? ,9½JÞ,Q0ó”ô %=ËÖ¡—xÿ»¾Fœ¿*«VÏS*¾>‹~Åq‘0¬¿â1¥4o¹í¾õ·†—ç,F;´oÑÒb„E‹.¤”JëäW=„¸Õ ‰6¦ Ù2=;Fãm!1–zj‘4KjµØk‡Ý0µÌ®çÖ=tRàKC˜÷·*%~)Õ–H[º‹ t_$gÉëDÂeÌÏéE fR2C)aûÈ‹¼÷_;Ç;h­djf˜c''9vr‚r©Îî¼çuy–ƒ‡®cyq CƒÇé:N_ßi”Z¿¿R†;nýòAÍ‘“6Ksó,ZRéU·zZ»A„@»Îðï™KŒ#N-õD ¤A‡”mµÄPO,Qºy®Ú¾f' géˆpë6«˜ÿ‘)0M v™‚^ ”LSJfÙ9~ˆwÿð×ñT¦¾êõÇOMrìÄ'OOÐÔ%R•dzWì½÷u{–Áã¼tüJ“­ˆcu„­ÑÛwŠá¡ãŒž¤Tª"¥åö›¿šç_¶ØÀb<ƒ‘ŽšëÅoÐKµ.I!0ÆtôÝÈ9¨'O ¬ƒfj‘"3þ‰e52DÚn8C¼P€g5©Pd¦Z&^K(øEKÎ4(ØU*é ¥d†K·>Ï¿å>Î, püÄÇONrfq-óhU UyLCÚ”\t’­[N¾nï:4t­›4ÂQl®›FÌ/ óÒì>Ôã ºË Œdlô·Üx?Bjž9|%Æw$‡Ô. J^¬­¯”$M3»Vz®%#pn30iÆàÄ8•I m‘vT£Í†\ÇÓêëðÓˆ†(uŽÉ Mú“²)i˜¡©QöW>ûÅÒHËhY@«:ŸG«v’ ûPºA’ë'É dI+¦‰ÒMH꿎H›¬ÎŒâLB*K¤"Gª-N`=ßS g] 爢ßË­çÅu¼¬Gâ6=`&ÎGÖd¡µ tŠKÒ YáÆkàæ«‘ƒµ•*k˫ԫ5êk5Òø"ud3™¼—={%$,:r6ù¡O±\¢X)1P¶äóÝÔűé!³‘.s•G˘giiœ¡á—6_Z–81ßË}÷k~èö¿FÊuõ:>vïñÊ46%öË$a/Ò%4Ák‚×Àé&Ò«cµÎBX²—UàdÐð<%—RkJÍfB©fbÛ‚•™Áf‘Mß.8ÁÓ®G5ȨA¬F®{ç^¯Ñ7"–Î,²|f$ZŸ†…Ê1>è*iË)•œ!ð9Ï¡Äfàj ÍT’hÁZ$9Só9Só˜¯;šk5šk5–0Ì„šÁ¾<ý=ü–¸7"ÄÊ#¬ Î$gðm„ošäe±ÑéM÷{àÀa®~â(f~a‘þùyvÖ§9 qº9„u–¥©j‹ËôP<×Ä·M<Û`Ë– àÙç.ãÀ£·ÐÌåFˆƒ~–¦ö±ažå¥q‡°¸ØK-*‘–CRBb?ŸAØ9ž;|žÒ\ýƒŒŒLá»5dÒ€ ‰ób¬Ô§ZÉ2t’`Ú){(ÁZ‡€Ôè-ÿ¨X‹’*%ñ•DâÈç|¤ê˜êë nÍØX@±ÁPìèýú¼¸‰N4‰v$Úbý<‚RÞkåî½ú°¶0ÏÚü‡ç)FrËì¯e´Ü`Ë–q¶l™ :„§AàcÅZƒu­½µ8«øÀû?À®]»¸ÿÛß!ñý€wßy'Õê¹|ç\ë|—1xi‘ãÇN099Áèè¹¼ÍÐ/ç@¤²‚À¡×–õ ¯N>Y`¨tŒ+¯|’C‡öðí~ˆ(?F3?Fœ Î ¢0Èt|BÞ›§ð8/½„£S{hDAqЗ-3*$Áât¬c|ì4³sÃ,ÕIT‰DIEí¼¬~¥ eZõ,Î,5XY‹(æ¼ç ÁC²,ž£ª+5zú*ˆN5¦Ø\9sÖèß(ÚU4J·D¿qèÔ¢µÅº,iO)‰R6ü­Ö¬ÍÍaâ„\ÎÇ'fR¼@wØ`tl”ÁÁŽ}™/|î‹„AÈW¼‰Ç½‡©é)n¸ñZn¸ñúÎsãšk®fdx”z½Îu×^K­V#M5CCƒ¡ÏÁÃÏe ¥æ:ð0=øããìØ±ƒßûÌÿCªSÞuç;xÓ›.cvvŽðÄKô¥ÓLË+Î!+¤õYTPcËÖ“¼ttß~à­Äù1¢ÜI8@’ª"ÎŤ2O"r,/Œw:õôô‰È‘ˆ„Xä±^Ö¹AÎGž¾å¥LLžàÅé½È¤ŽP œŒÐ*ßñíÙ–ËÕç,÷÷øÿyÝÊÎÿù;+ÄtÇÚjA31ø«5Ê]%\ N®öŽ]°‡í¼@çyUôÈøIDAT2Ÿ¹Š#bmÑ©%5#Ö:”Êò .Ä”FMšK‹(,*ôÈÙ†Ó§è-çØ¹k/ÊST×Öxá¹Ãüú¿þ .¿ür¾yß7yÿûßïû|úÓŸfvfŽ®î íÄ—§Ÿ}ë #Ccø¾O>Ÿ'MS¦fNñìsÏ`­i >ÁêJ•êJ/|ዌŒŒ0==ÍO^A>—çî»ïf`p€Á¡zûz8xð0rùjángânmž4•ÜwÿÛiæF‰säá iní÷â„¶Žóò4m@µ:Œ6ž—pêÔ©[ HÈ‘ÊÖË鋵޹…7í™6i¼ëi ëSp³!g2I kõˆ¼'VžøÍV<€ÐW6bý®8µDJà)‹kdµF¡\Àù>Òµ|¶å½n=nàÖ%€p޼n’j›Ic‰âÂõ@ï½zZ™M\m…ÐW€"£«ùcãÃŒOŒb­%4aãÃþ0—_~9ÆV«kÌ/,pÇm·ó¡}ˆùÅ9Íz œ™";ðЃ”ËÙªêkkÕÓiþlëééå®»îbxxc ¹\ŽÃG^äG?ð>øÁ²V_%Šb”’ìÙ³›“'N1}üa\8„xVñÜ“»ˆ+ÃÄùaâÜ I8Dô€ ²®SÎ iÚ§ ¬,Žã‡+$q‰$ I]Hj«¬ìÆzk,Æ·8ky♫ÐNbœÈŽI×±ÅÚ¹šÆÂüJgR‚\ø ´Ö ô•ü¬pö]‰4SR%ÛR'_,à‚'B¬«€äÂ71:5híHSMÔˆiFÆvõO&š­à¾û ÀimV ‚Ìgà×^¦°ö—ìÚNwwQ”d:ÝXŠ¥×]wÖZªÕ*ù|k-Åb‘+¯¼’ÿþÕ?%Š¢ ÈÖZGŹ!ÒBåFûã²Ë.ˤQšrêÔi‡ˆâ˜o¼‘o|ókÄ©$R*FÇF(øŽÏ?+ŽdzßÊ i0@šA=ÒQ®^*GbœŸgiqœ c+ß“ž4x$ø™?E¬PüuñžfƤ×M$ŠÄ.le@o4A§–é¹œÖø^î³Àzqè¶|_šç %)……œ¢Jò¢(r…* 7‡‰;8}/Û·o¥··c2cΛYøÖÐÓÝË%—ì`bl‚|¾ÀâÒ'OžààáƒÔÖªXF±P¢P*†åJ™b±€ÑšjuêJ•f5›¤FƒËÀ^*Wس{““[èëí§Ùlpjê/¿üË+KH™¹ªVzš’’噓œ|ñrÃoB†±Ò' úˆ+XosÈ[Ú˜\s†J|’Kó3ôúóѱ¯½üŸ˜ø…Ÿ] ·ô¬ú#Ä~¡üÎìK‘’K— u߬!œ#V%"¯›†×q×Ñý¦Î¬253/œ>ùûïò; \¿°Tmü”³ÐÉÌqë"$5 rqŠŸ;  )Òd>ö$J‰M3q¦NðŸþê_^ûI€ÿöËÍÿ}ïüò?HbDkäÛæñÉo2::@¹\"Šb¬1hcpnSS§9uúÖf‘É4ÕXg[*IP®”Ÿgll´õZ™40Æ ¥¤»§›R¹„ÖjæçX8³@¬âdü-zß÷°ÎeUÍb½ÂY)‰O)¤R”Fék6™:}ˆÒ¥»…~„W"@œ|!ðr¤Ië娮£T%èi~ýØ[Žü¿²ûß+õ?éfÓ7® R!=/ðѲŸÈ+âË®¬´^„¤"‡6b“OÆZXX®3;·:¥ÜUúBûþžüùÀ“M´ ,P‹Ö)´u¤F‘è,ÀS|O¡”¤¿ èAdž¦¶D±¥‘X;ïLòþ{~õÚE€ü¹™ÞD[_É,¹ô|ú?pš ”@¶8ÓêÁoR)çèíëáÀ‡xúÉg8}ê4qœ0¹e‚ý—íeß¾½Û–­i[kW*•˜˜gdt¥išn€5c FŒYßW*eòù<‹ ‹,-/c´FA’Ȭ|M®öçŸçž}“'N†ãã\qåå\sÍU,× K'càÚ'h‰&Ùô¯1ç…X¿@äuãÇpX)ËÚ[;Õüà¡û·Ÿ¾òÙeàóƤï6I⣭CÈ pJð<ß÷B¬¿Ÿ…T[Nέ°´¸‚Ó IàÉŸ?ýæ É•ÿäÁ_^\mü¦µV8õ˜‰–ÄžÄW–î‚c²+ –fbiÆÎÖR÷b-¿³T³¿}àß\·)l•:ýŽv;ôä+΄p”=‡huN}öim–¡½{xà;Q,”øÝßù [¶láÅ—^$MR>õ©OqäðQÆ&FpÖalfYk)•ËLn¤¯·­5ÖØNIY«¤c2Æk­ÑÚ [@(•‹XgYœ_$Š£N-£’¦NÍP]©ó[ŸþmöíÛÇsÏ?˱cÇyðyà;qÕ5oâÌSO£—ŽPË–Œ cEg‘¾6Ù ‚v1Í@R(ä±zÅÏ÷ýí?¿OHê_ù¥ý5àý?üoSRúsÒ~Âó¦$N=c“Ž•¯­Ë$‘§Hµ£§4cÓ N§k\¥«üËOþ‡Û;“sJîú§î¨Ö¢»£D‘'²— =‰ïIFº|F»ãUçì©Øð… Ñ¿üßÞxÞ°àOüþ‰ÿ²²–þŒ’‚Ñþ<}•s¨„®sÖpô¿MoWH_?Î>ò‘P.—ùƒ?üC†‡‡¹öÚkxéÅ—xè¡,¯.v˜i­¥P,²sÇvúúPRµ*‡å&·eÛÑÓ€µ­õ d[šjÖª5–‰“¸3ú¥”ôv÷sýõ7pÕU-+\kþôÏÿŒwþð;øã?þc–¹¹9Î,7Ø{ç/!Z‹M-¨Æ›Òu†ó F»% ÍJ5ù‡¾xÕ?Î5Y»ñÜÕȹéWaþ”6öãIjv&©îSãi“Á‡¶§S\šóE½R*¼çéÿxÇ}¯sNâüÿ×÷]ó¿>4˜û+ƹ+Œq;„Z)ïåÉû×Ry÷üÒ•Sçcö+‘1tÖEË…òœ ‚žâúw /?‹n®Ò5¹ƒîîn®¹ê:„4 ¢8feu•Ç‚=—^ÊW\Á×¾~O‡™Û¶^’éôTce+ÕM 6f8nÀF)ðJ’ }òùµz=s ´pùå—3::š=Wñ[¿û»Üzó-h­yë[ßÊcOÓÚ.ˆþNV S×™#)Ô9‰1]Å€\Øò8:ÇÒéƒô÷T2ÆjÃïþ³Üpýì¸d…b‘ÓS§¸ïþ¿á…ž§Þht˜ç¬¥«{¤iÚ©ëÌ_×높ëL'Ù ´Î€ÐÚ? Ž£– 8yê$¿ñ¿ÿ{÷îcßÞýlß¾ƒF½Î‡䡇 Óå)Â|À™SÉ…ë‹9vYI=Þ\? [Ó5¥¡/{./Φ‹€Ÿþì±-‰¶JIA.ðÎI-C@_WØñ ,Ïœ ª­áö’Ä Úê÷üÕ_f£q£¨6¦ðiO ó¹£uGT ‘©œözm:kL&̺ø×­£ çEñ†y6³x䑇yüñÇPJe›çu¤‚gaR¯.UçèÌœC~à1»’œSì§ßߓꞈ¶üër'.&þ$€¼³ÝÊçÔ9ú?ôå&ñ¿¶8Âe:Ødº¸=MK7w@ÐÙ›F°u¤:EZ¹€–÷Dl4Û3ïb ˜ ÷ÔFcœ#Š¢ó¥”(O¡¥ê0ßóÊ<¥²ß{ Oe‘Ïúò,ýc[:Ÿqº¹°9ÑZ~Bá‰;ßyÝY².:Œ5·´Û¥œêTu@ŠlA¦EF;’$Ùd¯®®qâøqšÍˆJW…¡¡ÁÃÚ¢>ŸcËÖ­tu•ñŒÁëeN«Ì.q›Þ]ŸÕ©Þp\‰[øû€TÛËÚíBÎ;Ç ¤Ø”Mlh›Ç1Z¦§f8~ü;¶ïàC?úªÕ*÷ÝwO?ù,»vo§P,tF£”’(Š(–Š06Ø(Ö£—í¸¿í8”Œ1Œm¥Še %©N;hKF½Á‘ÃGá}ï}?•J…ï|ç;xþ¶nÝÂèØHv=g3éµá]³ééæþH7ÔTxR^ÆE¦‹€$µcí‘W| ›FEXìÂhCœ$hmèïàW~ù_pÅWðÔÓO177ÇýØñ§ú§:tˆÔÆ(ÙÉ‚……Æ&ƨ­ÕZ!ë–¸¡Ì­³ Œs„èÌ̺Š)—Ë,Î/d‰&Öe*Ç*úsenù©Ûøä'?I³Ùä¿}ùøÜç>ÇáÇùÌg>Cœ$›å"6K»v¹ÜF2²¬}_Œ½^|8]ôêË$5¿:ÉåT«Xt}rCîšuäŠÝXk‰£˜½»÷r×]w±gÏ’$a÷®ÝÌ9ÃÈÈï}ï{yÛÛÞF„øA@øÑ9uú4ýý¤Z“¦)Išvöívš$¤IJš&Ùç4«Щ&ÕYÍ€N3£³¯¿•••,߯u/?ƒ·¿ýí¼ï}ï#Ž3ã0Ÿ+Òh4سgwÝuû.ÝGÅ8çèÚ²é]ÅY}!åæ<%Eé;õu¤‹/´õ½ Czp¶@–à²Ñ!RšDùÍ(bË–-\yå•4›YÆþ=_ûo¾åVšÍ&ýýýLn™Ä÷½lô«¶‹VR]]ciy™-[¶0=5E3Š6ÏÚFàYv@Û=lZ¡fÏ÷¦ºZ%Iü èH Õš}LLNÐ×××yFÏH’„f³É•W^ÉÊÊ2?ö0^˜§Ð;¼é]­}…ʨ kVyJžõ'¯?]T ðS¿wxK[¤…¾ÜP&¾¾$©í¤/ å3´m:Mùê_ÞM£Q§T*áû>ïzÇ;¤T*Q]«r÷Wÿ|}ôûA~03=C­^ãšk®åê+¯¦¿¿?ÝIš-v™¤‘¿±­uJ¥\fÇÎí\º{7iS«­µF|vì^™¸û«Nu­ÚyÆ·Üq;•J…R©D£Qç«y7:M鹤³©µÙ jÀ+ö‰iy4…€?y.Ùr1ytQ%€´öòv;ç«óæ$©íxé†w_Íô‘'‰â&¿ò«¿Ìmo¾;vR®TXZ^âÅ#‡yáÐ H!|¥ÖÀ,D›EìN8ÅÒâ{÷ìãÖ[ÞŒ‚8މ¢˜ÕÕU—HSM>àùA¶äŒ’k˜›;ËG^äÔ©SJ%ºº*óŒA)‹µÙ4/ŽcþÃú÷ì½t/;wí¦·§—µj•#/áÛß¾Ÿ8Î’Q&ßtk‡±Ù;»óödžÓR\N¶ôE¡‹ ­íÞv; äyÓÀi%Œ¶h|ßM¼pߟ`“Bxðoyø‘(åeól¥ð[Ζl­AÀeú9A Bb´æ¹çŸezfŠ;v200Ä%ÛÆñ<8‰h6›4£õÚó‹‹,//±¸°H£ÙÀ ‹Kˆ¥eŠ{v“ sX¥:jBšlÎoŒáÐáƒ<ÿÂs-?E6ul{såÆöÞ°iÝcìyûc#ìîþž™ð*tQàœÝÑV¼¹ðÜÀF2Æ­ëhé±ã¦wóü7þ€b±€ïûÆ+ÏkUö(ž{öy}ôq–—PJ†×]-·Ýq[ Yª¤^¯óô3OwfÅb‰J©„6†µZ(jn² ‚ èHk-/=ÆþýûP^eF̆è`gÙ[)­b”4M¹ôæ·c‘YF-´¦!ç/Œµ A)ÅŽï›ß….*Rm·´½Z¹àÜ(àF2ÖÁ†z½ñËoçØcC£¾Lañ­ýÑ—ŽQÈ—øâ¾Èå—_Îôô4³³³|éK_âÙ§Ÿã¦[nȸÁ°îh°´²Ô¹_UCmÖR©T¨Õj8瘞šfÛöm™@ÚLÒèÍØx¿ÕÕUJ}£L^ýÖÍ•Óî»—Åm”JŠ¿¿6€NÍp…ð\'ÐfY@§~éqÅ{>ÁCðëÄqLW.‡çy­Ú>ŸKwïá£ý([·nå³ÿõ³ìؾƒc'Žó‹¿ø‹ÜsÏ=(©|¿µq›1­¨`gF°iZ°>3°mXúú{qÎ"„$ISª«kôôv#Ašóu¢µ|® Q¯“j˵?òóéwæÿÚ˜›ðJ´+Rˆ‹ôG]T$Úô·Ûù@žã>›„SDf½œ»88Á®Ûïâð½_"Czzºñ”Çøø$»w^Êää$ÖZúû9tä•r…î¸ã¦gN’è)Z#³S…”­wøÒK/sòxf[MnÝÂŽ—tBÄí ‘³–¾Þ^õFk”+]•2~௞­¤™¶zY[«±¸¸Ä¥oý(ù¾±MS¿œò^½$nÃùú¿Ë™ß7]\$ºB+ù§ð ^À³Iž•$f=£lìŠ;ÐIÄËû‚À§¯¯)áºë®kåé%,/¯P*–ÑÚ044D©\âổÌr}Ur!™žšæóŸû"³3sÜ~ûíüîoýg†G†øøOü8£c£ë 0–îž—;3 Ïóh4›ôæs()Ñr³tYYYevv†í·þ(£—ß±Éó(…w!Q$¥”¢rÁþ=ÐE@³©s~ ùÖÚÿ¯FßGÛ¬š¨MãW¿ƒ ÔËá¯ÿW<å‘Ïå¹ÿ;ßâ֛ߌïûÜõá!„ —xèáð}SÆ®”‚$IyøÀ£|øCáŸø_ÿÆ× Ã;ß}'§Nžâáò¾þHË£è°ÊR©tQ,:Ƥïû E ù"‰N­„Q!$ógæ9=5Ã¥ïøYw_·IïûJRðý [#hC¾ ¿·½(tÑðá/ÓkD¨®Ö¿¤^ˆhSW!d¥o’ý;¯ÅÏwñüW‹•Õ*R fçfضõº*]¤iÂòÊ‹K‹(% 6ŠèVG%ÜpÃÜu×]xžG­^GHɱ'øÙŸþþèþgafÞ@kñmÅç•×iwuõ°ã’ì¿›£(âš«¯áÐáÃ\wíuÜ|óÍÄi“$‰6$hFÇÆBà{>a Åb‘R©LÔlðßîýcT¾›Ë>ôÏ(ôŽlÒù¡§è-‡›]B暨²ŸžzM¸@ºhH¬ÛßnBõÚW‚Jž¹ÕQº‚°{˜Ëÿá¿âÌóßá¹Gÿ’ÓSSì¹t7““xž—mÊÏf-„aŽÝ;÷`Œamm®J…¯¿!ù|ž={öpøÅƒ™;vC‚h©P&²YH†äry …¥b‰þ·q¤ÂøÕHåoû9_1PÉO+¡µþž)ØÏ`´»´Ý.äÎïþn¤Œ÷”XªG,ÖâõÚ>á1¸ÿú/½™ÙgîåÁ‡¿Nîɧطwûöí' søž‡çùxžß@„™Ùi†‡†éïï'I²ôø HÓ„™Ùi<ÏG™%„ƒÖ)…|¾Þ<ÏËÔ@.Öš¹3g˜ššf(g™së¡^!}¥ÞbîuYP q髟õÿµw.½q[WÿÝËÇ3‘ÙÖȶj£N[$¨ í¢i‹¢è.Àݧ@òú9ÚM»é¦-¤YtS Ý$é" 0²° †ÑXŠ,$Kóà¼8|tAr<#k¤Èš›X!›!‡÷ðr8^’÷ž{ÎË¡L¾\M—mó¤>€cðZÙ¦l™l´éz#·Bi°üæ¯X¸ñjŸý‹{îrïÞgT«k¬­U¹|ù2ÕÕjÒ« @ÉîÞ–eaèñ`›Ûvéõz!±-;¹ú}<Ïãéö6?`ýêuºÝf‹Í/yölŸÚî.Oö[¸K7Ñ“ž>ÛÔ¹8WJf5¿<£3„àêä’gCÝ-`௦Ë%[;sD0» ñåjÍ.;îXo™4mVn¿ÍÊí·éí?¡¹ù€ÿ|~Ÿ>þC×X«®±ºZ¥z±‚èšd±b±4c£ŸÔÓu Æ –&—<ÊÐëùóé¥àœØ |:L]ãÒ¼ÃŹ{­>ÛmÚý#Þ’ôNõ œê/lŠ¢ˆ°Ÿ„—+}J®ý`8¯ß24VæJ¼öOø§&b^Õ®Õ=‘î^H8ã-q‚ sæ,ý–G½ãÑêÆn­Í8m[ê zRʶÁlÉdÞ1©'$Èžaô|ð‰2Ï eÐ5éâS8hô1{.:&‹Nü§„QD½3`¿íqÐöp{~§(b‡–Üù;!’ý'éñHÖSo-™”C0L¥wØ.v1”cvAêó1j‡HêO2¥Oì;*°ƒˆ™0" ¥ˆhU ¡Å¿K°°‡yó&Gg¿8JZ€ÆfÉftRS„Q¯»ënÇc(ŠäSýè’“5LK/’,%‡>å)¿ÿ*Ûå1v'm—á)íÂcŽ'=ÑXO ÀN¦/%oç‘*õbÉ"š"Ï 5ðÕº1ey® „}r©œÓà ”œS5´ZÞLÁyjÂ(À”Æ92o¦Í¹j‚ü`ÊHÎÓ3€Ôó`ÊÑyj©5Ë„ç©(9%e>lYek»­äœ*€^4úrŠ’Y§Ýðè‹}ïä’§GÉ¿Ôn7þj9Ž’¹lYäßwû-¯÷ûV"€‡¾Ó þ†©ÖqòÛŽ„|øû4~÷ëksœ%ÃÁ)7îüíco M šnÄQ¼´$šWà)Mb*!ÒÌ0Œð9¶ž,‹dœ5‰ü2¹|º>Zþ4öG•ï4ë‹¿ìtú|¹]çi­ÉëËŸ¼ÿÛýTÉ„b\¿óáE¾'ëHá¤óìÓ8:$€‘ 5é KWÅÈÖt<~d¸TŒØ¤'ô¹]º<^Çp—©‡ìFlÇëãõˆÃÇyø˜ÄX™Ë¿¸]×\Ë6U*¥ßÿáÝ7?E!Êój“?ªgœ\'@ÆÉqrdœ\'@ÆÉqrdœ\'@ÆÉqrdœ\'@ÆÉqrdœÿy¬GÕåSIEND®B`‚kfritz/icons/ox22-status-missed-call.png0000664000175000017500000000223012065570711016323 0ustar jojo‰PNG  IHDRÄ´l;sBIT|dˆ pHYsuuDwfætEXtSoftwarewww.inkscape.org›î<IDAT8”mLÕU€Ÿsî½Ü{¹H\ñqåRR‡0ˆXæL³MÓôC¦øZ¦åt¸åçæ+Ó¥Ôjkºp¨[(Ž^h&N§S ƒÒUB.‚"—˽ü/÷õüûÀÅåÕ<ÛÙùpžóœßïw^„®ëµ§MÌì Jn´ûG=Î[ÍMJ©9ÿK¿hƒÑž6Â;k”j{°dèIçl=³Nëó”z‚ý©Wë>¹vdʇ¤L2@ž€lc%4H¨[«ë7ñéü Ê÷ÒDykº€IEND®B`‚kfritz/icons/icons0000664000175000017500000000015712065570711012353 0ustar jojo ox16-status-incoming-call.png kfritz/icons/ox16-status-outgoing-call.png0000664000175000017500000000152112065570711016677 0ustar jojo‰PNG  IHDRóÿasBIT|dˆ pHYs;Ù=tEXtSoftwarewww.inkscape.org›î<ÎIDAT8’YHTaÇÿß7sgFëf–f2f™­bDËDjE!-¶‘‰DiYTPÔCÑ‹/a„/¡e=d¶bE†F´¸´féh3Ž:Mæ,wîÜ{gî×C%š8Oçœçþ‡0Æð?aÊ©˜š¿yáu‘æ¶8å6·Ã~·¡dÍiò?€Cçž]PTRèÒMÖ’ ¸lEÿdŒL¤îšf«ÛìaLINVwv´;é߆ ®Ø“ÒfDµ=·¸Ìv§×+|( ü®‹>/S‚âÓQ«z7$Åñ–ú×]ñý^±1ÌÂÉm•¹»dÈ¢XêîîºìúܹÞR¶5w„„=å¶IñüÕûµ­ÔÑÙýLͲÝÌ þmÓa€E»oOÏ\>Ór«úA¦\=À2í×·È)bÁZhñŠgÎQ¦œ Cκ4ëãºÖxB’i¿¶ÅO!³?dŒéîlw©Š‚ØS\^zG Kš·´öd¹D¼ïŠ?¼WÖYEh@Di¨Á¤7O,U pÜ“qßVl<–ðû¥AÀÎâ—g¾~óèèS„ÔÙá5 urŒ aà—ÂÐÿZ_$ôµQ­)›îÌoDºBçäU&h4ô¨ÃåG4ÏU{ïõŠº>Æõ@ˆv@ˆý™ß€!Ä^œõéêêB ‹—¥^ìSy­qÞlð“bW›Ú¬" Dü’ ‘tÐ7Où.€V?–_ Ê-ÇEó_DÔO<ù.. ‹RœªÈÉ$…L÷ͳѱ¯Œ¡ñÑÆ¤fœô€¶×£ôà€P U¢:÷Ö·EƒW&„Lcz÷[?ßdÒ‡$9Ín®´’öX•^w?Ôp¢Ï,?ê3cŒÙF0Õ"ÔI.³o¥µyĤï{T$ xÎj8ÎÃibŒoË–…†5B° UPÙ¯ûÙ‡[=FoNÈIEND®B`‚kfritz/icons/oxsc-status-new-call.svgz0000664000175000017500000003022612065570711016225 0ustar jojo‹í}[s7–æóøWÔÒ/íØb ÷‹ÚòD/{¼ÑšØˆîØ}sPdIâ4E*HÚ²ýë÷|@&uI”Teºg[3æ©D"‘‰ïœ¾ýן?Ü.~Z?<ÞÜß½:“+q¶Xß]Ý_ßܽ{uö·¿~ÎO—w×—·÷wëWgw÷gÿúÝWßþ·óóÅÅÃúòi}½øtóô~ñ—»¿?^]~\/þðþééãË/>}ú´ºÉ?®îÞ½øfq~þÝW_}ûøÓ»¯‹=÷îñåÍ«³Üþîquy}ÿf½ººÿðâOøë/··?>>=\>Ý?¼b%^œ÷]_ 7~üñá–p}õb}»þ°¾{z|!W²n~56¿Â¨o~ZÓc>ÜÓCqçÝã×Uã‡ë·Ck¼Å'ÍdŒñ…P/”:§ç¿Ü=]þ|>½•ÞmÛ­Jñ‚®-ûZ½üù–>áÎÁðÕúé4méÿ†Ê«Çû®ÖoéÎõênýôâÏýópñ\¬®Ÿ®«nʬMž;™Ê»ËëÇ—WëÇåw¾‚#üðéæúé=‘*0ù~}óîýÓHÿt³þô?î~u&b!•YÙ`!¬¼V|ýæúÕÙëË_Ö?È2¾—üÜWgÖ뇟ÒsË ^+㩉Y<(eŒãVå…_^ß_á ÌëOçW—··+|õï¾ý°~º¼¾|º,.´v’®Ò¤¿üßþþ»o¯®^þŸû‡¿£þá÷Ë7÷?Ò{Q«ë«—ô™?\>}wóáòÝóùßiØß¾/ ÍÓ/×¥ƒÔ½OÒV\__}¸Á-/þãéæöö/èùlñ"õtót»þŽû/æÒ_Ø_”wùîÛá3à\c 0ÔåÕýíý볯ßò?þfoî®×å‚ãÕ…{š Í(ÿxÿæ?×WOO÷·ë‡Ë;¼ŠL0x÷@8ØüõÇ›ëõæÏÃdbHö\{|OãÓ«35½ôéæŽ~>¡'¶^/XôfÄÚðE´ 2ïï?að¯ÎÞ^Þ>6`ûõþþ=}å„7ÖééÅ+Bµ²+£½ö¦¹D¯ãÕJ-œÜ:6º÷Ül½B·žë­W>\þ|óáæ×õu™Œñy?>¿¸ywCœÏ­ Í þùúzÇê…4Í>Áî—mo  ›{¸XY¼ÅJç;^¯Äíìg•ü]§]ÌMÞ—ÖŒõåÃÿ|¸¼¾!P¤ûÞeê¯Ä‰R¯Îžðç-­ï8+§T Ñ/ÅÊY¡…á›vH$"né;½:»¼ýtùËc¾Ì+ÔË÷kZQ¿þ¿ÿþú/þAýPÍÇt0FÊò&eD»»y¢ÅòG’õÿÁÿ¿îþ–Ù:—Äb!¿aýÊ–kª¾¦ ?v½<ÆÑ íO'¹ûtÿ±ˆüû·o×OEªñÔ=ýrKS†Fç,n_~ýý÷ÿö'1¶À8qYªsË/³­C¹¿Ã‹‹mšÜá‹éçÙñ¹˜ñéý28öM¾>àó[œ\žRA÷›jÖÎu\Y-•­&χjê6Ðoy»Ei–·M6=/ºù¥ÒwœÎÿ0—Áù½ ¢…=\†?òOyq})ÿx¶ ÌaõÔž'|zó´žö/6û—ý€«¿þž9šLâ–YÞiVÆYZ02$Sƒ•2~óE³¤•RòÄ.ÎâO…å™6^¸ïò¶þBÐ4œZ©˜í‚4è@rZ$i@k>½“'©ã ê$‰çÍYAÛ÷Šß}õ/¶@ÊÇ7vmH%}p"æ ‚ ^h—æ2\]ǽ]Ò&¯˜ß±ôí:úö!\ïîÊG‡V˜ôæûÖky53îà‚Û·ó«·Î¼™x$…“î§«ŽÎ…y{)÷uÞ 8Í"m1&€¤_>^>½GKjøï W:„¥$èäâb¡ÃJ*½”rI9#*¢4iz‘@\¨‹E°+/†«Á­´ŒåÎhWš±ßVÂmWÎø1ïJF˱¢¨?Km í© ½ˆšX#,Ez¼¦?h”qVZA¤[ª@|6!^2Äc´TÈÄ: _#3ò}â¿}â)Z(ÁŸ2ó®K¼kÓÚǼó¬2kh q¤ˆQl-6hbßë±¾aÅTí·ža+ß°•Ù¿„Ñð”ñûW09®`~¥¼-LÆK­ßQnÙf†g`;sÊEÌžr³'XÄlß"&ÆUC ×JëX–-M œW-Rò¼Ö,Ò͉»Êšeye–,êØZ[V, [rY°1<9‘ÄøÞKh¤Šô]·RwRVƒfÓBã”0ñè˜ÚJPQ–Å(=¼¬T:`"DY DçÒ²{—&hq.º‘‡˜O+S =4*Ù2H|±GZ—HÛß4h¸lË\çr䈭ª%@Ò Ä¼@@çvñ´–»Aº, þi¡‹…À'`¥å‹vH=—®_жC'q,¢$¦OÉ8’FnòJD];íy‘¢¦ ïy³x4]ÅÒ™–7Z)„I+Ÿ™~”ÄÇñÎî3J€cƒIˆ×Ù•,áôh}ƒMŸ_¹Íe"ˆgà×±L T/ºìÓ.—XÑIkxÙ”iáRkJÓwtF¡5-Ê À.i2Q•„GZx1ÛÒ„ŠÕᡞ°¬%Aj¸©âuŽm)øÆƒÎM ç*™ uZÖ2ÛU2ÛÊ,³¡Ã‘¢£SÔÕÇмç|ƒ`eÿØ‘ð0¢Wû€èˆOdÔY‡eëi,1¨ŠM ˜Çà½×›… ŸÁ@–ÜKG0Ya74ïç;Ÿçç± ç$y£‡ &:“ðg-v†´_’*’MxY`zTúób=ž‘‰‚Zh?AP[Ö½­”ТM[Ã[úD3oD²‘Ÿ DÁº´áåÖŠˆJÚ(ˆÿ%pòÒß iâ­L’ˆ–Zå› m‘íÐ! Ѳmö)ô®Z'Û”ž¾÷~™Kx›B=ȽPý=ìø¢½’ ªºuÅŒ`¥mµŽ žAÞ†÷ÏõúíãHlv¡Ã÷seÖv¶ã ¿OÇ ÑÁê´1ÓíuìØDªçGÕÅ’ØÞFâ(gÁÅ ym‘Va^zZꢡLl÷±r´t'Џƒ¶¯¶õŠÖRíUM{u™ä 9ÍÃåMr&1¥a‚6Љ  I1PÄÆ¤ iYèìåÙJ]4t”ôì@‘ô U[þ„ é‡á‹:^­›<Ãýªáþ˜wkïÊïhK¤l4ÖCTJ-ÀQè¼@"Àì§¥ÏØ†P˜¶©Ä‚î _¨3MåBÌ»‘/ö “¼o\«²£çyn¶:3ï§ýˆ—È: T[vÒ€N(w‰Ñ­?PçHoâIR ‚ð©-Íkº:¹Ñ5ÝÎàK·nFQT€òÁ¨,aPÄ4´ 1<#èTÛ¦To”ÁQEJéU¼õÇEÔà¦ï@”d¶nU¤†SQjeŒZð,±Z.d²qõäFÕt;ƒ¨ ǵ4sˆrÞË#JBx‡Z@y‹ÃxªZThêõ]MÒŸ M=’ï`4 ~ñ49 H"+Þ˜ÁÖyÁÎ"o4Z:B ¬ o^”|›‹M§3Xj­Ré9,ÚìÖ‹4ӥΘaaËKÝТBR¯oõ¸HRîTHR=ï`$ Û$Éj¡”Y.Å –dYct"œd*!+”Fk¦­ŸÜ§›^g ÔúåàÞ%„lÈAèH¶Ïºf™³JOÀTµ¨ÀÔëZ<.˜´=˜tÀ;L±L<3¼r±—tp áRŒˆðeç²×n‘æh©`U©íô*bZÆ;«~gàÔúÏäànÝa °Õæø^Žü5¤¥åTŽÏ¢mcxV}½ÂR¯¿ì¸X2æTX2="ï`, ¾9,¥iÑK«žw»QÙ%}~4oÖ©EDFµÈs´´ˆòy§W_ƽn¼wÒ÷  Zg’‰»ox ,?p?5T4^ˆªTˆêu0QVŸ Q¶GîŒ(ë»ÅóŒ„X °„Ù8DȰtŠT¥„(XÙ"Úl‰²¡E ×ó­&ݪڮgÕújäàÕÛ¹àY}µàé@ú^¨E¬ ~ÜÖÕ FDÅ^gÍqåÔ©åz¤ßÁˆr®½³–—°ÈË'!㗈Ǥ%L ±RFÂMcœ]ä)‚ÌÑòÈ—ùª “[§ÝîÇRlÝ-rðmÇìuFÙ¸[G gEm#ت‰Ç^wËqÁä{,CŸ&ß#øÓà šÏLÒ§Cñ$Z™”oÅ”Ëjyš¡¤]»Ò2Ý»ºÏú¦×0µ 98 voê¼ôµÉI Òi²­³2Ú)˜†˜zÝÇSè1 }˜BÌ;Lƒ#¦g[çÙ(©|Ì›µÀ³":$%75y[g…J×Òm&Ýæ›Ng°ÔšÇåàëÙ!˜ü*ЊU &Ò³µÕ&V‚†1"©º^!éY,á0mœIñ$¦ðØk çy‰X¢Ëá*!xÐÎ9PäWä÷ ž!ÞÓIÞÓñU9\mï¬úÓ†-<î·…ÃV£néôd•ScÄ˰©Ó[V¹ç±ƒÇSÙÁ•8…\‰^;8}wË»´ûD”y“F„³!íÑ"(ox‡–jÆ‹q㶡ǵpš–9yëU%“8GQI%àXnûi‹ HÏbWâT&p%NaW²×žæ†Õi‰ ?>{Äã)¨HnÕ›×´4C,iBÎÍÊ×HKçÛ8&\ ×t:ƒ¦\#¹ßÎþoï*4a߯¥¬…’ñÚMìåz…¤g1+y*¸’§0+Õkçy i£ŸC7I»f3#BZÞæ+ŽÎ4žLQê$”ª‹Õ}fÚé Z8²Ðg€$ŒW7ïW*ÚG¿œ)¦-*(=‹\©SÀ•:…\©^8wí—î†dbJ?Ðh™Ô2,=Òhü4àdˆOÉ)>™¤`¶¬£YÔͱ.f£¶S Íñ5“à›ª)‡æÄá*Q*rØŽ•…˜žÜV!.O";uÁÀL/›Ôð-¦4B"Q\9 2YZ[¨‹…–8›i¼ÜN]4t„Ùn¤Âʨ0¶ÅD9<¨™¯†œaÛÖÑ ô~GiÇÊ_ïpì}­–Ò¸hN›±MźÏâoPúTþ¥OáoPº×ßÀ³ÃÁÐëðüÀñϬ%R/m ºˆ ž$Ç>uíRÛ᪟Üé§ÝΪu4(³ßÑ@}aUB&WRyQ¹B©M”Uðô´E§gq6(s*gƒ2§p6 Ó®NAØw‘1JÜ…aÊûx!G!r\®Hf;Z7™RÜÖºl!Ft=_ÕéNŸîÔÓn÷# SÚÖW˜q7„•°ÑÕ"ŠKMØ©ˆRNV"jÒ¢Ô³x”;•ÇA¹Sx”ëö8Ðä€L“Ô)ø‚×,=_–U &>S‘6®NnLÎÁ¨u4(·ßÑü:ÙKk'}ã·BåЩ«alSéY¼ ÊŸÊÛ ü)¼ Ê÷zxz² !'ˆ “!‰¦”y W«‘Rž ¾Š‹¡¾S5ýΪõ8(Ÿ³~_¼›IÊ·Òi_PÇàOZô T#ª×ëp\@udšŒ¢JÓl6ÊŽ­n@e™IR!K‘I¹LŸ/77–¶f&§Ó*ÒsèºçJLeß–¨‹´«S….;¾mÔEC—d¢Ê>³´%E á°åªäJÂæ»¼}M4I«j3‹ˆíÿâ[]À»á­ Ûlìžt—&ûÍbkñÍ–…1ÊnÚ¢fµ£xdz’¿„ó¦ác¹e¢Ó¼2{‡ƒ‹¢Ån¿LeØ)ÉZÙìS²µÔNƒ‘_y1dk!ŸôƒBEÚTXðþù±'¤Šæœ0=PÃÜJ#ÏÙdžùDÉ’i6¥.ÚXOÒÛä4½ÍÄI~›žä·é±ßæ*òÛÊ€¦ŸlŽƒ6|Oq¿ï)›å–i—¦Ý,sßÓç±L<–j Ëôx e-HÂ2*m“ai'–v’a‰¶Aa±ÐäIÏÁSꢽJ긶CÎg¤kÉ~̹g‰LéŒ t¶ãF.œT À9"ÅÊU· Á T•6۴ɘ­Ôvš6iÇQìÉKµ 5Ç5­M =¯Ó!\ÍF Kêc µQlÒ…‰I\áĆÓVŠ._[Ý¢ªUüáòéáæç?„—»¥ÀÿV>Ê€â7´áµ¨"IÙüæØÕzµèÈ«îagkÚ(_¦Å ÊohÙW#Ër¸’Ërc IÂëx÷ QÆÒ. j€4ľD- ØÎŒ'=Îp”¥êbfŠøþ_è(Ø—ï$~ÄR3ôKœ…P~ª^ÉwyDÓáΡ}£¢^N/ÜQ·ÈÂ(Çê•çØ£Û˜fëK Ä@?ø T£¤ž¿¦ÿù@);Je¬ùßÌîש;u2Öv=[Ù‹«ÐôܱòÖz«€º*;¬ý5‘´eÕ çlŠ@”E  ¬  ¼PEÂ5m*2‚{zZ0Ä´Ã"é­#RNÙ‰uô ÕÒÉ• «QÜké m<£—ÖˆLWH„2šÖ0T\N7ҞɻzEÒ*í:8ýø÷( b<± ê9)\ q|/Ú|YÏÅ­t Ï!ô(,H³4_(l E´©,YºÑ7ŸkŽÕZç.õƒwkÇŠaíÈj¨Š+røv°Ó×ÜfïrÓ°€ Ó°€Ðî-øŽäàò—ªcù<^í©SûæòÍõ7ënªhꞵ󬺣î)RÛ3lOÏß\QuG•ùÏÝ|éRuFÌ&×H!‹989 M\ehaLqwÄp‰qm„E…¦Mªkf$jPúƒölÑÊÒi¦.ÀÕÛ¨DÇy7¸ÑDðfÜÔm€EPæGc!"+f:Ö9oý©:;ƒ+£±,x{ˆÊ¤ðºÊ¼‘(»*§ÊäØ"ÌÄ–]X—‹u‡(Ͻ O iFÎÙ¨ôÍì®í`ÖïrÉ þ7Sc°>¦+uÝë™àø—ˆ=Í™Z0H‡ºJjѱ"‡zÇYu˵…Ô1…¶(ÊDwý‚F}¶”ÅEw*íQ 0f¬A%LÔž kD¹êƒ5Ü9ï.[¿¬.^å`×FÜC(«´$mÂPv¹eŸ†¶Ç¶øß2ÑöÚàã8Y!EµG:ÐvžP`Ì© *¡/¤¿mä*1|‡cŠÖðy®XàÇ”ã@O®jì´—¨ ~š¯¶ú–;'ãœAžlÝ·z(1ûn*­ë‹jÌûÁ ˜`«ÄI‹`ÂýZã±Ë«ûüxì16}žXt½'‡Sâ’¤VT2‰E¯iw ß=‹EŸPãËL1àBÎ^%Úz.ÎÇ‰Ç ¢Ðc· --Àž¯°(ÑËš½²t›)æ çÆ«.m…=ŸÜ0î6[Ÿ°.ÞñÊ*sŸ8Ä‘|mP(ÇúYŽ/·ÄÈ.—ð³£ÐõÉ,]oœ³°¬T$íPxÀõM*˜jlµqÅ’ÑÚXhB•ôÃD)!+T/îtH®v´§ŠÕeŠ¥cô&ÑšGˆ<ŸŠCNÆ;‡ÀÖ¬‡š°tôj¿t$UVú]Ÿùƒªªn4Ý7-¢½BZî,»üʳ°D©XT×Ðð=Fu`úžp»Ï¾7æÇטdeP¼‘`HÀbµf E$L!ÌÎ-ËÁB±A>ÒÞ&ÓØÎë|§… »¡_o1Ñø˜lÉ'ai É…ÿ3u‡ ÔŒ68J®ݤXêépçÀÙz`uqþò¡.® yä†U Å•¡ÕFÝ)»|®¿v¥Ý,»ÓnmsIKhIŽ1Ž„2‹ Y‡$Œ á@]¡.à0rRÚ#Ç;ß©A W#ç'Ééˆ;Ýi`câpL]à©Ø˜—«¤/’¦‰;a‰›Œw‚­ S·]>†°_> ë N°XQŠþ¬6Ú òÕÍHˆn˜³e—{sçÚð¹ÐËs”múøìJæý<1ÙÑKsÍË&`,‰IUv“Fñ1^ƒ˜$öQµÊ•)b’(eÌØ¯æ ÷YLâ„Îd¼†`4Š òbþzm‹˜¤;¢ˆELN‡;‡Ñ ‡aÉžA£« g“í‹c Åx%6Úbï•_â0ü±ØÌr¨¬4¢7íÎpiˆ †©f\–•²r†²r• ¡/4a’¶PETâYë3 0&t'Qià™6E$«QTÄ¢ qP_”ÓÁΰõã¡¶ J#ÌŒ")é+ŒZ$ ù•Õ§nG6ŠÐÆé¡PeP]>¿ç_ÂMWÆòg‰H#zóøB2Wk>Y1¯ã€ Έ²XQ7Ò V[­T&XD„DzœzeÓ]DÁö]õéq.b$pâ!-èVá£ZÅŹ=IÇL]@S@ Ó+xð!Ýhš‘Îsãl©’n=A-ê¤Ú© K$NQ8¶Á/8ãDnƒá—øÃ~KÊždƒ¥£ìMö€g/T4|:VQ <ˆ-öÆJËB1ò…öX”9¿ÝªJN0ˆô >s„öž¸SáÀOàUÀ$B¡…´aM´Äø<¸ArÀt°sl½2&§oG5ãšÁ˸ª¤,6mvåä2h½‘-åqü2¿Á’mÔÉ|3Fõúf N32#†ŒOš]’X(mޱÒzŽF°¥&‘8Ú&Ê"yÕVc§Ð3…/ÒÑH.þ‘"õœÅ#-ÑØeñhà0´E…ƒÆè^YV0tÈÆÍ’¹hH€ÑÖŽ’þðØ!竜$W$$ýNj݂Ӳ„„* ‰8bïG ÉÑ7®HH<º,!§£Á¡jÝ4FowÓ=ã¦18üÙŽÀÂFY/Ýu ÅŽÅ-ÇKHõá¤1údNcz4–v.n?Ø” t: ~¢¤FÈBe-Òæ"â "3Zj°Y©mà!´…l Zò¦8ux¿<<Á$—öø|Á]ZðŠô[QõPç@ÙúgŒ™õÏhT²”¢Ô%åB\aÈvôÐ4mØSˆªÏ.ê ~‰fˆ¥¢uEüßéÎT|Æß¹CÚ‚?D»Ê*,6»Ë*#ÀÇ ’ä,bDÙ(Žé²&-¥š½'V¥ J刀HÚrX"ØBa÷íǦ™ ®td°ºôƒ¦0|ŽC+“åBJæaj2Ü9ˆ¶c·;pŒqàx”5õÉœNÈʵشɲӈMØLJsjÙÙUùódgw‰fŸ¢jáå³ú–D›O…¼²ðôå=ŠDoX˜±¸ô@Z,–p76$ÞÆ9‹Iv‚úçäùêé çbaIý›ŠšŒt˜­óÆØYçö\ˆ³Jy¶8VÛèÊ}Ó´ìD5<+6`‘êK<8]²Ó—KëÐ egW!éƒe§ëõîxXF¹E0éäVˆNẻç9±g”‡OŒEXz”™ˆ”F66…"*‡ŽgÉfщì|þm ’…$,ñ 9õXçàÙ:vŒÛîØ1nƱ%Ü« 6O4Îi€Vb7·ì†ŽãØ9µäì*Iýy’Ó÷:u,™=âíc@$J>ðg»Z$†8ÄH(Жc+ÒÙf´{.’I‚g]Ò „åDZ)ÂÞdé&úXž@Mq@çð|XHÑİhß%”pËThÆ:ÎÖ£cü¬GÇà`Ï¡˜+Ã0âth¥FÿbÓ0Œ`R©6ü‹ê(I`{õN„´âh¸ OwOèu÷Øt·Õ|+“ÑÀÇ*ͪeNñmqü#á,ð‘ÆÛfÀÐG‹¶½…ÀIi15ÔiOxî†ákÓ#ïÇáØÄlBhС§g0˜BMÇ:Ð oO¨½=;S·¬°Å„Œ’ÁY"ÓòÜRnÙ‹#{‹“ ®€OèÈÞºÖ×þjîDÕX1Xê¹#{«'µB[67L8J—@Ôÿԯƽǩ\ëÛÛ›ë2áŽVj”¢‰Ã„Ž´)¿ìçB,v¤49‹ÿ}Ĭ» ¶™ËÛ!Åi}fh_hH4¯aŒ”:ùŠè¯¼'ñŠMz\p ¯]²(–ôÕLÑÖ)pÒx¦IáT´UO7"ÙÔê¡O"½´åtŸÁæ, f:Ô_CV¯ed$£ŽñÎ4¢M,G)ÑX*$½Ø0x™¬a¥½Zp.?ˆ6æÕƒg9XÑÚ£&£*we„¬Ç­A7¶1ÿýºégnn[‡‘Í»ÎKÁáò$@Ütz͸£oZ”vF%ý%Ž¢,‡Ï%Ë`¹Œ4 R4–â蕬ìÈ›<Òta"¢ S1JH´A01¥½årI ÒØ¨˜ö4ƒ ݺolöúïâx„wLÊnJäYº1þL;DÇÊÎ#"² ©{+$~Ùt´sÜ¡bZª¾2dàkZ)ø{Hð/Bi¦PJ!]ÚÓ4‘¨‡®àÍÓÖ€Ò©Jò”ზÆIF â²jzžRsh}%¶d—ÿeVöüï^¤µIGbž.Iu  Ó¯Ôç¶>F‘¼Ž²% :´³C‹äYÝW­Ä$ÍEÒF”ë°«;ç@“Ðg› ]DµtVrd‘89Rrù C;[¨QÀDÁ*Ä<É5Ø +·ð|Õ>Ju GN0ÛÖLmõ^UÅ£¾ª¥–r<yÜ´ç©“ ¾-7Š'êÞŠnG•ZºC[9Xjé>m0 •d®Š6¥ÍdˆEù¸Ò¢’R!X’eXHQ…oÔ–>9¯h$ý‚L+^ÕïÜô·f`›Ýé¿ÓU5{äw€3À¨lêC3%r¦­ñ9m‘䱉ÛÀgï+G•[¦£&ÄÁr˸.|zÃÇ/ÂÈö¼Ét°òX b,ηDjÄbd8}€³®²rÒ Î‰(S‹.¤}ж4 6¤R]dÞt sèhp6{Äw™@œ­Çz.ˆSª¬a,Ì´T® _GoÉQ—çHÛYâà!OŸXÁÙå9}  „ Ÿ¯ìÒcºRÞNëX+ç±B¸ 3‹­µRl9Aø M8+ß–c²¶Gf¯µÑ{í8 OXßg`‰ÉÃ!ŒOÒË+>g Ð\ÐvJ#æO¡P ÓH.¤[ªöhÜ*qô«ek‘ÓžçÞÆpÛìK®ütÖÉý¥XƒwSï Â×5Ù›6ŠM„4Ñ›GH}œƒHfg­]GÿZšËvýëp‚8Ÿýäøä—ŠÍvl!BK¾Êö¢D阪ø:x܈NÕI#É¢hwš‹[NiIÉÍ(ê‹lé@¡@*Ò™5¡p‘Óëmª@‡B¦[-çTû¹ã|«àr”^ØBåÑ›áªD•St„áBp¦V&=üÎè†øÉÐ`* U¨\¶ÂW Çój ŸÖvQÑÁxNéF¿‘ÔE:‰þ@.÷«4R7ñÔ øóEÉcàôo.˜>uþžOEž‚b*T3=´‘錶t¶R†TA%s¢BÅ¿BãcdgiK[¦kmÈ>Iò Æ` Íÿ˜NÚ¬Ë%öFÚбh¹&ܤ‚OÛT$ ^×t¾U¥R!Ú³Ïf Í©bE¥mB¡I <<•¾Rñàµ+*o‡«©"nDìë@ ®•Sh‹`Š†È”‘)46QŠdôëš6!=G¦·ÁÁë† =á;[ŽO¶iB nD¬>®MŸ^êõd*ZÚ°\Á/©l©åÝ "GÚðâÌåEeE™ƒ7˜¶ÌÓ¸y’¨ÙfSH&Of¯Ù9n ­™òÂWTßPS¤‡dÓ“ Õ€¤¨×ÍðË áäp§Þ&‰Æ×²\ß çAŒTŽ1ÁÛÇ£ôŽÇ…,DŽ–æ)ÇX~]¡øÓ,!i>eCþP™Ö Çn †ëu¡^7ßvö4ïw»¸OØAúéñ“üº1>Q Þn‰ 0Ç9méP9×Upá`9×]pÁ$y-ÓWÁÔ tPÒ Â!Ý2}ÒD £+!\Hzú„v|¿L©v›´õfò¼Mz¶ºµÙ0iì(¨`SA…]Ð1$ûÄhŸEv´BäÀˆŸºü $£w›©pæ8', ¢®ªƒ¨¿ J“%2qŽŠ¸´2mAÁfËnâTAs>PÎBH;Ö ¥^éÈmƒåü x„Á.K##(Ñ©vuälL™úágBQŒ¼+TQ´ÃUËŸè‡Æ0RÞ•(8÷±Ût§Y2&â‚këB]¤Éáªâø~ÜIËy¦™²í:Ó´µÁ"ø”’gTþ ¹_„S!÷)ðËþd¤Šó4ìu—|Ð">oò£R1¦bÉð Õ´€zÝLSKóºƒj;ü²ÚçÒÆÆûBãSXJ"71QøléõѼ¸Ó¥©Âëd¡òãUÍOAn—aJN†E6âð‰AÓô€ÂßœQþve*Pdˆ –²ã›ð´ÅB½nÞsNÊl8£rIŒ )ý)ÃAº"T~ D,‡áÀ­ŸÕF›T…Rè¡Ne-iŽsגƉž¤ÅC%½I‹éE!’‡ŠX¥*Z°’h„ßrp T8¦¹qªBé‚ô[(njU}ÕûT"Y4œŸÏoFQ•[sˆ¹ˆœfÊM»Î*Ê–¶L£V¯ãž4GРÖ=Æ@ú~¦X§v m*øJ²KG¾¦LzSd £[‘ou)ICpüe”üL©eõPü¦.UÎWcäT¸hÁ"Ž5é‘f›L¹šõ:›ÎsÊÔ8ø|UpUtPŠ7L– KíÓàƒài’iœÖ–Æ´Îñg›µäÄölO'Ü~«ž§Ï]å‹ ÀëÑ״ȧ »°áï0½~Ú#ófOòæÁ¼)»‹kâ ¯eúhÉšGϹd ²v ©ŒÉe\¦ï™hÛPh+l¢rÅÖ–Î]çÖ5Õ *‘l’*£ú"¥aÓqa…2aAÉȦ"3Œ#/7Õ Ù\ql1ê2²i+ÄÔQ2áSÚlÂÑ£HŒâuz¤•põ—Ü ç5äÖ#í¤ÞÎrßácp%)Y×Û\»š6¼vm0ÆQŽ;˜1dOäþÁŒ¡z#÷)YlÆSh¤52­7Rú¤1rŒeµÇáÕŤqð=Ë[ljB’Õ´ñçl;N§‚.ê¡€…B½æèÒ°…Æ27g’{F¨DbDie Éɘ)—G›( ÛÃØÃɇì†G9úâ¯õpQÃ…Í_kþ@:¥» “FÇP¡äiþ€©b4éJÜòù*àñ9›1ÿŠ‚©¾´¯>j$}äœ/‘žƒ“=0ü4mXä_W´ä—[§EÍrǬ¶Òׯ ǵƒ Í‹3F––_,ò<á• €™ðq¸ /ä9iÐ0øN¥|õ]°æDAàÔö¢ZN™=¢:iãQ9¿ އ²uÑà¦MÞ0 »ÅlŽr²ÚÁAõÔÈ:\"t—Ç$ž¾B@ZE•è˜JjŽArï¬h±DÙKÇû#™B]˜ÂR™j eÒ’ÚTÙ8[  Áâü¦rQ¤£`h/HÐç³×¸­ !Ç…t/³ Z§íª”©€’çž„à‚^·BñL*ãÁWŸÊ{N_Qž÷²…†=‘ßÅóîÅ1zÍ[Q¡ù¥áó.]OiŽc |XÏ6ºýä çx§Í¡sZnç­÷ñ˜ ÂÔ¦Ê*“„ygÚ&Y, }ý Îé ª9.çèžò sŽî-¿€"Z’퇞…2JG\½¶Í‰¶–í‰Þ«Ô^'û¢aÕˆ‹v“æyÉíñ¼–NÏ›ƒMTãÌŽz *× |Ú’ëC;O9Ý'SQ£ZÒRq®&Â"ï'u: ©||R-ÿÈû»¿Ã8÷_¿üúÍ[»æ”ZçŸn®ŸÞ¿ ´ÈYMŠ…/¿cFþóþæîåÃýw×å×7Oë‡ÛúÏKS~¦ºüp}ùøþòááò~îYÚÍËõÏxÏõý„×ÇõíÛr!}Šœcºãc¨`½,ß"ç´Ãx÷M®+ÝN¯Ð3ìY¹<‡´Èì«Â@æÌì±>·º®À8ß <’þMYjQOTÍ=ßÿou›±ÆXZ·vt+纽¸ØÕ-/\Ì÷íÇûÛ_ÞÝß•[> ðŒâsÉLäScEª‡ŸáÔÂ)´8 2ÿ–’BÑV²Õ©H¤æp™³âÞ ž‚v}å§ÔQn)Mé ýó•ò¼tÆ ÒÿËcË¿ÃdÊÍÓóK/ilè=·<Ôâ¸ò[[nKcÎ}äW9«‘–?™QzœŽZ><+ò$¿„Ä 6áR­çØySÙNa,i‹Äù~Gþ»¤DâØ]ì¼ÁîSqÐ'C¶ "m7¤ÄÈ–ù4¢~A1 ˜M)Qu£€é‘¡ý”S½•-ÍÈ–ÿgÛÅY#%6øXu²16­ÞEÚ´<—*a~UÂüƒªæ4ª„ù§*qtUÂ~¦*qJ<¢*aW%T¯*ðUŒW꿼*a÷©ö4ª„ý©§œê­léþ©J¨JÌ­×î7X¯Ý?èzíN³^»ÃÖëCfÿÿfØ.üöõšMƒ ¥”ß \R,³·i¥Ô7¼6æU¶’~XœÄ!Çà–ÁV/ÎáÅÒÞ"Uиàíâ¹*Hí?G8݂ˢðem4.—¿–çéÒÍ–ù¦Å¹'iË7pβ]\-pj4ôi¨E^¢ž#bAQ ³‚ÇfŠîö8Þ^,æáxNíôÜ{>OMoÇg—‡!pFÐóa8\wØ.óPá䡯ƒ”ú…ß#õW>Ư•Ê…ëõ0-/z÷Ýÿ!¼N5êkfritz/icons/ox48-status-incoming-call.png0000664000175000017500000000542312065570711016661 0ustar jojo‰PNG  IHDR00Wù‡sBIT|dˆ pHYs--BÓþgtEXtSoftwarewww.inkscape.org›î< IDAThÍ™ytUÆ¿W]]½fëìaK“Áˆ!²P–pdߣ êÈ\Aœá ˜iPáp%£8€!€ AE @À@VÚl„$½¤Ó{U½ù#Ò=tÐï¯îºïÞ÷ûºû½ÛõŠPJñWш§d Õ2 'MpR-!ŒIäݹUz}¥±ªdCáÞçr¼sÈ_Á@쌌ûâ{¤ ˆï9"2H†ð),gòëàêùªôŵ¦[7¿Èïãšš*ÞÎeÿ,h¢Ó1Ú ÑËdìÒçæ=4zá8-T2y78zÅŒŸ®[Ðø£ í¥õažÒ^vÇÚPçÏøzOMŸ¢Vr›RÆõ‰ž<²7Žº‘SjG¹Ñ…¶h~¿š—Ýš~}÷‚§€{làþ9Yjžº6ý}Ú}O/˜‡ý?"ë‚ò àÕÉ=sR”)T¯äîš÷Á=3=cç°>Q{6¾òHÏZ« ©ŸüŠÂR3ú% †DÚ±_rɈ¼_ÎØ+Ž,Uv¹ääãlq`IêÌѽW¾±h0³6ý<²~((Ô*htªnîé“àÊ·ºÔÀ˜UçúÙ«oí~zbLbb\ÞL;ÜbCC<(2‘±ÚNÕ6UÞDñåìº.30éݼ'ÖºO ºen§ %àݼÇ…¿´ ñª_SV‚¢‹çưޚñAþkKÓÃÃT2¹T‚²ëú&ðà°ÔŠTl¦D«¢”¢ìz.Ôš\Ÿ ™›V¸!!&pýSbHd€úü2ˆ¢#…ƒ€æPQüMëÈN›WOaH¥T‘ì³F–¬;ÎÎê±}p|È“÷EûãðÙrœ¿X—Ãá5’üMÑ ¢©Žú¼r¥Ú5 @›«ùÖ"ÜȹD#"÷æïYø¨,ÞZ¡´1ÎýÃãCÓFªpèlr ª`®¬Fui@( PH–远¿Õ;Ê»yq°À}Þ1QQ¥/Feq!8…2_éç÷|ÎŽÙGoÇïÚÀÂ-ׂ™ìprBØÐ¨%¾9SŽÂR3¬F3jÊ*`¯³‚J¤N"ºæ±à@Ku’uÇY…*ü«É¼Âf2‡ñ¼‹¸ì6X 5u~Á!‚ºw{õÔ[Ÿóλ+óÒ {HXæè¸!‘ýB88U}E-+ÌUÕ0ݪeeNãKöÎ;Ñ޺ݦlî© Žê-e¸¼ Û¦”·6¶Ó&o.êãÇ‘“ŽŠôSJñ剔ܴÀiµÁRc€±² ”“»Qœ\”5÷H§&i‡:µˆ'®Í•«ÔG¦è)ç$Øs¤eµpÔYa5™a1š Ê”.ð¬¢}]tÂÀàÅß(U‡çŒí­àl˺ˆ²rœv;lf3A„(W¹AÅ'ôûæ|ÝÐÕ!dN–$Vtî™?=qp˜FMý€¼ü› ?žðîgô{ggù¶9u¨‘i]öÍ›“49>. [wœh ¯ô–è÷ÎÎhœGVNö nSµÛ€vzÆ?§L¸äá¤Xdì9‹KWJï ¯ Q|Y¿{æ'óˆ.ý„\rìY½ì¸Ï¨©]´S3RF>Ügݤñ`ÿÁó8ýsA#BÞ/H`D~éÝÓ·4Î#º3"M¡#³wA‚aÝ|‹^¯6 hgdŒJLè±sþ¬‡ÈÑc¿á»ï¯6"$àý5#òËõ™3>hœGV¯_^×ÿ‰ªô!p?V ¾ÇoÃ@ìÔ]±±Ú¯Ÿ]8Bú˹"ì;Шw@ˆ@xþ5ý®iï{¯^êþ†1³xc(á@$]ߊ¢Ó1 µ4ãÙ#ýô%5HÏ<ƒ†žGHp˜ÀüŠß?›úžGÞ[«Æón«Ë #®òžõ× @î­èìè—Sf M’²lÝq¢Hÿ`'PDEŠ ï^ù{Æä ðkWÆi0ñˆý ’Øóû6\§P€’®1Ðlˆ™±³oÒ˜uCŒÆ{[ŽÂd¶Õ2 ¸¨nÔåro)øôñõðºå!þìÌl×wDb»”àQ€¥qZ¢;Pàˆ.M(j)Á!ú&š4Æ&ˆNÇ ~ 3eÖPîÀ¡‹¸–W¿×‹2  éÞ‚­ã^òÈY¼Xêß+¥'òºSM·|K‘ ê+G8Jã1Ä?·É.áçýI“€vÐ^ŠYöäóÃWáÛ£E10*)c¸¶ydŠwŽ*zZ>ó«3Àtä±f\F) ŸÍi´%q€*Á­¤Mbk ÷Ô]ýÆ'÷_ì‡í;OÝY´”¢G°œ—ñÂpïÊuYge—…^¦¯š‡÷•(u4»ˆ Ò­{àž)“²Û3NÁjs6 R¨P°(¸”–|½q²bݶ=ª|Y’áóI]^OÉhz(42 –þhòˆ~¯ä–#¿°ÒcPHD0Üv§Çï¬Y9" ºßÜêô 횦Aïûê;jXšõ‹Ciñö†Càärø‡Ã?D)ÇB&cE›Óå¹ÚDTB©¡¬ÆHø:°k€Â(«¹¹þ=% *B7{çE(¥ÐNú4bêôÁe¡A̱ó· W«š ¤”¢Î`<,ÔÚ–œþpŒÈš·_ê©|C?ˆ\ µD$.€q7žªjZ T؃[(àºÃÀª£Æð B¼³YŠÒ,dx_æóKš…ê˜àæ'òRÉÿ—ï›ýÞh]õúf²fc¯/cYé†xtüˆêîÅ2jô/”Yas´þK*—ƒŠB¨œ‘ì¾}®Zöj¹ÿ©¬î/^m-µËDF¬üyõÂiV¹R›†– ¸ìv˜«jn»kQöÖÇ>½“¾y6âÆÀ¤Òÿ69Úº—êé— º½¿¢8mB2,`ŽÀ5Û ô÷ޱ2…bl€JÚ&<°œ¬þ\[ €î×ç“¿s¨0j>Ó»<3Î#Oì†!œ±¸œÙ?ܹJ Hu)èãWÚœœ8Ó,“\Îõä¤í»1c$ $, Á̓R49wêÆãçW„Oaƒ+ÆzÄÊ+hêâé효bBòJ,íN`9T§wŒ~ü±Ûî>з.É`«÷%g‹b‹?]®jw+eá°Ú ‘²¿4§© VÛ¾Î1·fx…Ï@[c¬®)vóíßÿA€Ófƒ"Pý~Kcèšõ…µ|æ(:±V XíЖÄ8Í–/ô9¹¢Ð̈æd3™Áʸ›¿nLnuߤ«Þ9k2ç03T3¶n—Ð%]‚9—6î+†0ÇŠ/æÀjªmu°È 0WÕ@¡V¦¶§8}S·ß f-ÍWEPÙ>!ö¡”‚ètL|ñÀ«É¬Uú#("2•RŽÏóÜn8¬6Ê*Àx-sv‡þøÝòÔ¸,tóæ& ß'n+ñßn¯½U³¨É#¡?$aYª tñ?ºäÓìŒ<@öGžê>^á§657Ø/$8í¯´ò| ñ…ï§ò6»În± HX·2Ào{öÇ–Üc¾6õ³›núÔ‚‡8IEND®B`‚kfritz/icons/ox48-status-missed-call.png0000664000175000017500000000614112065570711016340 0ustar jojo‰PNG  IHDR00Wù‡sBIT|dˆ pHYs--BÓþgtEXtSoftwarewww.inkscape.org›î< ÞIDAThÍ™{tÕ½Ç?¿9gÎ;/ P¢°Y EJ@¡À¥Q´í*õ¶XÛ[—«-«ëzok+·¥UP ¡<*RE”ZVQZ4’!@^$¼Î+çÌìþ1gB^@€Ðö·Ö¬äÌÌþíïg?~{ï߈RŠÿ÷øC]>ï÷NçP§KŠH­iU'OTÖVV<}tÓƒ‡Ú–‘ÿ€`(Hn°ß²[†ô—›å¦g†NCÌ`wQ# ÃÒw¦¤¸¾îLÅŸÜþÀC‡VÞmÚeÿFÑð5Ëñè·ïý…ùƒøÝ…qv®ãÝ# ´lÚœÏÓE´ªOŸ Œ²ïÿ[z ÊŸðêKçL¼ñúiwöçíc ŽRv®‰K©9ùÉ!âÑȚ ó€1@0”p»K¿1ãæ÷OÄæ¿cÓ‡ x²²/ËOÁû»L·ß¿¨`íœßýË‚¡ü1údlüÿEŸïWnbñŠ¿sìtGÄ¡_ÞHn¬=GáÞÝÑòíú®9ÀÀ¼—œM±Øâ™nxâÇŽÔ~¾f?›vÀð~Ëù-x.ŸïÉk 0á'ûF«ÏlxhÊ Ã‡Êá§ËÞ§ ølóó¬Üžä^‘ïÚÊ Š?>Ðxͦ<}d^<^J¸ñ&Êž"™H¶zÇ›žFpèà+ò_SzŠã÷ZWˆmkwý¶è‡n5={úÝÝAé‘’vâb (¥Ì\\Ô”R”)ÀŸ™UÐ¥ëÀÜKS“úÕ°™ Å®ý¥|¼ç3L³ÆP¤”úƒ@_à‘ÎÖ„)úÇD´Ê@f· ]pÿªb§i°jÌàîón¾>m”±ÿ`)M±X‹·%|šMqàÍ1€©K =Àxà’³ù̉ãœ8ô‘Êê•ûRáÆûó ‹ÖûWûLÅæ±ƒ{Læúyãƒr ŽVQWYMõéRÄÅÂã¯Î}¡mù©K ››Û>3M“ª’b*‹áòúм´ï^=k‡ýüªî}áx¶&²m°œQ½»ûx}wÇN×>WGMi9ÑÆ0Êáˆk†1ûø+ó¶\ÈÏÔ%…N¥Ô#ásgÔ×å$ iŠFi8[ݘ–ÝýÃn½¯{ìÝÿ»¯m¹«˜µìX_—SvLº½÷Àî.¶¼WFIy=±†0uUÕÔž©Ætºãb&'Ø|ï;õÛgê3ý2szöwº\…ŸŸQv±w¯`úoŠnô{œïLÛ;7ͧóÊ;§8UÑ@<¡¡æ,ç*«0]ž&1’ÓN¼~ò3~m–ë0Ød(…?ÕòZJ|gÍqa©NWŠ€õ»G6=%âèð½¼»o­;¼ðû]˜fªûEðöîmb$Ÿ8¹vÚÓ""«DFëðuP ¯i¢ši‚R—Ì4´5»GôD@)¼€në&2/µ¦\ Ê¿iôíýqûm׳bÍ.jë"–cMp_×G%’ƳÇ?õ— Ä„§t€RÖ˜·[ý*7ŠÒÂc þŸÕ"î CùZN´õy÷Œrmyã ŸZ •éöbôì‹iª—ŠžŸø]ûýÕ"œ0΋5aÝJáè¢cª–‚p~¬¹á„> &JªÚm%íûóòÆŒ8V\ÅŸwX©H%‚‘™_—³G~ûżæ—EÄ™å<©Ë 8srpõïß%Éòrâ%%¸RèÖ:1KÁÖvÁPþÀI_òóîÙi<ùË×›G€(Eßlo²¶6zGuLq.¥Ð±Z-cæLr—/¥K)_´'ÖÄv_%µ7¡`(_ú\—µqÆ”¡ÎUkß#‰7;ñ¼øœ-XöÅ#mü ÐÏ Í⯕i)ñ)€ìu"~û¾m_™0nаÃe«lU¸{¯l±øVڛ䴌ãÅù«5{ýÐZ_½ Åê–åÿ¯Q#‚üïÓoàòxHï‘Mz÷nè.'n·ÃŒÅ’{Ú:Þ*â\×Bt[³Ã‚ÝâqÈ‚@0”ßkÆ×†OùèH%¾Þýèv“¿Uá¤Bs¸›ï|b϶H<¾pß’ñ%1¥¢J$¦À£ÚTt-L;Aãêf ¬Y?øüµƒ%1<Ç…EH&’S¦úÇÈGwg|jé­0SŽk$ÜÞ+©zL ¦@ †òeünýîÑÒ0‘ØÅ%¸MÛ‡%1Т¤ÂiCª¡¡KZЉ^¶·ÕšÛ£÷sé‹àšCÃá´—R*0G©RÞˆâœJ]LÎr¢€Ÿ UêífMJ…§:ßZN—Ž2XZÁÊ.?ÞÉÆTE-!ºB|h!ühD‹x¡ßý¸ê²bá0N§¾×¾÷R<MUÆ:ßWa¦|Ø>S­¿sR[[žÊ´úªšâD²ó)zÃ0ˆG¢x³3Ý|S)ÕK®Pþ(hGK)û™mâ@#P'B#€£ÀœvGÊhcãŸJ˜F :²pm=ºÛ]±÷Wã>myÿ«¦Oƒ™MPPœ¡ŽÖCêbÍd¯#I¬V¯Kùh°ÊW¹aêÃJµ •Ú¾g¾òª¦É_‹"\[QñfÒ ¾ª—×·¸£çyJõø&x«8+Ò,"Âù0h µÿÚ)•PÔˆP#B½sØ cæ*UtÁ¬D0”¯ù33ކkë‚þÌt²zõÄí÷¡»\$“IŒD‚X8BMi9(ÎÙ0«ÛÅ@wiš^Oj°È .7ÖaÄZ'Z¦VR™9@<5Q£2`],œmšŒ2­Ò*ÿõçUõÕ5šFÇ­9*='{Äå“\ Àò,²J$¨à§Üç§™³w”6@ËÞHZ@ÛðãùJ¼ìÌÜÈGÞš®­ûc¬1œÙöå¬^9Ï~øÜäNϲAV‹ä(˜¦`º‚Û4È!•UV^´øTÁkNØrB©’ÅüøwÁÄÖÈGvÌhŠÄ~©o¸Å¡;¾ŒôUž›¼ð²Ä·±ÿäe‘lœ>¥ª§V\nvúŸôÃWK)OƒlIEND®B`‚kfritz/icons/ox32-status-incoming-call.png0000664000175000017500000000325512065570711016653 0ustar jojo‰PNG  IHDR szzôsBIT|dˆ pHYs“ã×tEXtSoftwarewww.inkscape.org›î<*IDATX…µ–yPUUÇ¿ç½ûö•D \ALE ÃL͵h!³Åi&im4F‡IÇI+hÒD-±Ô°e*µÌp ‹TPT$xðTD–·ðxë½÷ÝÓôô¡ôûïœóûþ¾Ÿ³Ýs ¥ÿG2aÕ©5j½.K¡P ‚ˆØ8ŽûËemÍýmÓ¤Ãyý 7w·2éKKç%æ¤OŒP;<^œ¼Ú†ÒZ€u9q³ªòç«KÒû€QK÷¿ùÔÔèqÑÁò &)ª=à…»ë·™ZÐTW»»rß³Ëú jÁR¾}u^üÄ=G*qÙÌ `@Ø=5uå@”Ög€‹÷/X>'® 62@ùvÞïp³^Ä&…D.»§Žu»PSv¶ª×³òªe°;?×KØ%m­\®0¢£TO¼0@‹?½—çQs¡Th3·—ǫӘ1!ß0,"\U<éáÐ#%õ(+­¥ ÄJÉ0|›y¬#wöÖʹ”ŠvˆÖíÆmCµÅi³^–+eïUfý<À5\ò‰!)6RS”8}ö®‚b°,…Z "%g¯äÍȲþ­`iZ¹­`:/õ)l?—ÐÍd}Cªd)¾b„ÏÜ«ztÚðÏΔբ¡±¢÷JxvN»ùz‘Æ:éº}ïFp*{dæ7Ä,·Ï¹c (Hš9lh¸úÃmEЇ‡B¥UC­S˜Ý!°xG4Ó0Páu‹‰àz¡jd¶Î&Õòb|ÎÓ§Ž\[zÍ„¡ÆÒ1¢¾i«œ´ºdÝ´ù¨"g{¾ö–n¹­d lˆÐCîxK(iï#à1CÄÛžáüú/©‹3& .:ß„.ï C¼nÏ©«ŠGº>xíö<¤qKÓÚÎÅ ¿‚3àcçÿÆHäRÐVAϺÀ3޵/ÌT{¿*W»dñöŠÁy!/Ÿ§êxVåF±¢»Šv}”jE„ÉÆúJAÇòÇÜž½8A#üØ d¥áΪP§5{,[Ò{õ9ˆ ·ìþG D&ïñø\»åX“q©Miõ¯{€F³ýlw[¼‡(­ùoÍÍõؘ#Q²ÌK¬,ÌÙ7€¶ë–†ÆnÚ,A®Xyg?ÍÞj¶*Å˳.zY•˜ë-¡”bô²Ce<Ï < ­Ë¢¹î8Ž«ºRðôðn ¼»:bUÍ^·»×0öµŸvÛšLY‚е¹Œ“i‚#Êóë~‰ú>?¥‰oü’̹Ù÷]6ÇD©RÖ ×ª_/Íqøú>Ç?z3œ‡zTIEND®B`‚kfritz/icons/ox16-status-incoming-call.png0000664000175000017500000000142412065570711016651 0ustar jojo‰PNG  IHDRóÿasBIT|dˆ pHYs;Ù=tEXtSoftwarewww.inkscape.org›î<‘IDAT8‘[HSqÇ¿çïÙ\óºÙÅriM…)X¦&ËŒ Q ‘4{(ì!|¨‡žBº>ô’„y3‚®Hf!f¢9ÍKéÜÒ9wÔíìvvvÎNf)5ó÷úåûáûý})I’°šÓ=Дîjñ’Д ?2k6=í¹uø2µÀ¹›wxP3² !n_àóx`5ŽU®(¸Ô§Œ÷¾2|c²’›tÚeºåû¨…3W4˜SvjFºú­Y& ˺íŽ:îEÝË:%?ǽÿ'àü£©m\XÏ'SÜœÃÛK¥i>vDÒs>Ï]æÇDÃôÄX~mQÉ_N×Kã"_¶óø›3Þ¡ç‚%]– ãÔ³$5ñÔÞ¿×JL–žµj6רo<ôIK[Ô+ö¦oy×ÚnPð2Eo„„ƒÃáb—úk~ÍJ€ßÎÜî{cœÌ™ñà‹$:÷[4l“Ør$O¦‚3ûu9¤íV xz‰wHªG@ùî«VÆ™cãi·_I ™û•À“ÜÓq…S#¿K’ø¿€[–íÀ  ØiµV5Ÿ«®<ºâèë”æKíq?¢i¹ëzêc"žˆIî6K¡Vªb rèT  ÎÊÃɵäëqØQY|äDú\Ù§®òÅõ‡€˜LLʯ)“اÓ“úOÕ R´è• B„V†sf/ÖþÔ„Kì¸2£êãÇD‡¹ù@Eÿš,šßº®{IÍ]3/jÕòÞ›‘…©·wƒÝ#âxNNBe#‡]'ì¥ös9µ¯¢ ì-ÿtvV+þëY€”{Ödýge÷ÂÔÑ=QPâÄŽbª›½~qI’„c»¿‡FoXQ²aÆC¿.>¼@Va¨Z¡~vöøÞì´Q7`ßñ:¼¿³6¢ ˜—ç<8²k5Æ'®(Âö}gÑ3ë&† ŠßR%…?ѸôäÇ>œú«,Dq‡iy«‰ŒÔ¾ùúãC4CúÅãƒÏ‹±dÓQ¸9ºpcÐÉ€1&Ƹ8âh²} 庨€÷¬%iùmÇ-ž7 ‡¿¾R€²³ÖK6qi)ˆHŒ In»¿ý é7̽æÐ÷Á­Ù CV>3sPôìœLì:póÞøßÊN²>Õz=t‘p9ìÿ¸fä˜h¬<]©}tÌØ Ž0àÑ7 ±}O|U%!¡í_¥ÕÂZW—vMÈùOyw¯Z³MôÚ{9ˆ ö5Áyþ8¼6{»>.› µ:d1xÈ >øQÅOä¼SÖ›ò|¡œ¥½"£´ˆÖÁS{®ÃäÀÕI»?h®­ÃÜ •^_ò»VÀÄ¥§‡()¾ÊìnŒÐËÑlñ`ûÎb¸í®Î\y—Í~@?Š`b°6Ô£´è¨´:΀¨;· ˜ü^y¶RN¾k’qX¿PJ°û—*8ìnßv2TšPñùýŠ’&¢À³öO% •GãØ;¡ +7&'¦ÞœWÿ»<§/;=S)—/}sœÌ¨Sàp™Û~ª‚Ól…¥®ç… h‰ÇB¨pKù–K.ç!³¸ô:ÊŸþ]6+J÷ÂãtÒÈĤ·J6̘±íªßS—Ÿ~R¯–¿:zpÑ©e8xÊŒ]ÏCôòà=8×… vUÅgÓðÅE:Š2÷Ë € Wg}ÛPsêÌçkaˆŠ)MˆŸrdÕÄ—Û\µ ™²ìôkázåÿ•‚EÑÉfì9\¯‡ƒËj‡­± N‹ (a(¡ÒŠϦ¿Ø÷pSL£‹Ÿ /o£”¢©¦5§NÂe1CU®3„Í9¾~êŸq^ †› d±±ÝVÆÕ3F ŽƒBÆ °¸ {‹!xypNìÍfXÎ׃‰•S"ˆ Î|6u‘?ýŒ}ùP´ÓÁ=í²Yú»¬Ö4/ç‰òºÝ•ÄóJá]xô’CïŽ>ÓGÈÈYV«QðŽMÝcucïº1,KðÃá8ÙQÀ9ÝpZm°56ÁËy!É•”¼ó+>öVHé"B:ä½uÆÈþë´nú¬‘7Æ‚!;Ôá×Òf<¯Ë·ÍG³¥%y…š2¢÷¹k•<BÆþ·LIñ‹~=ŒY#Æ‚RàÛ_jq¤´ÇÃëöÀípÀi¶‚ã8ˆ e%þ¥ŠMS^U $óB@8³cmz¼úÖc!QŠ/vŸÁþ#gá²´\q[c,u -É+u”Hüë'凢ÿ`’ ¸qîö×cuÑÇí `ó¶“8xìDž‡×Ãsº ð<À0Õ:@äß©Ü8é©Pô,‚ 5wͼîÝ"æO×,CðÉÖCع»’ @’.[€% D„UO|,Ø~C… HÉ[=!:JÿÆãŽ„J)Ç7Ûâ»íGÛ¢. Dä×W~<á¡¶×ɹ«‡êuêõóþzc0¨±§° Ÿm=ÔÖðBò¼›+?ºgº/.bzi/1-:h,Á Òr×õT+å[{d„26Æ€_TcÝÿ Û‚!„-U&LðÅELË·©dÏÞ¬dŸíML³^$ž`à÷-–»!–°tÛón OMŽÂ©²:|°úHWnJ‚!Dðn©ZŸ7Þyñ­÷cØ1£˜¢M§›QmÔ3°4‡_7j­„ÿjú¤¬”~}’P]ÓŒ%Ëv‚çÅÖ†„ " _T­ï;ù…¯<¥È{DÚSŠº/&C2G g º,Àðá2µŠn7öÏ7Ëê†F;Þ^ºOëÅK¼1 D¶V­ËÉõÅEL¦ÉFÅÌ—Éþ}hü.»å ˜‘•H è²gªß:4cLöè~°ÙÜxë°Ù=W°1àÃc@Dá˪µãr|ñÓóCôÊÙëUÇw’†Ï&þæÊ*L!8tI€”Ü5ÃŒM¹w0QÂ’e»ÐÐÔzŽ0  " _V¯É狇,z2U­˜U`¨ÚÅœ_7õ ÿ VºF§ô¹o“N.g?|èþaD&c±qsÎT5¶²! E|ˆ(~U½z¬ïäMÿ0*Èä#QMEòše“zÅ:÷õZN¯ëµ¼ìɉ á(:x?¶Z¥ahº%Aâ…íå+Fgûâ &Ã2ãN$p•ºêÿæ¢û¹6tøLÎ[=²WFüœ;†gâ|k6üܪ‘±%$ÁËÇÊ–ÝuW{<„ô>ÚñÄU½};àÕú¶À¸b:áñÑJ¤j@×éò±ÔÈ£ùð¹ŸÞ®Ê]©×k5>0}(ñòÞ[¹÷ÛSJRk!†E‚ôLÙÒ}Ûã!¦ß%+S3Ï.΄d‹h7JG©„hf ÀG)(Dd´ëÜd À7¾¿ÅŽ>ú´iÏ™#²×fÜ{s·ˆp-V®Ýƒsµ–Km‚1’R œÊ–Ü–Ž¥¾9ˆéíeÉêAwÖ¾“¡±ãͦmm»VסŽôωØvGXŸc@úø5w ˜2gðM©øá§SØ[TÞª]Á»A ’øG)…ÏXdá+ÿJÒÜúpýêpx«R‚H#8PÚξôàO¹+õÆíªi÷Ý‚ªêf|üiQ§¸Xâ´ÌÑ£ïŒ\á‹”˜L“ã5Ùÿ¶lÜÇ;]½¾ª ð1¤\†6xˆlñÌ)C ËVí† ˆmœ"b# —¼/ú"$¦ç‡Äh'~äüÊBûC[Ò~ƒáÚñ캕)9ëöï“ôp¯žñØùÃIÔ7´ÝÔê5`å2±ðÍ;6_ÙFLó#"ÔSw{ jˆ­`X°á¶ã«\!+£ÏåÞýg8]¾þ¶õ†B­Abj<ÜwëAá[ì£:7#³|ugQ‡2ÄøŸ/ì8u`vñŸäñë3LÎë–ÿm.‚ËíÃ2‹‰FdbÜ…½y –^Ž;ûvEì–y©u­Ø¤ÆåbaÌÝ'Øú €ÄŽÐkñ "êf@ÓØò§´µL€×€© †„wHqI–ÐåŒéO›8YãAꀾPi5 ­Žfˆ`ªÑ—³døóœ*“nœ(Í­ž,z!;æöÙ_GYT¤q¯ˆ8 È]#\6ý%-¿µ9ÓÙ…„™‹cmáq‡®(À’ ­§$¦ ””Rô¸gmLFF|íü¹w0_žCÙYG§Žç…¹®„aŠë¸©"ÿöK71½ôP¼fæžuá0Ñû“bHÑ2êÍÈ¢ùØëˆA¤ÙÃGögÎ5º»”<È” 0, *I½ãì쇗·Ñü–׺?~I7£ú?‡¯5ˆOïþxfZö—˜ýr–+Z&X¢—Ÿ4ôŸ?Þ{y]ðÔ‚j×ÖÕ‘ÔA“Àûô¿ »Ó´?­Oÿ´~,Ë ªÎ音R Î툗ó¾à“ËÛé‚¿Ï"¦»¥Ï»mDõË©ðZÚ‘ãFŸ…2£©V€T¿bk‰hlѾÝÉ€ŒÈ³cÃÕ¤ºÞAôoP’+›bK¢Ùgö—ÃŽ­ÈÞs¹ Í`$1}R|ÃÓRfù íÜÊ 3*£ºSÀéûãê0:ÿ®8P Ý%w#“eF•°9ý/S™B€  ‰çï°§­eqßR>ìlÆ3ˆ/[”©½®èÆ-4Nžß†0L†FÅú}õ€rA@° ã³Ni~¾D•;zžf,¶O•¶hv€a&Ù͉(¯íÚè%.Þ¢ @"h—„>õª]”Ú·B#p=æ—íUC²C¥fÔ4ö¸’+Z&œÓ *bG¶ôéWªxqÍг‘J1mŽïÙôï ÀÏõf.pH‚Îã/ó.ëÌœ¾ðò¿<¯.EK»O« ¼ßi¬®±pÎ@–ÚZ ð<ÜväJ…»tåĆ®øÐ¦­N÷s­ý´HÌ=pß¡£cTK+‹OŠŽfKçÖ> x½ð8œP¨T_ûãGMÏ¿ku¯zÕ=DŽäiU`õ׿»æû7²j”jÕŠªâ“hª©õ›ÀÞd"±’z¦¿¾4ÿŸÏ4{6m8ŸZ}:1ˆ{100plÕø9ƒþx]y%Î)†Ójë’³½Ù [CT:í®Ãkîò’€.øÛTŽ›«ð€Ôm „#\:'Øgî&òN«- ´F Q‘Pj4PjÔ ”Bོ/[C3+d2™ Ž6ÄYz·/× Ú”ðÈ7«mM÷·:ßÓž3!‹‹~àл£W]¥ø®:|žô÷ícmM–O¼nw‡Ÿh„EEîúuùÝ#®Zt¿|¾ž-¹óëðh]œ1&êV.óY jÎlÆ^Ýð®>:=+Ü÷‰ïcY—ç]¯‹û çv‡Ë” J«.“ÒÆËÏôïûÕëÿ“-U]°ê†ÐIEND®B`‚kfritz/icons/ox64-status-new-call.png0000664000175000017500000001325112065570711015643 0ustar jojo‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î<&IDATxœíši]ÇußÝ}ï»÷½û¶y³€Y@,ˆWP ÅU¥Ø–åPKÀJ$™±*²”(Näò§TìT\*}ˆT.;rbÚ¢¼”ˉµ‡Eš‰…11œÌ‚7ËÛß»[w>¼8”A C“&YÑ©ºïÞ×÷v÷9ÿ>}N÷é#Œ1¼›éð‚J‹> GæŠ-¦?öí«Êz y{Óé‘û…-%ü“Mx©¬à)Ø*$›æÅî$U  €<ò)lòÖ‡Œ¥6å?ëÿpztŸÈIØfÏ£÷‹¾ï? €Òd€ÞÁ=¼è3øÎ¯ ñèýôJÉ#Ùóèý¢p¥vß5 ([Ý,wÛÒ>=K ä€ÎU;äMBÒ) Ù}Jˆž]¶¸Yî¶`è¸R³ï&" Zw›õA¯“[1lM7éòù5 %r]]kY‹ TôÃ7ÇûÖßn}0@|¥fß5C¸è7‹;>1ðëÉ<ïC°(t­w6awSXç½(ïq2ܲ󓽿…n˜JWj÷k½_¤ŒÀüØàÛ’&š¹Ùc«nØt×Î}îGþô¥¸Ua›(ììB@½xfX°èNxô÷o³¶6æ£zñ ?T’”x3BįüÁùÁ„eº…2Y%TV “•Y%eV`²ÊY)DV²Bˆ,€1¦b mL%ŽLEÅúª™¥æï½}ï™›wŒ¬k–« ¥óScóÇÆžvÒª°á¾O}âõg°áü÷þòU/ÔÆûvì̬^—Èw÷–Ïœ8þÜC/ÿ7àYàØà×þã ‰’ÍfeË–;sžµ§/ŸØÞŸ³¼\RáØÇ8– aI«ýl+‰mAB l)ÐÂØÄš0_kÂ|¿A|ñEôÌQ6õígãÎAIÐM‚ú´N¤º%*óÚ ê&º9֔ɡ$2&`áØ{è¥o‡…áÔ­ß4õ«`ø#XŽuo÷@áú¾Îë ÞÚ|ÆQ¹”$ë´…½Ü·Xƒ6hÀ0 €hû%c@,U¦]. ˆ¥ù$kçHÎg÷ðcl¾q#ˆôÊGK7™?ú?ÿÖùÿ1†nû¦i¶»yÖôÏWGqüIËR÷å:s;:û ¤Ó)Œh #$BH„’H)Q–DY %ÁR¥J^ºƒR¹ô,—¤×Æ´‹ ql0Qˆ‰Z¨ † ª¸iÒÍ1nÝx€÷ݹ Tîê…ëŸyèé“õò·€³À%m¨ E늓hë§ÿv½”ò÷S}}ÿ4J†B²”'K¤œ:™´‡ã%±ÝJ©¶à!hÿ.‘XvK7ÑÀÄ´uCÜ`ŽTíe”¿ˆí/b‹t{“l¼v¡‘:n"íþ«–_GEâÞí;Ö~4™(?s`aTŸ7†y!˜G³ø* øÐWÏôEAë{©¤³'ŠC,¥° 4LŒN°0;O:Ÿ#•Mãx)l×A*…R¡}¬„ƒmÉe£Î«5@±LR-1C¬ &ôÉ/Ÿ×Ï7›óf¢2ÅøÄÓ<~€}õÌG]G|sUg"…„Æ T{DãØ„šùb¹Ù2Æ©$‰ä+ôæcú:®ÓÉK††z3¦Öˆ©Tª¥:NÒ!ŸuI$ð›Qè$6ýc \o-TjÁãÍXOºl„Vq,d¬Òh¡c-£¸Í¹ÆÄRcL:œW«›'²¹`ÆMªz¯ånõkSÁ­xÃݧÙ{ý~l+X6¼T¾ D\¸DÛì.i—Vð$ùN^8u‚VÓ³~a¤‰#s™öIxèZ°¿%hâ-žccY¯(OiT*Ǻ›‰é£?æüØ9Çafj– ë7Çš—Ξgמ­9~â'Åq’©$FZ­ÚÍ "òœùÑQHø\wÝõ(KbŒ!‘°Ûö@ÙòÝtuwóÔÓO³aÝ:JE¢8¤R®àû!¹lŽB¡“ýü_Æ6|à7°œ$É„E‡ç\‘¿œgÅú‰ŒÈ[®V¦M0Ô=É´…e]9Ò•u™¯¶(Ç.ëîý gŸåÿ#ýlÛ¾´—Áq\ÇahÍ ¸ëŽ;Ð:F(ƒïûd39 ]dÒ:;»¨E‰p#%)Ç¢3ã^ { ½…—Rô¬D¦àûa!ë*lõÚ3§?Ÿ"ã&¸0_';²›ÌЊ/áûO¼@2Z »#O?ÅÙ9Ö ®`b|‚©™)¦§§©·îûÕqúÅQNLfÞÂ+(V<ÒîÕ°{åt¸×üz%SàößúisÓÎ î‡oø¹ß`¾Úb¶Ô¢Þjç5£i'ëó„2q³Ï¨’ìTÛë$Ù½†ÖÔ)d¶Bw½y÷uGýUÂ0´îâªW¤R 1$_c ü,¥:’¬éHRm…,ÔJõ) £Õü,ì‚vˆ-—Jßq…t‚Œk¯„=B fù¹ØUЊHXbq¡¤òW¶A¯IyÇfMÎ< =WƒXDz©]Ùö$oèÜç*6AIWRgELN-6FzV11[cÇð?ô0Dòf¦).¶ A›ú]ÔkЊhùá5óSc?8 Ä…™t0Ü›¬J¥Œ”—’–¸tü'²ýÜ.{åôIH‰¿—Û¯ªÇ²>$r©`„(‡&Si‘ÐÚƒX·™®Ú®ÿà×™ëm¹idÚÃ]ºìIJÀè²ä‡+þ£ïVXWGÂýÀ:®˜þ³tÕ:¨ÓΊvYo'Ùòêw„W@=ñrSÞ²äÕ»Á«À(õ® oR¾kPoùŽçR(ëLA¤9t¬xÕ+•«–èù?xÔJØSoŒ­2Ž¿0õå{»^m­‚FëcÒ¶þ‹Žâáf½¡¬ùRÉ¿çÿ…hûÿKù@òRÙåç¥wR /%V.óÿRÐÎXYÖÞå6–Êäå÷âÒÿ8Šâ±tÚý2\}pøMÍ7Ò;R¿Åô ÞnÞnúo7o7ý€·›·›þ¿àÿfÔ)¢ƒŠÿÞIEND®B`‚kfritz/icons/ox48-status-outgoing-call.png0000664000175000017500000000550212065570711016707 0ustar jojo‰PNG  IHDR00Wù‡sBIT|dˆ pHYs--BÓþgtEXtSoftwarewww.inkscape.org›î< ¿IDAThÍYytTÕþî[çÍL2™ì 2Ê–DAŒ¥‚ dT¨Em9M .ÇÃiKimõ¡" *-ƒ•]K­h“Z•}5Á1û¾‘m&“Ùß{·Ä`BfBP¿sræäÞï÷û}ß¼»¼{‡PJñcÁŒO% Zi ËqIœÀ›!VUQò+ˬ õŠ¬Ì»>†ü ˜Ì–q1¦¸mãÇÅ͈1Šˆ2𰻜,j‡OéÐwµ¢¬ÍvµþQ§<ïÝÕÎXî͸O#°™¿~xê]Üc‚NdPXïAö%ŽØÑõ«ü‰)˜æÑ¦êʱ¦t¶ÿ OÀd¶,ÔKüæ%÷Œ¾`æ|QâC^µ µ­^ÜHMåå‹’j§NË6’Û­­(°ìRâõÒW“ãCžMŽ7âè…|}ú¨jnE”Ò÷0 À“þÖð8(:w„0 úÐÔA3°bg§*Ø9mløò1ÃqäT-.äÖÀëvwaP‚+FWðÄœOÓÜ0c¡À,7œÍWËKQžw‘£cöî]‘ Ò>°âÝ2­Jqhú؈¹¦>>U‡üâFØšÐT]€(„"£ôŸËv\?cáh‡Œ¹¾OUU4V”¡¡¬‚¤-’ôA¿¹ô÷ÅÙý7m`éŽÒ0†#©É‘Sbõø÷ÉZ”TÛàhµ¡¹¦®v(ËzEy¨ôÃå‡ûÊ3c!G)}ÒÑÚò¢³Í)û|ÄërÁÞÒÔþUhìgýeúùëãnÊÀâm%ÃŽdÏ™›npøx-*êÚà¶;`kl‚õjTNôUžS~hé—þæ:k\HdÔN s·§Õöǰ…¯Òi¸/N ÒòøðË*TÕÛáq8aonAkC#TAã%м üà’¬ñšÄs^¹¡× Y÷Ï£XìÍ*AM]Üí8¬6Ø[­PEÉKeÑ­ ÀÀÄŒ,­>H{dÉÏ’‡Kƒwä¢¦Ö Ë§ÍEQ¡jt>(ò²ò}t+DwE@Lf ˲ÌÞ‡¦NŠ •°ù­ÏPXTÿ(’^&ŠüxÅþ_l±½!Ð'°eÙCSŒ‹7ßù¼§x]°Bd_FžŻýIF6‘! ÐÁŽbº.ðü~•0™-/¤ÍOΘ>5»÷žÂÅKÕ]”Ⱥ…(ÊÓ{½íO>ò2 cÚ¹bÞ¥)àyÍcKï€_LfKúÌé ¯ÌŸ3‡þu'NwQB ¢Ê™{xÃßÂ'oñ޳c 7ìàÿȧ.ß&³eVÊ„8ËÒÅ·“ìÿ]Áþ{¹»øàP…(òs•ïßÿz …ï¸7]•ymI-oS‰vxdYOÕ€Él‰ùÑÌàÏœ/ÅÁÃ]6BB ¢ÈÏWþÃüZ …Û›"ax(Šžx;ÌrAÆ\$ëIè 0™-Œ^¯ÙýÄ#3‚*ªš±ëý“¸¶ç©E~±ò½´MŠB,d¸áš`&ð}Ìb²Šðþæéoz:ýÁÉSyŽÅŽ¿…ªÒoµhbcU·Ó½¶r÷‚ þ!„ü b¡t®6µ, €|°ƒÜÆBã 7jéB~Õz}•0™- S'È[¹lº°él|Sر\†@ŒJeŸokÑö{V“õä¢ý¨#˜*ˆ#£™frͼ ¯®íQTB¡9ù’óL{FåÔ€ ˜Ì&2"èìÚçæOÌúì2ŽduÜæ©¢„F@CÔ}ÛîNÚ}ûEïû1*/¬â „bpÃ1¢2çìÖ­ñ„Cs2r¾û =£tq©z !–eÖ,OŸ6±¤¬Ÿdwˆ§„@ ƒŽ'-[îN(¬¤ìp&ÕÁ+YPc¸Å&` ©Q‹ ¯Úh{ªèÙ¾¸Ý&±ÉlIœ:æåð° ì´¿6i ¥&ÉŒ¬ÜÑ•O•mž~Á­k‚{RØqMèöq}ñ®0™-dèãÞ´yIÜÎÝÇápz®‘$½-‡âümwt ¦ê­½SršàœØÄÑ­ÑÛ§-èÓõ üßÜ ’Ù盹ƒÔxî§„r4ÀŒ‚e4PÂ=°¿¯ØÖ­[j‚x.‚ÊEŽÕ¶Ì‚>¯b€µÒlƒŽG}‹»?^Y蜭bEÊd+÷§E(A¤’3ñÝt‡$EðBRÈ< ù®\ÑÐ] w^ˆ¶Ìâ­7Ô$jø8÷ï`ư XŽƒ"û@)5Ñuô¿;°­ë?«ZaØw6¡µk›ä‰‚>'®Ü†=öÌòüÒD k(¬²û­‚øŽ ŒÀsc¶ÿ|QÊ×ùºcö§Ë—úÇÈ=öu£ß…8‡ÛáÇñg"ôzP¢B£†CÅÇ©šûêÊ™Ä3mÍe>Ùÿ¨( _fò‡A½D­ëíw[hª­)¹¸{åÚ»àó†Î.ö×§ýãgìzë"çZí š}Sš3YÀ¼ÿ 鞯?ýøøÀØÜô” [? ¢›Œ™6‰¤dçMõôH˜Ê“'Êï hË'Îh$òÇ4{ïòÎŽnνLÂÔí˜Ñ(§е;q¾ü÷•i.‡VêËõ.ïèÒ9{æªsÀwu×ßÊFcu%î´ôÒÈ‚í_³¬È€|þ@ʸü¡eßX9kÜ–WÒЊ9Oñ´cYþdß²r›¦ýÒ®Ô:7hÉJáT `¡ˆÀ%ÅÅJ½6#ýøüÛ½yƒ®+ž3÷Õ’ÿp¹6€éö¶‹eÍÛôú’$4m¯[$/C)Ü–…=î\â6Ì8Hh¡,6¯QjC_ˆ~Ïœì´íkW?8w×ÞÒ«Î=éí ¾òÓ×—\AÓþž¡iyÃEÈPŠ¥pk([üéœ@*­ÙJi.X_"ò¬ˆ$8¯µøO‹ž\ö@ñCg¹X^Ú ÌvP Öî]|‘í©0d°R¸M»e}uBáI(È2•Â/þAd|¿>`ÐüG&ìimëæHiˆàÈÚ#HQí#DŠJ-dY¸LͲúKàu"ñl¤^pÚa÷AM³]?&'0¥0Ï»gß1”= •5\JÛX±ó«ï#"|3ð(…m€CL’´X&ÖÁxès¬Ú·ä{ßž»hGà0ºÅåq#íøù­o¨Mƒ—R$Y/¼€wéÒATNŸN²®“Dað±À縋îv$žÌŒÖ¬¼¼¶„²‰¦º¶éÁçiŸñ˜={ÜË.=}2ÃÆŒ$-; [²gHw{ÇÅYëÌ'æ¸Úâj‡ß©(b烂ZmÊw|ytþˆ{»môÙž1Ñ´‘fÔxmöúÒœ8cÞ7p§b½1€ã(¥ìy£†¿ÜkôoÒátÐc©tÃŒl^ Ô“»D·E £JQÿÜs4nÜ80ç‘ Ç‚8`w»]¹ÁÞ¯‚Ýá¨nÜRÊÔ´wº Ð 8Âa‡o»$*î8$‚-N(Дf³U}ÖÕ¯’ˆàp:Ñ#º#þiS”·‰f`¥ˆ! 0aÝ*Ë hÍÁ®ã7*€¡ë€ªXcY=Àꈶ=1c(n¼3±É‚"D °V©¿%þkÁ¶´Õ7Þ «­ÃrºSŸM¼+u¢Ö7‰˜±)Go<ÂD9nÝÄn§ "t©x¦ï4¥¿õÏ“Q#:yð=Ãpy=‚¡ë4ÕÔbFù…Àâü¾P"";E¦ ”$Ã/8!mq€h¬S„nè5`Ó(øÕË2¾`+3iÝÛ%¡–`±e^-‡Ýá4Ò2³s˶=ÜoŠÞÕ4G-l°ÁR ò5pöPPgÂqàùb¥.õw=ûÂ…dÚ3ï> ‡#¿é uÍpº’ë“S=ß){ùÑ7¯UºNDä·"In'P48áÔ*¥Zc5¹ñäú/2v©ý}IEND®B`‚kfritz/icons/ox22-status-new-call.png0000664000175000017500000000237012065570711015635 0ustar jojo‰PNG  IHDRÄ´l;sBIT|dˆ pHYsaaÁ0UútEXtSoftwarewww.inkscape.org›î<uIDAT8Å•KlUEÇgæ¼ï£½·¥—>)´¥5¡€P@Š!F ,p‰ÆD£ W®dÅ„HܸpaB\¨1jŒÄGЃ‰ ¥å%ª­ÔÒ{{ioïûœÛsÆE ŠbŒlüg&“™d~ß2ß—OSJq7úú)M …(t'ƶZ™“l£LuÛ{J‰»¢*¤9µNÒ÷¬v^Ôu†ZäË5@û¯ŽOì×´D‚-Õµú^ ýšjXݶÁ[(NgÏgO\û.÷¾á0wxõž·´æŽ¶•Ýk»º:Üõ©s 1"×ÄÙåX¢E)¥Ê^écÞŽ5˜®Æš;š–žPWµÙŸÇ«Ù©ÌèÑ‹ûu€Þ}oÇ¢©ÔQ3‘ sÅõ¹ ùŠëèDI4b‹êÔæÛ›n¬0Ůݽ "7}iZÒîž95ö™£K{ìHz¨3ežŠDu£Z ¸’¾u‰F°!âÔJÞ╊Œ‡’AâÖ&]Ñw7÷¶N6mÝ8¡Kkè+ >I¡°ÀçúCâÚaÝ_¬r£®1Üe1T„ 5{£öÁÙËù¶Q ]×jKÆí^)ôˆÊfOùÓéG¼—ºªì\)lM~#ð4d؆nèâëõíáWF+ƒIÇ4–¤˜¯Q¬J¥@Ýó™›Ã Š(‹2ÆPü º0ÙÑyœîÖ)Zš§¨Tã|5öù°‘LGIŸ/x ¥Rà8*òó~%Öu…¦áç&é ÎÓ˜òéïë£îùürí ¹"ä‚•ÔÊ1ŽŸ;ÈîžWOŒ?­÷9ß2"Ÿ%]¯\–É¡'ï÷ª~Ü”ªºPºè k¦¥Éi‹Ô³´NÒßÓ†c[©Qõʘ†NKSæâWw^ãZ좘ø¢ðà¥tiCÇLAh³ÙüIqîÈöÇç‹þÞóùMo>?¸ÎuLÕ7‰.œfÓ½›;;†ïù!Ð4A.—ãâù mÙŠYNO6QênþØ ëîKÏ™ƒÓ×ó{Ï> œ9¼íÛ9c2šŒç2dfL2Ù ‰¦FJ•¾çS,Èf³ÌÌd¸‘fíÝ4ßÚt¸ð·’¶,‘Ô…FjýCŒŽÒÖÚŽ ‰Æ qŠ¥œ!¹v+ºÐ‚ä_9úŸ7ϼñ£»²}U<æ«)d&ÙÞ—`1¨aH‹z½Žm;¸¶ËÈL@çºalCÇ4Dü“Ó¸n¦rG°¨È퉘)b®N è{½öõÜU’Æ" Èû ÊU“ ;wâÚÆÒE…Íl¾¼#øÒÕ)¯½'5»¦±a…Ð Wv£è¦â¸¦\Jðe)Ù ³‹j©LžW}~1ñýÕRÁ6%޵4mSǶ®)±o-¯†Ä±eÂ0oÿ®ÛÀ„Êt¥ˆ+@-;R(–Ç-—·´l_WXÿVR¦Ã@òªµVuI`HüšFÍx†Ð*–Ä”ËX†Ä2ŽeL -LÓ•ø#Þݶ¦Ó]·¦ÿ ü;åÑ ‚„¨IEND®B`‚kfritz/icons/ox128-status-missed-call.png0000664000175000017500000002560712065570711016427 0ustar jojo‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsxx×u)tEXtSoftwarewww.inkscape.org›î< IDATxœíy˜Źÿ?ÕgŸ}a`fXT4¢€Æ(q‰ .C.qK®7ËÕDo~Ù¼&MnnVÜ5&®£ M¢‰Q¢hÔ Š È3ì0³žµ»ë÷GwŸ©ÓsÎ̘aŸ§ŸÓ§»ºº«ßï»Ô[Õo )%GéÀÓŒ¹u§—Ç#ìm0Ð ìš ‰hôíÖ];Þ^|Ïg?ìûŠ£8p4cnݱÀ3±žÅ#Úšvµ¾áñz¿ýáïgnÚÛg8 €@oxåÌ¢Aew‡Š OBˆ½­'ÚÞNÝâw 0´´jì¸Yoÿü¬Æ¾Öqû‰Â5µ£\>xÔˆ›Ë«+«„¦¥¯.õ3fH¿'ÛZ’|´%šµ^Ó0XÿÁ{´ïn6*ÃÇü¿¥^ro_žë(Â5µ!àzà*MÓ¦T;†¢Aeø½‚±•A>Qb|µõ[ò¤]»­%ÉÓ‹šy}u;†Ù;¶®]ÃÆ˨1êÍÒʪóß½ë¼D.Ïx@ášÚðàV Òë÷3òøc™||žTÂäcòñj™5KÄàÉ·›xee[NŒWióÇ«hXù!eå{J‡T[ñȬ¦Þ®9 €~¤pM­øð`8@yI_½ú .:µ‚ª_ÖkºäOïïáÙ÷vM˜{ý +?dóÇ«(,+o*©¬ ¯xxVGOå (\Së®nÂSN¨ä ŒcÚ#ñ)v}ËžoÕu°´!BGÌ 3nÒ7ˆ$Lú‹ë?xíõë(ª¼¥¸bðèÏÊj¼ýsË#“Â5µ¸¸0ñ¸ þç‹§2ñ¸ŠT¹Í»-¦¿U×Ά]ñ®Ñ'O¤³¥…¶];‡z<žåX±…ŒtTì%…kj>0zhß½æ.˜ÒÕ¯ßã‰wšY\߹ߟ/°lÁË$ãq Ï«{úÚ«3•; €>’mço¾•¹ùŠ“¸òüqxlUß°­ßüi5«c%È·Û²c;½µM*wͪÚËŸt—9 €>P¸¦vð0pB^ÐË—kŽç+5Ç“´,éöæ¿þãržY°–ŠQ#)«®< Ï °iÕJW­ ÊÓ+F…Ç­|äóÔóG}€(\S›ü/p ]0e?þêd*JC˜RòÈ_V3wÞRb €¢AåìyUö‰ãiÞ²‰ÎÖoë΋€!êù£  ×Ô^üURàö¯Lâҳ©óõ[ÚøÎ½oóÁš]©cÁüÕ+<§úw¨ ´4µim™vDà‚Ÿ~4!žš‘ò1ùÔcÈ+ÍãßkZèèŒóÊë«ÙÙÔÞ纓±8þ`°¿y@(ÚÙQtÄàÂ_~üuw !|>Ÿ‡ü’Bêv%¨Ûe˜v¶uÒ°¦=™›ÊwS"'¿?¸Ÿ)Ö‘>0uÄà’»×j†!ïnB°»3Ns{”93"Ú‰ÖÚ̾ Ì'¢Ùçï ´gû–Ô~ /¿óˆ@ͽkó±;K$ =AQ¡Ÿ¢BªLûŽ&ö´ô:ƒªWjoÞÃðÈ}®g ¨u×Nvmêš8œWTôîa€Y¿YW ¼ˆä“ J ¼x=]Í–RÒ°n;mÛ÷ù‰hŒXG'Á‚ƒËè‰u‹ÿÒn¡‚Âx¨ èó‡5fß·î$)yɰPÐØê<|Þ®éYºnòþ 4ïlAʽŸ‡ç¦¶¦Ý‘`A~^ï%÷I)Y÷þ»$¢4‡òaï\ñȬ–×?°~º´‚;…CÊ‚L:® ¯27¯½3Áß®£©©išÈ>ÎÀÍ@:ððXaYÉ3ö~iÏ— <%b1Ö,z‹¶&{ÜB ?¾òÑÙÏÃaê^ñÛõ7HɽRâ?ª˜³&T ~³eW„¿ÿk#{ZcHÓÄ4LörL$¼üvà ×>¥ž˜1·nЧ4ú›Ú››øxÑ[)ÇÔë÷ËÁ#·­zâŠÿuÊV¸ú÷õš!ù•„oJ`ò'ÊùäØt!¬ßÚÁó¯Õ‹$1 Ó41Ì;=Ð6ઠ/\ûze¾Š=ê¶?Iš&›?^Ŧ?Bš–i Eˇ›¾òÑÙo¨e›ÑÀ«ªÏ3Mž2¥¼gO¨`Ìд2u›ÚyñíM$¢q’±8ñH”Xg„H[;z"§inÜðüµåRxÆÜºÓ×€ýjonbÝ’ÅDÚZBPV5tq^qÉôÌÚí.Xàš‡7”›¦|Ù49Õëœ7±’êòPZ™Õ m¼¼h zB'OˆÅˆwF‰utioOIŠJp,‡€ŒlqÑë¯OíS„hÆÜºYÀ뉫V°mýÚ”§ŸWTÜYRYuýªÇ/&Ûu‡<®yxÃÓ” LÉ yœZE©Ò¿XYßÊ‚÷·a&z©Š ?ùï¼›·V4aš&Ò0ÐI’‰$‰”ôwíP?H¯Ì$Â$érôºç¯ÝÜ_Ï©¿/ÝÄ.ZÕÌ¢š­nžib$u ±8ñ¨€h{‡âü LŸ!%ÂГ¦æÑðÜ•ÛûûÙgÌ­+~\r¹ÆÐ“4oÞÄΆ´îÚ‘:î ͼ¢EÒ”_n|ñ†U{ó<‡®|°þ)å C—™6© ¿7ùo-oâý5»‘Rv©þD=ž$·Ãµ±NgdL`úý€@Ó“QMÓF­öÊÙŽs놘†qS¬³ã†D4Z¢y„¦mo#ÒÚJ¤ÍÞÚÛRNj0¿À(,/ÿ8¿¸t^ÅÈQ÷¼úý“º;0} C —ÿvý)Rò ’òʲÓ&Uâs1á²,[Û’b¾i«~=‘$‹“ˆÆˆG"Ä::0tKò  0–@ÒslÝ ³”ù*͘[çïlm™Üºs{M´£ã¬h[ë(=‘xý~ÃëšÇÓ*„ØŠB……/;vü3/}k\ŸÙèÀìû×OAÊ—%W—‡˜>¹:-´+%,X²6´¥3?©c$’$ã6óméOÆãX’¡4v ûñ¹/të+ÎtHDgýfÝÙÀ‹RR0|pÓ'U¥>Äë#,ÞΚ›ùRbFRÇH&IÆ$cq«ÿv1?`3ß4÷Ó<☇jî]{ð<’ШÊ|¦M®Â£¤W1LÉßþ½u[Ú»$_70t#©§˜Ÿ°#ñˆÕe’ hÆac6>{åÇ|8ÈpÉ]kgÏcª ˜6¹Ma¾nHþúö6lë)1 ËásŒ'Hƻ¾ñˆå/™h0vaǩ̇ƒØ˜1·îlàe 8nx¡Å|eH/©›¼ðæ&wFRRo†n`$-§Ï@ÂîöI)1yHaaèÇmœÅ^'Y<è ÔÓ±ú„ø ˆ s€% vA )Då#P­A¥Õ*%TI ÛlÛhÿ`ë¿¥ÜécÈ…À.³AÞnÝÓº5 ¼®© M{Ùãñœ5dp1߼አ»&И¦ä¡§ÞeÕÇÛ,æKkŸ£ú³=¿aBÓ”"¿¬á™ÙÏf}›ñwØŒÆâ‡XÚûBœ€‹L—0(Ãf› }ÒˆCÒõ vJX¦ÁK!xiœ”[ÚANµŠÉ;€9Î%û‘)ášZ/ð0£¬4ŸïÜ<ò²®ùôRÂcóÞæß‹×÷©^3Ä äƒ4¥–ˆ}©á™Ùg,Ø%ñ?Å+Ø$ÄÙ.f%¿FÚ ¡®j2=]q6º~%°LÀK^xñZ)?XÒÑ ìG 0ØÙ8ž¾PXä;7O£rpQZ™ù/¼Ï«¯õm”Óô1Cù`J´dìÆ†§?·B.Æ/m¥St¸YÂgB‡Ùê] P9¹%ßÍxg3»ßü%s¯‘²aþ~ÂÀ}À y!?ßºé³ Z–vþ >⹿,éSÒÄ&Z<þ½†§gý"­@Æ$ÄII¸¸Pe¬ÊhÇÑ2œG©0õʯÃpÇ-uöe†_ qÀÏÆH¹£ÌU ç€(ဠ\Sû}à~/ß¼ñ|F‡+Òο½h?õNŸê”þ F^!H‰–ˆþ¨á³æ¤BÜb<ˆÑ ­b\n3a¶&„pª9›”©}ëœ[)SûRˆn’ïfºáÚ7»—‹¸¯~5XÊݶi°0ÔÏ Ûï×ÔΞóz4ñ¯Ë'Ž­J;ÿáŠM<ððBÌ>|©cúƒ˜ùEóãÑ_5üásßIT¤~!h›…‡"ÄÕ¼*S=Êæ€ÀÙ÷ØLVË;äžî+3l&` ‘b²ÃxÝõ_‡„à®røõL)ÛœêúSìW„kj'ïù_¼êSœ1ù˜´ók×ïäîû_%™Ì}¾ƒébä#hñè/žšùÝÔI—Ô/â Cˆß Ès$[¼B¤$ÝkK¾‹éšòßm29„¹™]Ì5œÍ„®s®c£.»VÊ¥¨.D?0o¿ \S[õÕÈiçÀç.9%íüæ­{øå=ÿ Íé ÀêêùE Áü¼á©™·¤NÚÌŸâMð¯â'¦ßÔÍp/6Óé’|¯-õGúí_Õö@HëúeÕ†ëWR›¡lŠVˆz૤|ºÌþ2 û%®©õF~rÂf^œÎü]ÍíÜ}ÿ‚¾3¿ ØQû?mxjæ­©“–Úgƒö¬-B<)àó=XRï|X/Á+eíà–úLpb™8‘ÕÐe<ö½u!HÒ¥ 0ë7dBí2!N+å­@âs„Ø'ì¯HàýÀ™#†—qýµg¦ Ǹû¾´µåžYà äYÌÇD‹GÒøTÍR'mæ/­Qˆ“B<«ÁHGò½XÌ÷ ðÙ/_e¾ªòÝŒ‡îÌWÏ©`ÈÔ5TÔ:¦},Ó°ëMÒ@[üw¶ÂUs¤Üu°/ ð”VášÚ›ëKŠóøúWÎÁïïÂ\,–äÞ°«ɘÌ@Fa ÑbÑ5ÎëÎ|@«Ⲅoj0Ò#>{ó AÀÞ‚`í~!ðciG+ts I× ÐÝ'Èö_½^5;>¬/EüXsÄ€_J‚R¦þ;ϤÜûœxç1!&œ Ú ØËõÔ×Ô~ø›ßïõ|÷æiŒÞÕ××uƒ{ø'kÖæ>õÞ æa”‚4Ñb‘;ç]z{ê¤"ùë…˜!…xN*õ>[êF{í_Óå³>ݵ³ß*ѪT÷öÆÕr¹ø޽7°$? $m³àl.'qG>5\ʆ7Àœ²¯š`À4@¸¦vðŒx®¿öÌ4曦ä÷ý«ÏÌ× Ël›¹-ó…˜ …xRe¾O‘ú”´Ûû) (>€ãùCwIw޹@7eê)¨ûnàhgs€¿”)-¡j †Äá…&!Šç€ØM0 ×Ô–Jf^| Ÿœž:}Þ±tyšÁ|ô¢óØøä¥?N´½}@ì¢*!Äó8/ÔQû>!R/2€õ2UçO•zg?[Ø×¡žD-Ó¹l Pcü¤›¿”iæÉK ”'´À¼7Á?Þ®º/ËÑö;Â5µVj–qŸš2†içvþ…—ò¯wrŸŒc†º˜ï‰uÞÚøä%©ìNCǃø‹íðœ#œ¾½×¶ëŽ$©6Õ+eªÏŸ¦úé;³s%µŽL@p´‚Ú=Mól«>Š ‚ ê„øÕhûo_žu 4À÷ÏŽ=˜«/Ÿ’v⟠Wó·WVä\‘Ì+@/*w˜Kã“—ü4í¼õ#ªÀ³pšÓÅs¤È§€ %Ajß^JP¤åwp*ÜæÀ)-¦j»-7,âFLä¨úášÚ3€9…A¾ò¥³ð(3z>ø°‘?>ŸÓdD~!²dÃüï5>qÉÏÓ tyük„ø¡€Ï©ž”Ãç–)»"|Šä§’CJy@VúʤT³àS7Ûl9mrL•„_=*ÄyØþ@.¦ ß®©-æ ç?®9“’â®,i[·µðè“o圀ÓSPˆ(³™íøvã§ê) O 1FÂwš¦:»i«{Gò5ÇÃW¶4@®Mu8š@Õ¶9ððëW 8>GSПàA`ÔôóOäøOT§F¢ îèuâ9¦[÷à­l1%ÒqKãÏu—qTÿÐ:á§ø_JJL3Å|²©ŒWUýžå;¼ì¨R»¯j|@ñÆlâk³sìô Â5µÿ\>ö˜Á\ráÉ©ãRZݽ»r ôø  ©´ÔpgûŸñswa{ý ­±ü3çE¥l¦­öÕð®[êSÌwŽ$äŽ1¸»Œ)ßK ¨A%Å|¿VˆAãÓñ”‘övÿÞ‚ _þâYiÓ¸Ÿq)­Þ’ýb…ü…äUW[£eí?¯tÆí™ÊI`Pž$ü‘G½w³‘ŽÍÇÕ̓ƒŠñ™(S/!5‚IØ3hÒ$Ü::‡pŸ`ò<-ùn»¿di/¿šÛôû@aÇMÄÚ;Ÿ]ûÐô[²•u¤¹—K85M:[Âx‡é*³eŸf„ܾ€jÔ‚GùuÊIøÚj!ÆÒ‹ØW ðSà“n»¿eë›÷vN ó TUÓÔ'½¾þwçÏÎZX1è"dÀÝÑ4µ‹§¾ŒT@Ç „ƒœœð³Cn§PÕêØ…]΃Ÿ-ée¬`¯®©|Óm÷#‘÷ÿ~!ñDïNŸ¯¸½t0M­1¼R¯þÁsÏéíš… í°òëŒp{þEúµ Nä`2rÃ5“Oà`r@\¼Lˆ“{òö ášÚÁÀãù¡Ú})%¿{ìMv5÷ìôIMÃ,D$TB4nðÈÕë8gRÙýþB&ÌrÇÑÝ/À»OÝ»¯=HÈÝ=T5\Êä‘°MÁç*zˆ ì­¸|Åç'¥Ùý—¬dÕÇ[{l†‘WHrP5º?)!èa[ýýŸŸã}E½ƒ€O«¶Ñ=¡CUûj<ÿP&·)€t- Ž¸ f*Ö/™Àßg„kjÏ®<ñøaLšNߨØÄŸ_Z–õ:’,¯Â(,aÝ6èÓt#°eTo÷t»D\*ÀãŸwÛ|§aê ÝC™ÜmÈÔvǪ÷¤Ç’EúÛë¿?ðqÕe“SÇãq‡ÿW3y éíš "„ÀkÄk6ÞuU¯óÀœÀO¡ݪqZÒí(ûÐóHÞ¡Hî¶d@rk$`æÂ,f ¯S¾ Œ›yÉ)”•v}Âõ‡gßí5Øãíh!é$h‚šùΚûÏ)×Ï·<Ùbà3ª L›ÀIz·Éi©oèP'ž˜ë­jмñ¦֙޿î¸ÍŸ„K ágs°b(*å €pMíhàûcFfê™Ç¦Ž¿÷ÁFÞy7‡o÷¤¤<`Ò¤ƒÏ#Ìx0p^®÷˜ < 3¿»oìÞÜR’þù }ôѾÜî ¥µá0‰ݙ̻Ú/%š7ìc:L\.Ĉz)7ÎvY“¾˜€ßx½žàµWžžšÔ¹{O'óžY”sÆ¢¼8@ž0Øtçé9ϵƒ?„‹ÝÞ°ŠþLç7RCÅn!p÷Tæ0#S€%'„kj?LŸqÁ‰T±ÖÆ5MÉCÿ‹HŽS¹C!‚yA†ú:WÝ÷™¯çt¤‚?¶ýÛm”LÊn/Áaüáàüe#·–s˜ï¿²?va? W„kj €{†V—¦Íîùû«+XWŸ{FÕ²!ÖœÀd4öAÎ)Toµ£ÊÝ8•énÆŽRv=µŸM¸ÞUÕT,@Œ\4ÀíÀ°k.Ÿ’šà±}g/½¼¼O@<ùDŸ.´©ØŠôR‹kßù¸2Þ!Õþg‚¢cª—dx5=:¶ãwóI'Oû‚÷©?.BWòðôFy!Bù!âñ¤4 ãñœ/´i>ˆ¤UÐ5É!“ô ÌwS¦®a¦c@u(ÃëéMÜ"ÞKgtÅúß}¿žëú–FPU9‘öÈæEwŸ—û÷_6Í’Vžlê-c¤ìH \Þ…ý¿2ÓõY®©\wÚ)a†U[K¯E¢ æ?ÿ~Ÿ²¼Ò@"¥ÏÛdÂÐLŒ=Ré¾€óß!µ;l›ŒÀr!Êç»^SO&à;š&ü—\xRêÀóý€¶öXö‚ÂAe ±2r›#Ç#¯ DR7I&’¿É±mÝHBµÒ˜ŒÈW$r¿ º %$,3æ¹g€=Ú÷å3&ap…•·gCCo¾y>¿×j¥•Cðú}iç4 "qHDã%ÕÃ×ô¹uXcÊ!Õ© u¢c‡s0¹?=sH}7¦ýUʦ¾åõzBM›`]hJž|zQ·Y4¡Âʪ+)ª(Ï:ëÈ4!nÞP>°uÆÜº;»_úÖ¸œ¿ ²šÕ7ÓQŽi̇ì¦ÐÕåkv_× ášÚRà¿Î>s\*Þ¿xɶlo!¿¤˜¼¢B……„ ðøúüuy ð#à¿gÌ­ûpg®ËŸت~r­n¸~43à~'jŠ:•üÐm¬>oÖ4Qè}¤”,oŒqìé§ííÈé$%-»šÊ<^ï/<ïì)·¾{Å¢ÿ›\ßÛeºU—eÿH U ½ýj*:»L|‚”Íã{ ×Ô›>ql5ÅEÖÒ«k7w1½ýÃ|!ðx½ÄÚ;éli=ÍìŒ,=ã–·?×Ó%óéB¯š`Amø‘ „\Þ…ý?cßÝÝ <(:µkÁëÅ«û1`~×,"¤,Ò£ñ§?ý½OËV~6ÈARn+Ct©:·98’˜ÙžA ¶E3¼7.­¨®àøqCk©õ¦Öx?>®E¾@ÍÛ• ‰/‹ýñ¬ï/Î:hßjåGH9‚fêÒ®}”c‡3¹ÇÀå(éèœc¶Nì ášZ-—7sê¹'§–c{w¤ß!Ÿ?} ])ea<ÒùÊYß}³"SùÑÖÃou«»LZàp t·Q 7ã?aëB¬”¨î€þPð¬áãÇ–—°µ)ÊŽÝÙƒ>ûJÞ@÷US¥!+“¦H_e[JyÐn©ÿõîÆ:¹ö\yõ€Ã»7àVñj’É,>Áú©XigÕ$“)”«þaÅ "†²œ¿õ[ÔE•ûŸ|_ÆãFRŸuÖw§›ƒ•V]ƒ}{° øIDAT݈WÁp$ønÉw·Ý ]8ä—æg¨Ï 0cn]~Ñ ²³Z:±~kg†âýG^€Œ½U)½±Xä!àLõð| ^l³e𹫾 5*Î×^£qæÌmÏþ"}§Ét÷ƒÜQ‚¥¤Ü˜Éð$b±úƒAOE‰¥–w·'héèó ]ŸHð|èñî÷IÄâSNýÎòÂ÷9!-œ r‰”{– ±PÂù†ýðNÊUÝþHÒ­þ4 ÙØH²±q@Û³?ÈðîI¨3 „€¿´c-Jq;é(м>ß5åÅê·¬úwÈðg<. ãÅw_çü·Õž´ý€29=jâew2ÆÃÅdêÞ©mw' vÚîƒç§f°ÿÚŒ¹u£5§Z‚ò"‹!Xý;äõg€æõíl¿Öùï<ôT…ðg †Šzµñnûw¸Lq·AUó©œÂB¤e·©n¢”«É"0  ¤Ð—Z“·#–[6}¥l@óh$£±ã2œ’ÇH¹xÇXQM¸œiQ†C] dŠtJHK2­&šV„àÏ;Á¼#K½p.À â®nY_rõï y¼^„§ûœÓ0Ñ“ÉPÚAK Èv«7ð\šã“as/ËâСª ܽ›4ðc €šn^‰üi—­þ3%EЀaÅù]Ý23÷é~ûL™´€¡ë DÆÙJSÁ[TèXiUU-àÁ¡CQ¸ë¾Û ºÀÿ÷“¥\âþD% MtÊûI€v“©2Œ>ÙA¡");=Ör/Ý4@&5èv %êÍéK’Ùü™ à–‰NÓ³¤DѰg‰Db¶ïŽSÀ0Д †®#„Ȩ‡æ`-¯6AÊy–ª/ÄyNRe™lè¡@™>iªRk ¸¤ÿ¡ñ=8iXI§ˆÄt¤„×>Ø1ÍÈN^Ÿ·°ëÉ$Bˆd¦òXeù†¾§¾T–m;ß¾ób² !ìä~Ö4sGW[UÐJ«~Tß‹ôƒ€F°4Àòõ-ìÜÓÿ£=‘Ð^e Ó0ÐI"ã@„”RÚ¡aó)b‡‡- nª&8T@ÐÓ *õŽÏãA5y~z”»VåÐD ØÐÓygeSÿ¶&Gòù»Ì@<±ù6g+ï†&‚€ÿ1!™I2Ô—“ÉCFù=Xzn?%“ÚOBJÃePÿ†Jyßü<•4`#XŽ_<¹Ýÿ4êzýñˆõѰ7|![i%š%¯–òcw¹C*ö–iÄ0Ug¿´£ÿHÕi Hnæ\êßôÀÍÓ ºŠ®É3=‘†”o H ú@¦¡Û¿Éx¡y(.-¹»Ç‹ì¸`†¥¼MÂ_݈ Åp›×}™F2»©|{K¸]¥Ïë—¤ü;Y¾™HÛµië«{Zvä§2 «×ë´BÐP íŸMé6…ÙMŽ)h½®“°L€Ž-ý Ôª†Œ2©|w'Åx n·Å‘~¥—óðÉRÞIŽŸJÚâ{>³³ugScÇž–~jRßÉÔu¤im³¡|À‚\®s¾ äL)Ûòa¦„­™¼eqÒ jÈ„þð2Í×ïÍÙs˜íÖf.æ¿6ZÊ›¯¿/Ϫ”•ܹyUíÍ7,I$¦)‰¶w`š&!cIý¦Ü+°z€¬’r³>gBD}‰qº¤Ç1 *Ü#÷HâÞ€"Ó9w]ªöɤîê¦H¾«{»¦®8âŽ×ß—eeS«†Ýó»#­í¥eÕC‰Ðö:‰hŸÈ4 š·Ð¼eRJ‚ùy®ž÷ù“{¿ÒE髆ÕHxFÍI™â^pÁY3HͱëN4ÝG3MÈÌFj9ÅN§Î9P=}—PÙ ýý¦œ9TÊõo°«†ùƒÁ[voÝAý²•)o| ÉÐu"míH)B“>ŸÿʽªÈv §‚y½”/ÿiBÌQóŽ)ˆci‚˜Ö>]!“£¨ªfè.Á™œ7•¹j9”sîðµzGå;ϘEíopÑP)×OÝK惀¥Nÿ]ÉŠ¥ñÎõKW°gÛÀG;ö´m·l ?¸fùc—¬ÞëÊ”žÁ)ŸðÁ¹6«QÂ4»*1º@àH™Û<¸³Þ@àK¶@ŽÛÆ;[Lâ óUµoßÿ­<˜r½”ï¿ÑG§ÏMiz~ð¨ŸÎ/-Þ M“më6°áÃèliÝ›º{¥XG'Û×o´ž]€/”wÕ>Wªh‚‘R..„ÓMx+£Gõe»%NÕ îñ…LNj×R >¹c÷I×ýÒ˜Ÿá9æ?0ZÊ ®”rû9{z¢n+‡žù½wF6mÚRDÓÆióŠ‹€ iŸm©æ!Ëü…àÞb¸k¶”{œª}ëêõøzzªgÒM¯•DÚÚßïlií?Õ¬”àâ%C*Šß{Î@ÏCOÓ«„8!·K¸DͲéþugá„ ]EgÙ9§]BdTýªpû ª–0!&àwEðó )wîÙ_*¿ÛkÉ¥¾“¿ò÷gÚšš/“ý=WLBÙÐÊ—ÜÿÙûû·â,¤h°–ûPˆI&üHÀ9nõîüfKB)/±[úÝp1ÚpÒÇóá'ã¤Üëè,鯛–—½»üዦô^²Ÿ)V1U‡›±€RÁ n`iIz²J÷[ì nó4 ø«€_ž$庉ÂUΘtÓkZ"ª½y÷e¦aìSx¬ð’þz¬”‹ã Ûª~¿0Þ¡>À¡Ó¾±`J¤­ãÙHkÛн¹©×ç3K*ò½_ŸÛ·|³E¶Fp|„ÙÀ[û¯bbÒJS!0Èw«}ÈÜ $}°Lƒ—ðâ'¥Ü0^‘ô;°æ;Zí¿¥Íö z㫳£÷DZÛ«r½Æ $‹Ê˾ðþ}ç?»×7(RòàØ1°z¢ÄDàY!ŠbP‡j * ûWZ™L¶IØ®Y¹ ¶`k l«”26äBÀ‘t•éeã{£}€C§Þøê¢íwFÚ;†ô´g~qѦPqáä÷î=wÛ>ßt É•É„“is6VþÂl—Oµ;ß*+í:º¤œÇt•úvÓ?GIýëÉxüÂxgt,€/àßíñû6x}¾×?xà‚[ûífû™\>ÃÞÕÁg¸›þ?Rü®ÉïêIEND®B`‚kfritz/icons/ox128-apps-kfritz-tray.png0000664000175000017500000001324112065570711016127 0ustar jojo‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYs Ѫí¨tEXtSoftwarewww.inkscape.org›î<IDATxœí{PTG¾Ç¿}f„ (1àÑ(®‚ˆqLÐàŸÁÍf“T™ÍÝìÍfÕlޯʚŠÙ»en%·®©òJ4©˜ë# ÄÍQt$Í5‰ â Šæôýãœa‡™î330ƒó8Ÿª©Σ»µçt÷¯ýmB)…ÊàB à~aBhÜ? ª«^ˆj!$ÐAÝøBà#í\Úà{Ji½»ÊÒ[&5B éI –›T8E)½íâüÂ,àÄmG(¥ç]YküÒ!減s‰Àß)¥ÿtQ~A–êä­"€"JéW”ƒ…஄=BˆÀ|ð+‚,&„Üë¢l'€Sù£FÒÆÆÆvrîÌrQ¸ø „À\Q\®0‡’사G±nذÔÖÖ†ÕÔÔŒ=vìX° &Æea„”‰_¤§i´“÷¤BÒ !šþd(77#¬GDDà­·Þ*RÌœ93ò±ÇãµÇ÷ô'oGð „Lpëœ ˆˆˆ ·'˜'õf›~øáîÐÐÐ>ÇV¯^}—BnÁ/ €2 ÀdÞùÝ»wß[YY™9yòd­B21~ÕŸìYA°9Î:æn|Þ! fðÎøá‡ÑÙÙÙ³FŒe0.Y²$P!¹i„!®/åç €2 ÀlÞù—_~9ò÷¿ÿý|óßÁÁÁ!yyy‹ÿô§?…qnÑ@òÞù >k²×íapþ?þxè¦M›–«†]£Ñhþò—¿ÌÍÊÊâ9lB9ǽŸ4BÈ]ÆúÌ6}Á‚AÛ¶m[!³gèС »8É'ÉŽŸÀç € `!f[šš°ÿþ:ŽÛÖ+y‡Arù„ø”B,Çë¯9xðà’   E—ì{ï½7çý÷ßT¸$À"Ù«èÕøŒÈŽšy"X磢¢„ÒÒÒ…áááÃH‹üñ|pïÞ½1fG ƒafö¼Ÿ0¹#7œiÖrüøñŒ‘#G2]²<²³³§Õét¼K&BÆ:WZÏÂ' Àƒ˜¡ÑhpôèÑñññãú“pffæý%%%q ×<­?éz ^o„HsúL<8%99y@:z½þÞ­[·2›Ã!JýÆ« @­âVî®]»æÌ™ó+òZ·nݯ²³³ymsŽÁðj€‚‹wË–-1kÖ¬Yઌ!ä½÷ÞãÅÄ[;”¼¯5Ù'ÏìÑoܸ1rýúõ+\ç½÷Þ;"%%…õ/u{­€3ÖÞzë­EàÌ ”ÌÌL¥É"¯Ã›  ƒu°µµULOOß}ýúõ&wdÚÓÓà ÚðÊàJ¯5J©Rø´ ååå]“&Mú¢ººúgWçÛÕÅ›"P àNpœÿø+W®ˆ“'OþÆ`0”À7®¹"ÃK—.õ¸"OÁ« @—6ðÎwttЇzèdjjêÿDDDìÛºuëä×ÕÕÕS\\Ì2R(¹×áÕ”Ò ßBZÔaƒ(Š8yòd<óÌ3—¿þúëÒþæUVVVÏiš(¥^ùfðzJi€"vWó<òÈ#MMM ýɧ  €Ùçp¹?éy>a@)mð77•®ëèè 999ßô'Ý»wó^ón_Ãç.|Æ€Rz’(KJJn××××:“vuuõ?ëë™õÜA)½áLZž„OÈ‹:8  R͆¯¾úêœ3é6rNyíëðA*ñ3¥4ÀAÖ5{÷îuxXØÕÕÕýî»ïòš¯}ý>jV41B¸zõªÃ½ö={öT655±ü "$A¯Åç @žÙŒÚÚÚòÜuww÷¼øâ‹¼·ÅEJi÷@Êw§ñy7ƒ­›LL· _|ñÅÙÆÆF–±P? ¬twŸ7p¦i§L™bwV¯§§§ç…^¸Ê9]E)ýe@%óüÁ˜ )))v×Üçç矽|ù²Ï>ý€€¥3u.55U1ŽÏd2™^xáž4Ë%Jië@Ëç ø´@ƒ°YËJæÌ™3U鯭[·~WSSÃô!8íŠÂy¾nY7nÜ8<((ˆÛÔÕÕ]Ù°a¯ç_K)½î’Òy>k„pÚÿuëÖ¥ðîEQ|ôÑGË»»¹£;Ÿyú5Y *unùòåÁ111cx÷~öÙge¥¥¥¼Ú?G)mvE=Ÿ4H«u˜¼_|‘Ù)€¦¦¦«O?ý4ϳ×à;”Í£4 !'„ÜŽ–Orr²núôéÌ…$”Rúä“O7<áQo÷ú±pûòfYãn$‘¥"!¤’®K0ååái`„„¼¼¼tY¦’óóó ÅÅż€’JJ)o6Ыq«ÈOã\ôk 5.&„œPJ)å ·œÉK+çÅ\/°sçÎø±cÇÆƒQù ?þx 'éve-Ÿ§â¶&@Ö虎R‡Ì8HB Zla!ÿÃ:¿råÊÕ«WÏe»uëV[ffæa…É!Ÿ|õ›q‹ÈÊØ àØf$€e²®OòÒA’„aªiŽ1Bؾ}ûbydÐQM=öØsçÎñ¦†¦”zõt¯=\nr›¿€3Ou€¥r“áL^AAø¹  `*OdóæÍöïß‹sk;¤u>K @®®FOhh¨Ò ÀBG7dcY †¯™½{÷Ž×ëõL—âââc¯¾ú*O ª’\¼Ï¾ú͸Ìävx8º¶cÆŒÑÖÔÔ<õÙgŸM²Sžt¹ áå3„’`1n³‘——7!;;;“uîÂ… ?/[¶L)&ð¥”îS¸Ä,4z˜¯âaÆ ÇωŒŒŒ]»víZƒÁÄ{èÀÐõ%„„ñVAAA&._¾üaÖùÖÖÖæŒŒŒÒ®®.^§ï4¥´š—¾¯áªaà,L÷ê!CˆÁ`X“y6cƌ̳gÏŸ5kV^CC+4g,!$R,ŸNN{Œü›‹ (**škúý „ÄCA£çã?ž¸páÂl(¬›ß·oßOýÍbcc5»víJÕëõ3å|xOþ…Ê|C)mHY¼•~½dvæt+¼óÎ;cžxâ‰'í¥³iÓ¦ß$…‡‡;UFƒ¿þõ¯£*++ŸÒëõò®3íYYYJ•H®h·íÊåé8mödØŸ}öÙ¨—^zé‡2íÒ¥KW644<ûùçŸ'ÆÅÅ)¾‘’““rssãWoܸqM`` WóW®ü݇RZ·ÔÝûòy:N5ödØW­Z¾eË–?‚ …’)ÁÁÁ999«V­ZÕUYYyª±±±ùòåË7[ZZ:ãââÂbcc#G}÷ÝwçUo‰ÑhlËÊÊú_*ßå2ކà »x¹2ì³gÏþä“Oþ ÕjƒÐO½F£KLLœž˜˜h®dÖG‘æææ†E‹ýíûï¿çŠù@zíû}å€=öI“&þû!CÂqÅ’***þ/==½äÚµkJÓË¥”ÒÊA+”‡ãhàAp\¼111Úo¿ýö©ÐÐP·ímç'Ožü­ZùÎa×d=ÞxÖ¹ððpÁ`0üzøðá ./™ƒ˜L¦®7ß|s×òåËÏÚYïwL­|[i˜;mãǯ=zt2îÐk¿½½ýúÚµkwùå—LÑHÒ“ï×½}ŽsÅæÍ›ã'L˜†;Tù—.]:7þü¯ÏŸ?¯ä½ë„ääq‹j¨/àH€9”zþùç/æååítqyìÒÝÝÝùÁìNHH(´Sù7¨•¯Œ#ÀŒ†E+W®,çw¶˜L&¥!—Ë8wîÜ©äää­Ï=÷\ö¾ÀßüÕ½ë Ž@®«ôµ×^«ýÍo~óngggkKKKuIIIëŠ'a4o¾þúë;&Nœø÷³gÏÚ›°9?‰æqvû”R‘rÀ2pü»víºñÃ?l®©©é2ô7Þ¨~ýõ׫Õj¼Ïî‰'ެZµÊP__oOÒé³wa yúùdeî\e­ŠŠŠÛæU5o¿ývýܹs7_»v­ª?…¢”šNž|øÖ´iÓþ>f̘oÓÒÒBSRR†‰¢(–••Ý(--mWˆÑcÑ à{HKµý+~Ë ô;"ˆRzÒiÛ¶qpàmRWW×óé§ŸÞøôÓOû«­[ à8¥TÉó§â •+¢”R iåï0HoæÄÑhð¥Ô«uy=—„…Ëoâ.W !ù˜kô Àg}E‘Ëqùòp¹CVF¹)b8ÎmáÖ ÒÂÌAñ0ú3nÓ—V"„„ARëŠi“EKŒZåO=€:µs7x¸]!D–Sí]e+/ 5¯ýk•õýUîn7kä çéïª 2¾ª¦â ªø9Y&@Š Ô±S‰ Së ººŸþùMF£A£Ñh4'NœàzÂå¥x–˜7«ì€´qU¿„¶ˆ3nBH$€±òGQm[eÐiä)­uFÜÂ! „Œ ¢ßÅSL®CÒa´ë9U4ù‰Ÿ &æ*¤¹îk„H~ýA*ª¸”H‘RY'™@™@IÌIÅûø‰Rj#{gótBR`§òCBB„´´´ôôôIII÷ÄÆÆÆh4óŠ`³EõYÌ)»w-Ïõ^cáúe-uô<+mË|yyŠòo‘Rj’ç2DJ©hý[þˆòý&‹ã¢(Šæ¿-?&Q-¿EQEÐh4A´‚ ˜¿{BÌß–¿5òßZBˆÖd2¡ªªªõÔ©S­ÇŽk3 ·„®`!¤›RÚG©Ï€r„¢££µûöí›óÀ,²]vöc]‘ýý¸*R@© ÒëÒ‘ïþ^cþ HÓç:‹Oã7ï›ã¢( ¥¥¥†Õ«W—755)Ø”XÆNöŽÝem¾Y¼»^yå•Q.\xM¯×/“×ÿ«x‚ hfÏžqñâÅ{þùç•:í³,u{ß„…`ˆ-ët:òÝwß-MJJZÏzr]•ŽO¼¬———Õëõßtww³š…Ji ¿!±à(mïØ±cJRRÒBÖ9Ï%%%eîöíÛ9§cä:ïm˜Ñ;K—.½+''gë‹§2<ú裿^¼x1sçTÈu.ÈÒ/6mFXX˜››û” Šêœ*ž‹ º;w>Æš§¹›"@ Ù²aýúõ£###¹š¼*ÞAdddÂúõë™ÛçˆÀqóΜ9“»µšŠw¡×ëyuy·Î‚ÏûûФ2˜L˜0©å `¨yN¿:ŽDGG«®`!:::Q§Ó±"³C´°ÒÅÔ©Sƒ´Zm0úº\¹TUU‘ºº:ÿr³VcvKwí¬Y³ºì¦}ôèÑ@£ÑhN«7M«¨a €6Ì4}út%aÈsñâÅ “'OµtýÊß&«¿EQMòÇò˜h’•-´Z­V£Ñh-Bt‚ ˜ÿf~!½¿L'NthIV« ž:ujPYY™õö8AZpöØsæ?¦¹¹™œ?že€­/z½¾; ÀnºUUUÚ¶¶6b•–uÚ@£££»§OŸîL±¦¥¥EWQQ&¹õûú÷-~›è¿šDQ¤–`1 ÕȘ#‚,¾µVs‹9 š¡C‡v:j·NmwÒRñ/TðsTðsTðsTðsTðsTðsTðsTðs´B¢úBKK o;u&ãÆ£QQQæ{l®¬¢vè‹9##£³§§‡ÙÛ›¥”õkmœ3Üwß}·yä‘F‹aÅ•›¸÷7 m#{öÌß®Þ9úW'‚Î"¸÷øðáà œP^áÔ©H¬j}¦££cSpp°ygnWÄÞ©1ƒhyìÖ­[7BBBÞ„-m€vÆ ÔÖÖþÈ:®â}ÔÖÖò6èl ‰2Ùðã?2—©xgΜáÕe›I[߆¢¢¢Z÷Ie0)**bÖ1€:’2—6ïŽ;šOŸ>ý•[K¦âvN:U¼sçNÖêànõ‚,Í|Ú³²²´··3w Qñ|ÚÛÛ›²²²¾æœ®¥”ö˜‡§!õ†ûÐØØØ³aÆÿ†ƒ‘A*}î¹çr¯\¹Â !Õ¹4þ§”ÞÀì)nÛ¶íÚÛo¿½¹³³óºÛŠªâRŒFcëo¼ñ_¹¹¹ˆ‹‹ÓíÙ³'sÚ´i‹áãwW¥ãS~ƒÁp,''çD]]Ï™×iƒnÀvyx8€%97ãw¿û]ÔÓO?ýÀرcLJ‡‡›7•T à΀öúõë7ªªª>ú裊ÜÜ\%aíÛ¾´ß¶Q‘·Š]6‚ˆŠŠÒÌŸ?ÿ®ÔÔÔˆ€€­uð'Pë ,Ž1¢{aqÈ& Nú6éZ¤e&ókäO*Š"`þæãVç¨Édê½Þâ~0Ž›ïƒ D«Õ ‚ *H1 AÐjµ!Ä|¬÷¸%ÝÝÝôôéÓ·JJJ:[ZZqƒ›Q«}y1÷˜ ÎVñ*^G'€PJm¶ÿS‰ àaÃÝ[67Ó iû\¦ËßžLœ’Ô{ú*ÉmH›{UP…MµŠÔAZO>œµ„*C;€ó~¤ìžê”T,B" IÅŽ im¡¹¯0Ð^½hõ=´úÛâ›Ø9fï¼½{ú{­³iPHm{€[6õ¬¥”:å¯ù)ú Â–øØIEND®B`‚kfritz/icons/ox16-status-new-call.png0000664000175000017500000000151012065570711015633 0ustar jojo‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<ÅIDAT8SMkQ=oæÍW&“IÒIÐÆ´ÚDiJm¬ÚPÔ*ZºPAÝ(èF¤ ÿ€[wnD\ºÄ•+W*¢ˆ¢`mêGE[µ6¶6M›©š&“ÉLfž © ‚ö¬.÷žs8pï%Œ1¬Nž¡ú+sxD$ð»/³d5w* X×uȸ(¥ˆµäL-¾]ºUþêݧ+¤ ‡¯‰CC½=]éx6¦ÓŒà;xÊ­aŒ1xä{Æ;×Þ G¥€¦éÍZ.Ø>™Á½±:=xa2òmañvK{rûû¢-—Ý2¨ÀAU%( ßgH˜ÏК²Ð¦g±Ä3•ª4³y (¸¾uoÇ®T‹ˆ;Ï—>Ïš M©6Ÿª²ì0Æ0oõ¨gïìéN_Dêqpì­ò÷ênJ˜¿Ãó&(1Ò C¬ååÑæ ŽÈcÆ›)ëÖ”¼JMç~<I²ûh¡X3° p~ƒ€¯‡N‹Uóè\ïBÓT¸®ËjàÃ| Í£»2ZPxR¾ºé%ï;ñ©¸Ô`sÅêðúdôH:ü]Ï6òc/L&`YuŒæóع­¦Ü kíÑÒÝq¶ç½©7+ ó×þXãÙ›¥jÜy«Fí&&ß!J¡jÕP˜. ÛÓ‹ŠžÞ–­ì•ƒ+n¥8uþU"¢‰jtc?fL î‚çû%F,†wS„Úz ‹œzã +ºßwÀI^®ÕP`è¤ýgðxô ’‘Ž_3~-:7 –ÁÏ#àæ¯Ç§$“-c¡tÄ S‚Üp<²™r(J}T]"68,ÿ• dÖä{#_{_ι*A…BU(4E€ªPôw? BüË€ŠdÂ÷¼ÛŽmËuFA<¬Iá;.q › .QXŠP'™@{°ªgú¸ÿSþŸµÐBàQÝIEND®B`‚kfritz/icons/ox22-status-incoming-call.png0000664000175000017500000000215012065570711016643 0ustar jojo‰PNG  IHDRÄ´l;sBIT|dˆ pHYsuuDwfætEXtSoftwarewww.inkscape.org›î<åIDAT8ÓkL[Uðÿ¹m¹­0Jו1)œLàc ãá“áp3.L·¹ib& Äq3>WÑi25›Ãˆ‰’=dû@ÝØÄÇLuÙpÁ°ÉdsCJ¡HåÙÛ–ÛrÛÞãì´0lÙI·{ò¿¿œó?9„RŠ;yU?”>˜–ô±”eãz‡›‹›h³ èMõ›ÇÉÀ9/ßX”°O÷=œÀàêŸÚ±^ï4ùµ¾ÌyÁqë"·ëŽ-Ó©6oBdBÒ¬ŒO`1]=6¼þƒîœ¢]ßN8Ðm:©IÎúß*^jÜŸ•²°úLû.·uÂÉ9Ú,–ÔÚžé dJöt•8ckF­}v—Ë}`°¹œ€9áÍŸæfÄV~ÓbÆ]f8“,é¿?Jõz_¨SÎ ¼|ºº¬tÅþ/Ÿ‡Ýá†È*ÚûEšO ›…pP˜ÕqnyÓSe¥+ö56ý:Ê#;˜¿­BV{¬òSòNÕšyÃ?ûÕC[žÎ9qæ\7é·N@¼kÁeƶ0¯oÃw’=y=äô2P'Î NYÿ [\œf¼Ñc“v\£T]ÓDIóÍg =Q}ÙCîÆÇXÑŽ à??SÓòeZjüö#†‹jbGå>ÿ}¦úu㑯ë÷-IðލÁ.á ]}þŸ_ý š Î%º˜SÜ^ÅV¥¹/6¯~ÛpS¼wSMÝÞDÓ*Œ¯QJ¡ØùùE™ÖJÖTV¸/PJA)®"+3ñÐ÷F‘ÊÐ,VYLuÅ{Éž·ÖJZW>âµÆ‡>·Ü(ÆAž–¤Ùå_ç­*HOV-MÁ"™ äù¯¶ÖÑß­ŒkvHº’£ý¼ gÜ ðÄ”!þ ç¥7 : $Ó(,AEîΟ9ÿO±ÑÛ"8Wýã¬8%‡Lé›q3Ð1uð…)Àß‚QŠxç˜+( “³pÙíOÒÚÚ÷HÍ.­ò9™Íq°HÂj'à*ú±”;éý£ËFf”2| 6ÛÜ<6Žˆ€àœ@õ’š7—+Ëd×ýWR×otwÍÉPµ3öµø¼Þ EÞá„HECà›êß¿Á-7ʋ͔N…B€VŸåí Ã,ŒQÂ+˜œàì] ›T³Â»_Ï€DÑIõzñvXP6ð@²*ÏO:œ@££ÕO´Õ¶…³³¹ÆßXgÏçÁªárIEND®B`‚kfritz/icons/ox64-status-missed-call.png0000664000175000017500000001103212065570711016331 0ustar jojo‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYs<<h$BtEXtSoftwarewww.inkscape.org›î<—IDATxœÕ›yœTÕ•Ç¿ç½Ú«÷¦éfS >€BPQPœ(FÙ±„¸ ®MLÔ$C2“ˆNf2ÅÑLÔe±K‚A£FCÄ%AHØ›Yš­÷®®åU½zwþ¨zÝÕ+ÝЂžÏç~ªêÞ÷ι¿ß=ï¼{Ͻ%J)¾¬2uA¹ ¥®±,ë« c5];¨¶…ê+jÜ_±mËcõk²:Ó!_FÁÒ¡9} è;xÐm.¯ÇÓ7ÇI–GàhC‚°‘Âk ±ëæCJY~öÚK:Òõ¥! ,Õ€¯‹Èœ5hÔ×'cô`?Ãú{(ð;8TçÅ¿ÖðÑÎmؾ5ÙTW»ÁŸŸ?nË™­¼á O@ X*ÀL`¾ßëñ­[ÆqӃŒl¯Œ6,öW¼¿#DÒêKùº5XIsíg¯Ý9.³þ M@ X:x&?Û=ê¶iøiÒPVï ³b[#jã=ÒeY[?X‰/;gáÎWn¹Ë®ÿB–:€ŸöÍ÷þè®àýæ‰ç²nûQž]UE£øNXoˆ±ùý*¿¤ß;^¼ñ—ð$ ,=G„—îœ1|̼9£©®ñÈÂõ¼·î CÇ]„hÚIé¯?v„kÿªJ†œ}ÁÖųþáè¥~÷Š‚¥ÿÒ'Ïó¿Ýw™ïÒ‘ýxîmüj领IV~ÞIƒÈë[B^q‰„jkÞ!< ,í <ÿO£ûO_pÿxê› ¾ùß«Ù}°¡ùš’!ƒ)PÒ+ö¢¡—¿Mÿ³‡Þ{Ú=`äoMs9µEóæ\PtçŒá¼¿á ÷?þM‘D«ëüù¹½fÓ›MVA!‘PÃwO“þg‡/ÖØ´ O¡ÿžÉS†â-ÈæžÇ×ðÞÇ»éÈ+Ez×¾Çï§áØÑ!§…€é—Ÿ!ðgS©aQñðʺj‡·…:½'ÒØ„Ëëíµ>ÄššÐ®ÄÉG•Êuÿ·{°Æ¡«a…}ü”ôÉÂ8t¨Kð‘Æ®Û{"µ‡+iª«Å›½ó”zÀì§?»T×øÓÈssó ²]ÔÔÇX±j‘¦ÈñnMDB¡MÀHÀu2}h¨:Æ®õŸàñgÞ¬ì«O™Üøìžin—¶òºñóÆ,F)áÃO*h E;»ÅV jæÞ7æºv¾4k 𣵯,‹ý[6±õÃUøóòöä÷ë?d{é ÇN‰ÜüÜž[½nýùÉ÷säe¹Ø´«Žå«Àˆ$ £ý B½#ÉØ]oÎÝÙ¦åqàj`bOìGصn ±pXòÄΗç|¯ÙÔç=¸ù¹=󲼎_LÓ_²¼6–×ñþÆ#¡0¡š:jIE}ÑH º¶dïësnïLßÔå}ÕÀ°ãÙn¬®¢²|uG“[ÔwWV~Á[ÏÚyÍçFÀœç÷ˆeñh^–ëû“ÇôÃãÖY_VËÇ›ŽDB4V×®o@‰ š¦HZì}ã–ùÇÓ=uA¹¸˜äe¶)¥¨©<@ey‘ú:² ÷øròî.{é¦éú\¸ñÙÏ–bQq¾÷–IcJp:4Öl«aí¶jÌx#!T[Gý‘c(åp*•Lütÿ²9?ë‰I¿Ø^iløa´±aT¸¡aHˆõ‰G#¦²ÔOVÖ»Ù…}~µá©)ûºÒÑë\ÿÔn°ôŒbÿ”k.*Aׄ7W±aG IÓÄG 74ÒX]C܈c9ÝJ3ßÛû‡›žèÕŽtSz5^ûÄ®<„w†ÌwՅň&¬Úx””×b&Ä#1¢!šjë1Œ8ÊåU$ž.ðЋLy´ÌÈ›£ÎÎwåň‚åë³¹¼ÓHƈ65®kÀˆX¯ÒÌäì[zÃÏ{«'"½BÀ„‡6ˆèú‹#Î*¸üÊ ŠQ–âÍö³µ¼ª|,&ÜЈe)’^¿’dâ±}Kg?Ô©Réböß‹Ïm¯ÐX]ûØÐ³ŠfM¹l(X¶¼Œ[‘L$ˆÇ Œp3‘@‰†òe# ã©ý¿ŸýƒVJZËjЪÀ ŠU*Ò×hp´ŽÎ‰*]NŠ“‚`éýg ,xbÞýq»üá­¿³òƒX¦‰ee$`5¤/IÆîåúæœ"²´Y0U‰LWp…@n3#МéMk¬‘ʲÞÊå³ P'BÄI–ÎìS˜õû~w²–›ãåÝ¿láõ·ÿÞî:%ɬ\ÄŒ¿TñÊÌ9)Ë)àagŠ<¬ÁWuÐ5@´t±IPÅ’ébAxGWj¾¶Î«'Dœ0`éeÙYž•?x`’»¸o¯ÝMéËk^,$Íe/_73íê²ÎCä?Edš8§R8H=—¥šI°{¨là"˜€ $H1ËyE·¬ù·Ãºé'D@ X:Ôår¬ùþ·¯É îÃ?6à׋VcµÍË‹†™“$¬x9Lƒ×Â<Ñ´Ÿ9@w‰à&µÄsYÎ ð:{@2 >$D0#ýÛCSêÞ,XÒoè1`i±¦ÉÚ{¿qåàóG ¤|÷Qž|f‰D²=øÜÄLü±â·×‘S¡ëÏkJ]ïÁcË­¥RîŸ&@hyþ3ã@ÚõI¦AǨ1 FÊ+’"Ï8-ë{·‚Ñ =" ,õ̽éÒ Ç=›•µ<úärb±Öù;4 3§I&Þ¬xqƵˆÈëPT§i+u‘ó<"xEð¥p¥Áké’ùþËü®Ú|Ú$$Hy@ §‰H{Ãj·RÓæ@¤3ºHoV,1å+Ž{6ǪC<ùôŠöàE#‘ÛI&Þ²Á/O­Èk:œç!KÓÈIàܤž= >³´R.ZƧð~ ÈQ Z§WÄ4m u6¯èIBdÁå—ž3yÚ¤‘44Fyò©4†bíÀ›ùEˆi¾]ñ⌶¦=ë¹Ü#B–YJáW ¯R83F=3êO2¯·ƒh3$8”š½îLu·K¯Ð?ÿ;7^1ɤÅSϽOUM›¦CQ1˜É·¼8m:ÀÃ"ÚBø¦À-nÀ/‚_)|i·×•B, Q ”j·«Û]"2½Á&Á¯>RÁU‰<¸¦väÇ% ,Ír:ôÅwÍ/‡Îï–­gßþêÖÐ5Ü%ýÀ4ÿt tÊôT¥Èp(‘ù.R£ã³,¼6xËËJ K/ÌlmtR ½€O)<¤ˆQ"½î¶$tǽvúè3ôÏgý†}¬þ¨u–J4 ßÀXfâ½½‹&OËljÔ´kPè¼J5<-=ê¢NhòÖ©Ø$8Hy‚‡®Tý¹ ø&m…. K¯zNÉÝW_1œ#G(}µÍDG×q 8ƒX<¹µü7¯ié‰ÈBˆR÷8· RnŸ.½-öëRH‘à!õ–ñ¤k"?~r$à :% ,ÍöûÜ‹ï˜s™Äã&¿^ô†a6·[^?fÑ’Éä¾ÝÏ\u~Ûû-¸A—p)e¤æ€÷yf"3Ip“gª®À„©™¶»ò€Go˜uñ ü|?¿ýÝZ®on0óŠ0s q;5³zUÁYÜ«é"3ôŒN8èY”?i]é¢hÚµK3pw¸K¿6æÂÁw_ra€ÿZÎ'ŸîiÕîJÄ0<>|ʸgwÙ¨Ö'°Dd ôW0Æ~=e‚wžq}y¤wv!‡¿õ-T$‚=v1•š¸D$¦”RíK³ ²–ÜÀ4“í.È/.Äa%æwf< gÚ+9|G3»S!™o»I8ÓnoE@ XzÁù#~cØÐ~¬ú°Œªªö’¾l§ž\ûøUË:µ©iƒÚN[Oø–µÎ/$aÝÖŠy08í+„#ï,ßÒJ‰ËëMèG4mÚTj@GàO5 ™ƒ@F4Mðpº;Í1 ,~ÑèÁ× PÀï–­'£é¹}‹(P’Þ›WèÄcñϦ.(/þÓ÷Ï=Ú‘a•Z—œÖQÏ{~ñ;ÛþÞì"òï3¦Œ’êÚ0e•1£Ïgè¸1ô;;q0AHZ‚îrO2øÎ+òé¿Êì¥:mDDÙ†3Ë©–¶6í~èPùPºYƒÔ!¥¡çö¿©¤8—OÊÈ-)Æ›åï:3-䆽x@ѦQÿ¶Öc×?œú¨ÌÌßµMhœ*i›Di ˪´¯±=`Ú•WÔUGÙUÙÔ-åN— M×QIk„/‘Xl×? Ë:Øœ¿£…ˆS-™)4û3-í/@I`Ð}ÇðéκpºS‡5’¦ùõñó>¾Þ®×a‹ >“„ÓñXé’iþ.Ðáæorþ¨!#u]£âX¸GÊF$ JI,füxM€wà£ÃPkBAB„Dz!¤ÆŽìvÜ­ý“³±±yÔã¤Òfé•ÌÖÛa¯½ u8\Î;ûúä@UÓìÙ9]-ÇuTÒ,<ïö·Æ+¥>^*b*‘w“JÝœHO’š‘Y†QVvò»!vöØNŸ'”ú#Ψiš>¼(×MCS¢C%]‰ÃåÂ~ÁˆhXIs.À,°4ËZf³oˆ4À©xì˜c‘KÛO:,£ºvŽÏ£wyÖ¾3n'V2‰¦iC EÉ%ð¶;ì‹)ÚO¬{_lâмgHÕýÅ›2³0šhÚ™Q#ÉžCÝ‹þmÅérL˜ˆ&!¥”Z ¦®Ô¼)ðvÞÞ¤et>±Á›vÓ)ò¤S©ÌjcZvoÜUGeU§ÇÕºGúM`D"XIëS»~>¨ÛàÏ Þ³= JËÆÅçñ(Øài[¢¤ß%‚ì74Ü¿y;þ¼rúâöùpû¼(¥0q̸‰7h¬ª¥©¾‡Ëij~ÿ¬ã‘•ŠjŸÈÚ€R—˜"OÇ`†™î¸K¤Ý!‰¶$d.°L ž~ÅÙ³M,D^.¶¬û¦Bý }÷»/4VÕÌmu¾§³›EÈ+ésûÆg&/9îÅmn\ ZÆ%DþKàr;{›ù™y@ZF?sŠ›±ØzÛ©ÔOæÂfzp^¨Ãó}{Å”¦šº×Œh´Ë¿häô)|ÓóS'tÇPÇÖSD4Á„¤¦Í¥&i00sû;SÚÆ»yW³¬W³`]OÏA$.¾oUN<}µ©®abÒ4Ûe½ÙYuYùyý×ýrB¬£û{$ésC«AÛ#0AR‰ÕþJ© òT+‘Ç•eíþr'ìÂæå7{BdÌ}+‹1ã™x4öU#Íwº]1·ß·ÆíõN^÷Ë =ûÿj·z$­r¨KAf¥>™êaÒIè•“ÿ|,☑q:IEND®B`‚kfritz/icons/oxsc-status-missed-call.svgz0000664000175000017500000001426012065570711016720 0ustar jojo‹Ý]koW’ý¼þ½ô—Ûݺï‡by°‰7A€,0“`÷[@“M™ŠHÚ²üë÷ÔíûI6eJÁŒ™H·oßGÕ©SU÷Ñ~û—/w«ès¶Ý-7ë› OÙ$ÊÖ³Í|¹¾½™üöëO‰›D»ýt=Ÿ®6ëìf²ÞLþòîÕÛO’èÇm6Ýgóèa¹ÿý²þc7›ÞgÑw÷ûûë««‡‡‡tY¦›ííÕ›(IÞ½zõv÷ùöUEèw½»žÏn&Å ÷Ÿ¶«Pq>»ÊVÙ]¶Þï®xʯ&‡ê³Cõõ¾üœÍ6ww›õ.¼¹Þ½®UÞÎUm̓ •¸÷þЉ+!ÔHvëýôKÒ|cì{U0Æ®ðìPs\­ë/+ˆbp0ái½wˆÿÿ«^( ÒÝæÓv–-ðf–®³ýÕû_ßW–Î÷óZ3¥ôý6T²žÞe»ûé,Û]•åáý¨àa9ß¼™&RË­±¡ðc¶¼ý¸§RŸ¢ùüÝeöðÃæËÍ„E,âÞ¦’Y£"®tʘ²y¥åüfò×éc¶ý—¾¹™Üo³]¶ýœ¤Õu5"–*‹**Ú ¡” µJ \Ï73š&¼ÜÍÀvÿi—l>ío7€s2›®V)ôòuòîí]¶ŸÎ§ûi9˜òwi8ž×ÿÓ»·³Ùõÿl¶P-úCåÓhðf‚ZóÙ54q7Ý¿[ÞMo3Rù`"o¯¨Îþñ>+È›À ƒ{¡?ŸÝ-é•«ì—«Õ/Ôò$ºÊ[ZîWÙ»Ð~ùc1@üTùªœË»·•`H*sÒ äMÎ6«Íöfòzþ)~ØlçÙ¶|`Ÿڃ Ôƒ¡póáÿ²Ù~¿YeÛ隦Âs¤Ün•né§å<ëWê¥!Uô<Û}œÎ7€ZóÑÃrâ¤@'Žõ>/j•¨ÐWIDê’»›üÍd1]íZðûºÙÜ‘5H&­p¼ùp°s t c\ë¦ãDê”TÎõŽ ï&ª÷ ^Mdï“»é—åÝòk6/•qèïÓv ÞLVd[ øÉ»ròô³Q>Hv‚Qs°VØ!0ÞLšeÎ3u½ÿ=Øüuc¿ŽxÏóÇü9=â?¬§Æ× ÄÁ6Š®“Ívy»„ZJ¤ª¶þæX›42ˆ`x²í¸“§:g©¦Y¤²ø30išR¨§Ÿ,•B®Í&N©‡æ ·’M·?o§ó%@q˜éÿþí¯¿¼ÿ]ü^4u[Tøm½Üá}ýþƒ¸ø¿×¿v‚æ0>Wüòˆ_´MuùLÔŸ 2`PÏ~s_²Þf±ØeûÒ°Ãè÷+Œš*%q®_ÿôÓý';Ô qÒc.&Ó× ?Þà?ö5¨Š¯šâWeY›Õ นLWÓÇ]9uòÜ×·"×Í÷¹+Ù ï»ùTq.ÏYçWðçŽ|ËÍdO?®€}—˜Tigxœ(„KÎyû¦¦µDúTK.tMyÖÕTש€2M Y=ˆ¢\Ë}êoA£›1íJ*—cSÿ•.±GAßæ¦îûPTø—kþý¤ Ì6Âê=ˆ#=<|\î³fû¬Û>ÀåvÌ¥ú}PzR±sÄgá 3Êlj†»3†[_Gš…Þ•¨›Ô:.j8q>eŠ[&jXã"…KUÃŒõ‰ðcáê¥$ßä…7Þ7…⼩s§„˜ŒðŒ×…ÂR+¼½ PÜq™Ø—’‰á©ã^²PðŠwu tj‘LЮ•H˜.)vL*‚½”T?jïxM&B§˜¬­ÉD¸Ô*¥h"ì¨T 㠙Ц«o•‰õu™4Û„L.ç·ŽÈ$ÄÔ:uÆ›²ä1— ‚üÊRâ ã—œ½;:{ó‚³—BÙúìU*´*µ¿ :6Vû ‹ÇPæ=wUÙ67/É.*${THþ¥„‚„ŒW€ 1:…–µé+‹ÜŒùËÚˆ9&)^ %Ìc¶Î‡ *YSU (m9nÚ¹¤¶úµJý""j…yÁ|Ó «Ôj]ÆD®œû”{QSTº jÔQÔ¼H¤F¨1¹¼¨ažÅ1Ù V…„³Ò³ŒN…¯8ë_1unÁX @i&=IÈlže‹Åˆ$¤| yÕÉLz:˜‹ÌeóYHOf|jrrÜX•z¦uœxüÀ¢™7mœDKáõ ‰q–7a–¥¥jq0s*Ca‘?7ØÀ±T1«ê¡ŒÆÃך#ág@0þ“ú32óOH‘"œè _å}@ ûïd±\í³mÁ ÔK²\£à~4,7ë$]ìþþóãpÖ^Ãk’; ±-²Ÿ§Ÿv»åtýÃêÓ¶ÛñVHó÷ÙçeG £á"«eˆ¢£FÛè°˜g>€±ú…üå3êÍw¿.©_t`ÏX›èÌ?윞_ÌøBútp= Ë”©iL›´q–EÕϲh[‡µJ«@ø6ˆU˜âMˆÁ4Sï÷i™%&N„O…GvàÏqÞA§£/MŸÞqÝ]H.B¾]ç}"eÉ3Q)+æp©µê„vµ¶†öG@› éžþöÅjǫܿ«a<¬£ØòTj¦|“®jïêgC:õ¨ ØSÈ‚Çáz<Ãø/¥À.ѼxÖܨYi²~°¯Ù¸‡5/Úió©Þ²ú:˜á©æÞËúm»Þ¢§Þöf"}ª¸tßxáÀhá+ Íp-ŠÉ<àì¬Õ0ä&QÅY™Ég„š¼çS……êž×ëã(¿ÇZŒY°êåÖÆKJw©¥‰F"Ð8¶‚¥„dÍ•ˆ+:þîUµ´öŒ»;ÆýâWQý˜q¹ç}«ï^ý[¥Ï]ZÿAgmšmâ¤ÔaàãMª©›ÍýÑ&SZ°då+|ŒhÛ:×qí¶and|¶Ýé¶ef§³ãvƙθ9;ݸXÕYŠn5î•´¸m6.F4ÎÔbÚ¶øFã­çZ|{Õ$Ý!ëQ÷¤GûœGç”GýŒG ³ú˜ý0ÍxÇQÁl¾w¼M>5æÃñ6‹À­Zéç—WŒ…bZùjˆ;§”Úg”j‡^E=–ÚÇ•jj2PSo×JëG¯»¯Ç®[šö‚¦õ…LYK7f2Ïà=Ͱeö‡5õ»í›Ý{Í[M•·^TAf„)ž+ÃüHMoÒ/Ãæ}’ö“î“æ}“–ùŸæÁ.j¦;„–ûVµ·TäÏUÑ!Á weÊ­‰4T« ‚5×mrâO€¸‘o"¹>¥ð”éVˆàF$›3•é“ wÍF9¢)/5R6ìGøÆsÝW¾nØ¥ãXÒ˜Âþì`ÒšàæÚy gòh:Mn­ ÃŽpiçʾZp®¡Þòƒá^/"_Aˆõt•Xãwfê±h)ÈQ©Z½Fßz¥ƒW++-B͘ƒ¢Ã.Ÿ¥sée$ÉFØß3ÑÚˆNü/Ù3xFɇ]c¬§író±ÐÅÆì61ü¤®-ø”:½DFfçøkÏP á³ðçsÑ–Ü/˜éìdXŸåZ-0h­µÕò E ~fP¬U냢‘±iV|¤`îo{/k»TÎFepg/…¦•ñ‚ya¼gçîb„ñ> )cÖ€>L?Ì?˜H1ªÙð˜õŸÓ@ˆò䘠1öè¿ËfrDtZÜ-IK3òêÏ0­Aж,$Òy¯t-‰¥Ä‰óN€ÏÅ%˜-LuvÎ’Åf›Ë¹ŠÉ¼°­–G0ÛÅK-]VÊ]„ֱ݆ühŽ®k+ŒÚ “ó%òÕ §ë2¸4Óy¦mì3¡âñ“VêâD§ü¨(å©êõ#ÈÎhúûõjÆÎ\ Q2E0uHãÃAS…¤õÇ”$úÔXí:z¾ÄJÕ¹Ñ$èè9|kiÙ3ólŸ:(¾XÝ«d¨a}«F)F#Ûb”£Ö“Ž›KuÂÑcàâ˜]<Œ×cv'Ï|µ=9VðͯÁ´¿ÓýLý;0mÁ_b jÄrQkÆ#ˆþÜ|E‹³óREÇ Gw#}®ªIõ"ß®PÝ´T^"¿?w)O Ï^â—ç.‰Ö>×ÔþXS÷SMõ5µex‰gcQŽàÒ³±(¹tHˆŽ§pí¶°Ð‚L¥Ñ‡UËV‹²¼¬Y—ã%v³ÏÆ¢ºÈQ™öv“ãÛÛ²Þ­D4ÞÚ÷Ѭ>`Q|¿ÂÁ)¼½Ÿî?ÒÅ¡jüV}Á¤õb¹Z]Ú®¾{Ý 'èãåO¼ú·(Q©t‚£åXëTÓáýQˆ&‘ÃûÅR§B0g]Dßö´ÊKƒ “ÆÉˆž:ʱH•GfEd`Qð£Jĉ„ÖѤ2‘1)ˆí= Uª½0RDΤÜJg\\~}Oˆh…ÞNÚ81ðÈHál$%|`^„×Aaœc@H¡ L€ mªŒÔÎD ìo Ð!yÍ£D#¥§˜SÆ\ƒ"[Ôcœ ÙZ#V¶ ãÄÛàLd[HmcÈ^ ãR{–ú¸D£Ð†SŠéâ§ùB©à ¸I]Âs!¹B ¯&®¶ðY$4üWê °‰aœëèk8†ÖUnuÌ»£ÜîÇdÊuZäÖÓQF6†¡ \£È+0’ô(-æ-£pEÄePˆ×`ªZ“Ð9Rˆ6i=×ðÊâzëi#0z膊‘Js‡&ÃëL%–." iø|k úO8Ì­°2Ö*u’@Ñ@ÃdìT*ðI]q¤Ø˜ !jN!ÀACaJ º.†T^hÀ…1cN¸ ÄàMà•tÊ"(=¨ N£ Šq“ËCÛø¹f”•ªÔ ×Fý³ m¸1ƒ¤wVGtµ*¤+vi•ÈJ9}(Â22¤”yã\Œј":Ó¯•Ca,i 9ˆšf„QX— ;k‘,ÇÓ”¨!ù.âA/Á^h–3˜0ÄÌrn4™Èº¡m˜¹K™s *BÏl,AÐCt°p;½q†!©Yó@²Ö€18aS+K-IºJ›—AïžYî´Åä…@@:õH’Ä  ""¼A= ¶Ö…‰@ ½z„b"(ý*,ÂS!RA"D@7¨éE”3•¡c¡a}(N2é‰ät¸´è¡ 8(UZ«Ó*¢¥E Y‘V<óÀÁ¨›ZØ¿‹éq*’ÐÙ Õ µ•(|S‰4#+a‰£5OޏJ”d&ŽŒW“Œ€y(TigaHº<&6dÃJÊBwŽ’ w˜¡Ìõ®\¡w¯ʽ9ÔBz—^‹\ñ È\ñS¡wps®wXjPÂ8õºó °¬Þ uZX¨MÒr7 ÌÐɤ€ÙTÑj‹ƒç÷\-‡íHÚ'™‘YcFÔ™ƒê0|‰ Š¡iè†to”ÅkQͤÄ&™8hXj]pC3¡Ar*ãt¨žIž­¬!9˜CB°ÖetQ1ؤ¥*j˜R9ø& Y4ˆ=ÚÌ…i „ÜÃè G†Žµ„Œ*+×…ºyÄi§y ªÑÐàQ8 „E9iDkšð°’Ä­á<à&€vA¢›¨)}˜ÉFˆA ’Y, ¾PzÐ=Í)§(‡‹ÒQ¯Š˜:–tIA€9ˆ­Á ÂÇFÐegR­:Ó/AÌ’½’µƒÍròzð–°³tYžSxÆOŽŠ1N¶€ß»pâbKÀ¶ŒÜŠÓ `‹hƒJŒ’òÐ)˜L^j̇÷¤„Bî ƒ1ŒßÀËr‘ÌÐBW\Ø>\×>Íx‹— }Òɇhê¤Sñ0šà °Â,Qaž!dƒ·†á!KáæLŠØž˜äMza•˜%œsLŸË€•¡)R˜p¯Q@•D£(udatoƒ““ j!¿k9¬¼7HˆG„ñct´!ädàP¦I(œ":Oäûâèý ¥rû¦€Æ;øbûÆŒxn¸ *ÄHý¤š`E‘ÂJ³x¾ÚÊtpopûš¸#¤ëŠáàš<¹MâÍ!õW~.Ô_]FJõ÷ñ¨` (Ð)J€k+çƒQh -‚·ˆ㘤/f4 iƒeH Ÿ±EdÞ@D0 KS“ˆœlp¨ mRØâ@÷žhÝ„[;ä»%°ÆC.Àh™Âp¼L­"#«¤a:…^14èS ’±Õi(2ˆ½\IR:žÓÝô¹ƒ2ˆè“u2Ѓ 98eÉ 4Ás ³øˆ¾‡ }¢ˆÑòèÖvªåžÌ¸m¦~ˆ-‚9­hëÆ)Q_¢0%Žñ£s$èD/Äþ†<Îá‚à%œ’kˆ}Éô4Eˆ´Â g‚`…qOàR$Ђ7`ŽåDðŠh…dͰ ‚{œ&…! á±%?ŠhÑZ@ Ñ&9]æB((’ 1ã“%¤?ÁÝ&`_øvn<ùr@œ`¼§¨¤bY‚~DÙR_8çX) ãMÀB/b¦±#4:M~Q;ˆ@t™@Oȉ(® û¯tçÝ¢:Tãm¸CF×!34.x^M~ðöŸÕ·…OëT5(]ý0d÷ŒC^åh‚‰€nQ„¸”“»’ ­X"ä ÜÕÖ‘0r8ÝDALêX :È5% :tÁHÖVêþ~{ ç\]ï;9gæs6tè…: ¨Öê‚D(¢‹ÄÅaù˜…`ι,ÒåWO~Œ«a&3}úBê…<Œ‡pÒLC7šY‘ãEðΣUˆ!ÛÓç-$xö@¤W·ÃwÈ0&'”%ßP®ÓnÃ"$|¡ïnÌÉQ;²Çw8å"Dy‚±‚PDwð÷Dˆ‡o¥^`;“¾aÕ\Ó#NçîÄNZïî>P}‰Cœt²ªu|“±Öš!y=º¿ØZ#Ôvhãï°³_šKë‹Óílòªe1¯.€vƒc®Ý'Ýí·›?²ëõfU݇µ%Yl VMwoë=†ó‚HÉŒm=Ú~i]Ê=%_I‹«s½œ†Õ0BuGôÝEÉÁyÿ,Ú‰d.ˆ¿9Óïóë¸ù«‡«Áo&†P×Ö;éñ,ôi‚c#jLÓ"A늤ù™‚† Y('‹_¢)| *Þc7õÏò«Uj0J"ë²AMÑB\½P¢!­' }aõꕆ-q bQXŽ@LK0HµQV#è3Oð˜.·œm6 þŽ>dIBLž»/á2-½üZ~N†ÅÈPT|ÜÎZ¸^U?³M­jQ¹:¡Oú`ÊQ}/½û|ûîÿ¼›Îʇë¦=]ßÁ>,æ›·/¯”P…—ÞùÔø¶\¼y»ak,Ð(buí¢üðûÕÇ—W"™Œ¾ÐÂ;“Ic !Œ¯:-æ/¯þ8ýT®–Í„oÒD^^½[—åú—j"ͬn¶3… …ÈÖÑY“º4Ë¿™¯f\ÏË«ÕLJYÌnÞ?ä `ùXÎgÓå²€R>_½zqWn¦óéfṲ́ù¬Ä·ÅÍŸøñÕ‹Ùìæ¿Vë°Ø>}½z£×|v5ÜM7¯wÓ7%õýoXÅ‹ëÝì³ùô®l¨†Àò’q?ŸÝ-xÉõ_6‹åòù*»®FZl–%¿®ç…ß¶S½n–ðêÅVÆœÚàýßa¤Ùj¹Z¿¼úæ6ý$á½^­çåºùÂ¥ŸÖ+¨óRãêõßËÙf³Z–ëé=W +t¼Yû­ïór¿y«RNi{ƒïÞNç«€W÷«‹{4ç5"¥ bðûœÞØ-â¶Ѷ‚áÃÛÕNþåÕítùЃÜçÕêw/œÀNw¿œàZJ#cï+,'ÄB/µœ®Íõà7Ÿ~s7ý¸¸[|.ç2v÷{¿^ÃWæKÚÓάlÊÛ‡fñüÝ èî¤ £z‹VÝb‡|yÕí¨+ßÒ6Êw?';¿É`à7™øþSõ½„KÄ?b Çç¤ÄƒcÔ·ÎWëÅ›ì?õ2Ð |û ¬±µ Q‡Û¿@}êæ¢°\E¡ëŸ‹æ’R?ûh©ÔríqJ=\/BI9]ÿ´žÎÅn¥ÿý§?þᇟÕÏõPoê»_lÄÞÃåþ…þ÷?ïÿVÛœ²üCýá>X_Øæ;ÕþNÑ€áz6«w³[ÝÞ>”›Æ°Óì7Ÿ–˜5;åÉãÜ|óãÿñïb׃óä×Rå6-fh@y|Àï¿ÐÔ^wÅs@\[ËZ-—ÇË«éòÃôÓC³tFë›·ëìâ›îõ28Zxì~k¤Ôgˆ¿éóWøÏ†”—Wþºéú6w…±ÁÉIn@‘BˆþyKk¹Ž…ÕRÙ–ò|h©n¯Ú,òö Š*-©¿6lÆ,t_R•»úßê28Tˆma¾KMu|¹‘ß]í³°öÔ‘;|x»Ø”ÝñÅþøòiWÙ1"ËÏ¥§8GüÇqÚæ„3q’[]ç¤m¤yèݨ¤+|ª…ÄBa¤ª…5©¥9ì±!yL"Ò|-‰ 6E]Œ]¡Ö–P4ÄäT²-Qxý…ŽËÄ-™8Yµè—ÄÐÊ^/Ê„ôK#Iº¤TÄ1©(ñµ¤"uac-™([`±¾% oŒÙ¡‰Ø1…Q.Ô2á ¦Ë/•‰m™tÇ„L.·ŽÈ„œ¨.º¦åS%ü­¥€â* “—\}8ºz÷W¯•ñíÕ›BYÓhÿ–}|¡¼[DÜ~Jm1ʰm[Wæ¥ÅE…ä )~-!!žh¯ä\§²ºµ|ã ëxYqÇ ÕWC‰@viC8tònÛ)¡¶¤ëcä’QØÛc®UÛ¯!"ºVØQT"vƒ°)¼µ  s•22ª¦)Å›ºÓQcŽ¢æ«05¢ÆrEÕ "KºãX ˆMd:«¸õYÿt©ó£sA­¶DfÀ„9‡ÒÁi{ÙNº@+%Øwhc:@­Z›6_.Ü£À-ÝM7ëÅÇoEq1Ò‰àÛO¹F\ θ2ÇFå„°ÏVÄÑÍ·r·Ù¼,ooGänýœ Û½„nàsU†r>"y¸ŸÑµTé¼)¢°eÄ/R>ïùx‹ö Þ”:‹Ä$vêYÕW;ïÈ60/o„¶ ¢0Âw_AQÜÖ>Ìÿ¤þœ.ã#RgV'nPÇÚmîäv±Ü”ëÚñò.ùâ ïV@ÃbuŸWßCþé÷ãpJÖé2-ƒ‡ØnËŸ¦ïÓûß/߯·s;> 0ÿ¡üe‘æ‘|´³`ÛêM}£Îظa½Îj—÷›Çq|NÀ< ÇYE¾‘;[¤ìS»a³ö^î›õx@õ†ß/ª^ÒpFÍkoýiïéäôâíLÞªG¬ß±¤x¨ä×*þ·ÆØ–4gbƒ/_Û½™Œ±˜©©=]¡Ü±césPÄ_ÊUTqˆ´×_XL«Ù†L,CR°õˆßsäqVú`}'ß ¤r˘H^£-¼°»$ðv ßí@?\ëÎ2Êð” Äð‡A‰€"~ Ä4ÕW |Ü:…”Ök¡E7{Á…‚öhr‘OU_å­Ž¶Ás³/ŒÎÖ Û½Ž¨&í’^(¢jæå񬮯u ‰ç}BÆ$jÆûdŒIˆðµ#”ðBÚ=à#Ð=àÀfë9ZÀ11ÊÜèK21cœµ.Êc¸Ñ£˜Øn¤ÊTLÈø´©˜PO´¹Ö‹‚F˜«ƒB4✊gb¢ …íY²Ð(Ü–y$*XÉkQP‹ßFŽPÐN8EpÄiÓ€ÿ+ŒvÜÑ<‡Š¦•%|厀`(°YêòdHjÝ ÁÀ `wóÒ Þà‰r¼ÆãÌnœªÊÈBø oûe™æ.Q5zŠÚØ‘r»XQT‡ÂEÔ$Gvg½÷¡sNâ2¹áW—½Ü¥ ˆ” _* ÇžH@°Ë$(…0”`ªDe’;ƒ#ˆàÿ©ð$Ä8$.%# €€ñ›C×ÑÒýYÿ˜¸¬“Æë¸Wlw…Câ~c.ý¨Ì¾ôüM/š0 µóHèž>^ó(í«g5—Þ>Ûþ.[gíYÖ>šÙìЫgÿ²eMTÈÇ×¶ì§ÿiØ.UkÈVZÐñ!Í4Ìæñè“qѬqKäFŒíC˜Ÿná£ãC¡3v8=¶.ýtvbÞÁ·7o)N®nÙ+³ôF{LÜwW#æv* Þ›p¥Å×]@òY›}ßßïïï팷÷Å{˜µÀìëi)÷Í#˜­²ËãcÊ©s¯YØÎ¨UJyYÅ(]+¦—…<;ä;:';úç:Z6øqïGÿˆGKMîj*óS“a£#Üè)|el¹Ëªp™ÁsûŽK°ÑÓ^±7æa†B÷”SÿŒSç„SOÙþWP¶¾Míy²CwƒÔÓ·:qÂ!Gc0¸ê®ÏTLûŒÞA•;í×Û?¬×R\øgžÒJíSZ©}+µçZiû¸êþaÕÝQÕž¦ã¯ i{!uJïs&÷ÑÓ¶ÌaZÓ>OÝ?M½–º{’º« æ„øWUaŠçʰÚ.d Ã2ìžÁïŸÓß?¥ß=£ß“¢üØauÈáìÐ »çЪ_ªöžŠâ¹*Ú%˜é¹.]T çí*)ÐJÛ÷AAý #òM$×§^Û£aD²93¥=9ð^¢9Â(G@´FšãˆØxnøªöᇠtKv ¦TûPº†ýLv‹¦¸…~(…¾šN;·^†áG„´se¨‚<[ˆPoóbƒô,$KÜ’€$Äv>~iñY¸6m9*Uk÷*’Dµº@æA5'.šU2D@ í>¿tI‹ö7ÆL¬ujÿkñ‘QËáq˜ëÙP!w¹yn§lÔ ÕK5}4ø=^"#ósüçÏP‰ËôsÂs9՗܈(XÚò$­GÌ ½‘G´µÖ[}†¢•<“Ô'kµv§hdlVÔv¯Ó3¯1j#ú!UŠQÜÆKjº5^xÞàGïÙ¹»a¼CʘÐëéëùkw)ÎtSÿ9 ”,O)™¶Çý÷½™A‚N‹»'ií|ûsØ­AFì¶,4Òùhl+‰eâ$åÁ—êž--uvNÉb„g›ë¹ŸâdQùÞÈ#<ÛÅk«Ã¬L¸ˆw;TÇŠpsÂIÛª0Z‡L.6P¨ªÁ†°ïéÔ¥=]ÖO"`¦Ì$²Æ\ÜÑ™8Š¥í•º-%mÍ$1ÎÛ°§çKTªÎe“pG—Èá{¥=áÏ̳c@Pb]ÝÛÊÐìh}¯G#F§ûbÔ£êIÇÍ%¯ËO"f_<§ñvÌîäÙ‚ßnOŽ|÷ ý÷gì¿=£ýà/Q‚Q.ê­x„£?7_±êì¼&.-ävrä+~ºN ÝCUÛf?-Õ—ÈïÏ-åÙ1ôñì¿>·$ÚzÅMÿ7û¯·i¿Ü¦/ÃKð8‹z„/=‹ú /=$Ä „v_[híLµ³»ªe¯G…EÝ<ˆÔ–ã%v³ÏÆ¢¹ÈQ™þv“; Çoš~o4Ø@ºj3t€sûÐýÌ@PxñnºyË+ªøiûÖ‡zÖ·‹åòæýzùí7]:Á4G¦p韲Ü:(‰‘'Ö–‡ \ö}FЦ‘#úM´-”Á‡ Sà)=í&pÐFhtÆoCDç‰*Ló*s°(ÄQ£&¹†Ö1¤q™s…Pàö¦°Q9­²à éupaÒ¼±L©l–IP0´Ÿä)œÏ´æÉUº.LJL)´ƒ °ÑÆi\–Ã>qîwˆDÞÊ,·HéÉ9õDZ¸H°b~BÒ½Wpe/0O\ Ÿ‰l ©í²·JÀf¹ …ÂŒœ™D•J}RcPèÆ"(Mx¨_r½G¡¤î'T—ŠÒgH®pƒKsL×zÄ, ÿj›„oâ„”6ûœNŸí+wû¼Àžr÷_ÀÑQnÐТô·6œ6¦a \g%=juë,OuÊ84â2˜ªµºD ±q“6J‹¨œ×ûÈ8Àèá¡O“åªÐæM¦Ë…q!Ë=²Q"²ˆùÞ;Ü?—°ôÊë‰5EÐEƉ2NèI0…Âo”º‘H±±(4BÔ’”ààT„ÑŠB •WpÂâ׉$®”rhq¸¸€p5OY$Åà&)FrvI1!`q•b¸_iÆxmÍHëÌoÝ Ðè•TL¼œŽÁÛŒ@…TBÁûƒHÖãÝ”j!ù.“I/É^X†•& ±³Ò[¸®‚Ð1£uCÛ0óPˆTPl…~¢ !!:ìœLŒÞHÃQjÞMdr²ÞÁcHbÓÏ‘4«Ú ÷ÈDVF§}½xç!8~”$=Ü®à{ëÂB †»FP1•ˆû…,"²© H® ôŒ*«<Ûpcea}\œ:ÒÉÙtPÐBáâ T¥X«³&ciÑCVÔªâɳ¨Ì pðU£‡ý‡,9=)SGŠ7;¨DsÐõ•¨bW‰\‘×°Œ<°æ)ÁK DM3 4^ŸäbMr¡Æ£@Ò…rG6Z×zW=½K´$½Ã u¥wj½G À0÷–P õ®£U•âá"+ÅCNµÞá›+½ÃR“¢ !y¸;x~Å·TkH¢UjÓ,wÓÑ!ÐÀ,”LFÈО ªŒÕ–€È‘žáò¶£¹OgF³ÆŠx³Õaúĉ¢‹á2tCÝ;ãqY¶…fÞ`“&7lÂ-¤ãJ8IÉ6d­A àg·ÖïÌ!'¬­D›?Ç ›,Uq<`ÊTàMV|4‚â€"ÄŽ6så:a˜ô(pc«!£­•ÛZÝ2“Ü©A^ƒnœºS2KgA„²©É!'ÍXÓD„Õ·Eð@˜Úħa ¾¾Ágà N(-¼N–„X¨#ܽLÙ`˜#D(xWCÏ C‘**xzkx'NñA>ª‡Ug–xü´!<í•r´6+õ5<=`çù ¨$½Kóg€c3æá-7à]$}±'°½`X Vl7¨ œ± C2z£‚iòÚb=2…/ %5ÊH N`üQÖ1D ÇBפ¶}„®Cútã-^wôÉ“ lêä©x—ø¬°@K4Xg¢lˆÖ0 +C'*R9’3ãó)df í |P€A6©…q×KX£7œÌˆñcvÜ :ùPa)IFé|¿:úàþ”1•}“ÐÄ€XaßX‘¬ ® )ã/pƒì ObÈt@k˜fɪÚ*l oû–¾c¢¨ƒÉ’ÃÀ-#¹ƒ›Ä•‡Ô¿}Yn­þíü…ýî0U¢ž¢„(M®mBLFaI=È[""ΡIð&‚«Ð>X†&}cËh18@DX†çÒ4˜“OÁ½¡MÒ–wéÖÑ t@G“Àº¹WpˤḘ£8Ÿ˜‘ƒUršÁ஘ôieì-@šš¸Wh܃ÖAVîÏ)%÷¹ÃeÐ=ð}U:¹‡&猧AXLBæ¤Y|ÆWE$âžh,ߨAaÒÎö£'³黩¢™³†[0N¥èúrƒ%IÌ7G‚N÷Bïïil”"8É š¸/MÏ’!²Â`²"d$x ô&òÌI œÞÐ ¢‘Ö »‰ÜÛ4ICè±g[Kh¡ÛdÐ!Q)¨ÀHŠsFD§%äO·9¼/b»t‘±LŒdÝp:G/KègÌŽú"8OŒ!C6 I~+¢1XÆEv"…‘W€•¥çwqG×ÂC5ÑJ AÚ”º"¯e\¼ÇÏíûXOëÔt(ýp´{’q¨1š M0¸[4Â% WNk¢A9˜»:b€°)‡‹ÐA$´(GÒA;´Llº… ¬½¶Ã÷l<¸æíÛ=O®Y„Κ½ð&)c‚«õ¶v"$CÊ1ƒIåcþJd.„”,¡À#®ÀãZ˜KŽ™ßj¢YQÊÃd¢kL3Áÿ¢IΊä]fËÄ!Áíùˆ­†ŸÝ9Òë7‡Ÿ!Ã$„Þ@0ž±¡©Ó®S±0îoÌéQ;²Çw$sº<%XÅBŸ4g~Á8bJ„dz¿ä¶3ù~–nYÌŽ8M kœ†;iƒ»û@õ%qòdUïø ;¢ÖZ"y=º¿Ø«Zhão·³ß˜Ëîo¿¬æ%ßt ÕÏf³ÝÏvìT82õ£CÉßÓañÁŸ±Ò絓à°n¤ˆnRÀA–rfŒª0 xÄtD%mø¸9æfm«¼†´ˆozsGÖI‡m™„+Fl—ò®VW¤kËÌ€ŽñE-ð¸žëC2ðà #ÑèÆ¤†LH"áâgø„ØæsŽqøŽŒ#‚9Ã9#Ía Np( ^^˜27‰ùê9RL)V  Q4ZdŰî4|!>0¤Ìà y%¯@x7äŠòêúfõƒä­Yprš…åÆYŸikʹH\˜`aIFè”"ª‚½48’g=‡ø1ñ®ÖË0ÒÇõûeySþR|íÊzõ@¹/;÷L!CPÿ¡í˜;„Œ»:óÝ…Põ…ý®zÃQïw¯[zÞ@ï.óÐ(áøL}J#‰p:"L8$”%ò;Í ‰½ó¬X2ÿŠÚS¬ ¹$«,Õko¥åG‘Τ0™ªd¬˜gjˆÀƒ &•Ø?Xȇ°¬k[2»4ð箽¨:[Ú œ‡qÂ7`õÝgÛ30Qíñ×-?ïwg‹õŸ¢ªªi|pÃJØ¢•Á!©5L‘cZ–0ižkí}Z&ÎÃU N¡Z³Hë™!Ñr µh±R¤b1_6íªúdÍ]| TEú›2êœ92K¥³!dS—N 9ßI™Ìô‰r©’cåóãA8Ë þï¸IgHçA˜¿Š›¬Ð»ï&[³¸›ÜZš©=-ùo‚Л‘>°–N"h ¸IÀ¿´ÈM"7Aºªªæ-šõ6²W­áá©w£|{ÅÞ´“*$é5¬i>’Âh’¼ÑPmæ±¾#«beÁÔx‡Ä" &©’ÃJ8Ÿ[B²ê½|*=I‹_³?b| X!‡—f—ûr°VÎð›çC*øMÔ¸CÆÏ=‚éZÙ&ýy,%ãZÿ€}Óè_F$ü:KN^…TÝvÞ¤Ò"®æ»ÿo¬(ù<|>:*"ó„„)çH‡2[!üóúûêïÞÈ"¥£Hbcýc›¼v6}w³^½¿Ÿ·ÿ¾ZÜw[ïðšËþ¹1M[”ù|úðvº^O?t»ðôÏ{Â8ÅÎ¥=w—PÌMóh:(vñËP,Û(V> ¡Ø\ ÅÊûÇ ˜¯uQð•¸=0÷¾yLŸF¡ýß„Â6Úã ÙƒK‘¦Ø¡ˆ w' ßd êm}¬@Á w¼kÁŒäV^VM<‹Îlñ<>Cˆ[ÐéPð%bÂÙÕ¹È:u ±'bL)ÊyÎÅèm©1aWD‘ .7WK+ºˆ‘ãyªÜic‚»€…–„f´ñYy>¶ã¶;JNŠÄÔ³ PA›`dž¯á棌‰R6ÔÎñ@€dÚ ›dœŽ›ð,!ALÜJo:)nF€'VP•4yíÒÎ$&gŒÞ&ú¬È.xîB¥“®Ú§¤§Ð$¢ŠUó»z‚:Ÿ›ÄAª& hfG€`OAs‡u{@Èó4B5Y›M]½M”¼Ì–áœq¾ê"‚"Ó^ò:á%‹‘éŠåÖ…ÒÜ„M W’fm¯¡$AÙ £,ˆh0ÚEî-pK!&a¬‘—> _ªˆû¤Š§Ì²f9y½žÈ>pÖ©à›•³F‹Lʸ3¶mhiµÅÀ…‹ÏÙÝnX,àî²mòÄSK!QS€¦5o5÷ˆ¨ßÙy8®lK!3† Š…ç”b|ÇBÚé¨ 7 ƒi_˜PÛ.>Bx%è7h×_…×ÄyaÈûáGF&áJ€ÁTü]ªtìŠÞ‚;+Ч¬’I¸ÜâqR9î©q™ÞóÁ4Ï£@p )×@h‹äÆ dkˆÜ&âÁŠ=ð„Òíš"<†áÎH–§}SâI‚i$t*<’²˜"dMÚ©M¼Lp)°~Ï ºòy·Iû¬˜µæ=7¸c_¤Ù&¼bšA×S‚µ„=õÿ0ù>5yhåüËá¯þKÇkˆ‡kfritz/icons/ox32-status-outgoing-call.png0000664000175000017500000000337512065570711016706 0ustar jojo‰PNG  IHDR szzôsBIT|dˆ pHYs“ã×tEXtSoftwarewww.inkscape.org›î<zIDATX…µ–{PTçÆŸïìÙ³—³7X`³âŠÜÂĪh ÆÄ¶´ŒiÙXkQ#ÖØ±ÓLo“f:m§—éLšvœ’Ém†t2’ºÑĪÉÄNLBRҘ⢎X °\4,,{aÝsöœ· tí»óí?ßû>Ïïý.çFDø„ËíaŽ¥9¿2Ù¬»tý"Ʊ°,Ç/ŒÏŸüsÙñɆ޶Ö÷þ㩪¸£.·‡™ ÚŸV®_ú§B—]Î/ c †¸z³þˆ¾+Ýu­¶í¾#.·'kÝŠì7÷¸‹ïÛÿN+. óHÉrÌZÓ}ñ¼  ü¶ ¾sðÛ{)öä;mÆ_¼ð)¢’‚¼5+¡Õëf­“¢ãð6Ÿm[0@å³íºx4ú7+« âRK&¥æ Äã¸p¢^âb^õW¯Õ p.§¥*‘ÐrqÊ€<í›Kc Ë Ñjk¼e€êº®,gšøÙ£_w­Ôáò/€p@¶%-u5€¡DõJ<ŽÎsMêÈðЇ‹¥œ¿óûºò§?)-NÏx§±ÍMÝ "ÇIQ·t«þ`2wcM[%€} @ŠFÑßÙ ‡.é Æ§;ïz¸…k¸¥Ö»¦Ài>±ºÀn>vò tz}èý¼2¡—è8ºµóÆš5mÚðР{,Zô÷_{Éÿ¯_§çÌ àágÚî_•Ÿòáò\›ðÆG=èýÂÁž«—•¨êšî£[¯Î«‹1ç¬ýù'¥%‹ë‹œ&áåCç1ØïG`ÀUgdDënÇ|N—Û“±zå’KŠRŽÏG04P â0eC÷‘ªöÛ1€¤·Àåö‹ ²6»K/Ôž˜27š‚ *ï9¼¥%QöÚ2þ)mHû´á¡¸ÜÍ’œ´·«·–Õîk@¿/ PDK„òžC››“ jsßµ–eZŒ…¶÷³_»;gA™ëË»w”=´ÿµFô\ñO˜›lA€¾Ñóú¦³³ Æã$Åœ”ûU>Èù.—ÕUšo wÓ«oßrï®ú-hmëÀ¥ØƒU\9øÈéócŒMü³ A  ’c j)ÎéÏtâÉ·zÆ5t¹=)_»§;Óa±¼ràS€1ŽÌ1%&Wx]s@´ÀCÅÝ 8Á×f˜Š…rk^,7„v;4\{¤úZ~"€·  /ÓS²"Dz÷¹÷@¼°;H&úehÓo%›XèÁb@å$@eIºaPy±Ì â@ó‚`RJžéÕ¬†È޾o*""îÙþ÷Í/5ø¨tÏ[´¤r?n?JE?úèÁöFÑâélâe‘°€Ÿ†ô$žË&c]ÆþI¿ÉÁ]_zqÃúÂWN7w¡o °gX‘Éßú¨²ðïQÄ–b¡Z<èüÝô9L¢îÑüe™¦“§¼°ef`QþR˜ì©Ã99)T `@€2O)Šø¢ˆ‹m>ÅÀºuE¿iúÜe_^…ë‡ÒGƒ¡ÖµOž|k1Îô°nêÔ€ðuˆdg\35´Q ´Íb,×þÍõ3V äñú Ë ß50ª™n~}–[ªÄåCÆ‘e©7‰3V©lI†€d ´ÿ6+V¹xÅ…òZߌÈÉ]ôbLV6 茩ds´oû^‡ÍýK àԉ¤ƒ0còòŒ§û @‚vÜ áL éý©_éÝQßz£/Ч?,%àaâAHÍÙÙeO˜€ý„éèyŠ€þ€½†wž`éð1º³ià®òÛw~öq¢ZŽ8¦óZ$±0ct:HQIHf“æPyKýmǨgíÐp”ë[IEND®B`‚kfritz/icons/ox48-status-new-call.png0000664000175000017500000000734212065570711015651 0ustar jojo‰PNG  IHDR00Wù‡sBIT|dˆ pHYs11·í(RtEXtSoftwarewww.inkscape.org›î<_IDAThí™{G}Ç?ý˜™}ïÞíÞCº“ä³NOŸ$ËX6 K²±!*cŠ·'Žy¥ !¦H‘ª„„J…J¡*1• –y8vǘÄ6¶±Á–%ëeIw'éN§{ìÞÞîìΫ;œt’±ì“bóߪíîééþ~ý›™_ÿFXkùeÂýïŽ4là·üÚÖ¼Xý‹"v>Ü{«YI—ˆH3õú/ÙDZº³vúÓŒ¥BÆÚ}ï޶,±–úu_¶µsǯwÒ Ïv¸nvbxXºz׉+++ÙhÅn޶\îf¸Y®¼ï]B;Æ+*@,¬¾Þ¹ÅËs#†U@wqEa <˜Yt£*-“oت߄Þü5 ø…»Ð®›it˜”B ÍñÄä[›oËÿáOÿi$}šÙžî*Ý΀Ia©ÚpóàÜ?² mûŠ5¼GÈØ nø›üÂW ’¡OÁõiÅ«ƒË-T'öÕOuö]ñ¾õ+-c“Ê/+¥»—.ËuË«6ÞzŇEºì?iî žü»ýìÜxü(pÔÂPŽ€ë>ñøGbk>†’KãØÐ®ÏáÏÔÈ ä:J¤òY”ÖgIþaçÜúé2°@>?½›âìÓôe÷Ó_9ʪµtõ!½þsÖê`#bÄVGœ‰ÿäÑéÃìŸ>Ä ðÆÏ¬Ø$þæÀ@e[Ê+%B@õ091ËÔD}~ŒÓbÛ¢œq›ja„K&ã XaÁΗ±k,‰‡ôÕ'èòRÉ¢»r’¢ó8²±ÌkÀ] ºdqÞÏlI ’ihïFûˆLº]//Û‘·§œ°Ô5€ãˆ¯¬[Õ¹ÍÑ‚Vãè³ÖȤ;(v晜lâjIGIG3uÌt€·¼¿‚VÒ̵¢ã ?üNšocBk2VåLçLFÑ ¡1f*ZÕ×öŒ _ùæìI¹½dk•ÕåÇäÎíw¡T2?¡Pó"l¦§ß[­ À÷|;3\Ή œ¨“}Çø­wˆ×üɼ¼¿ø©BNSÈi\G°¦;Å–emrp2`v.f¦Û´b_HrË¡ÑÚc€óÆr”“‰Á²©P)•Å>ï%G&i6-W«îà€Ú ¤>ðÖoÐÕQ}q÷9‰É•ÜýØ{ξ–cq?SµøýºFïr‰ëgÞòåŒ"¥½y‡ƒ“ž+ñS“uZ­¿eQŒëÏ1;Û ZÂûºr®#q•%kšôÇO°f©¤Ùh AH ss ¼´ÇÉSc?1JœÄÌTkÔfgPŽÄK;øÍ&kû=”N˼vÇ:´çze&«ëiUK?öC§1Û”Œ:Ù­nbÜÄ­vÂɉªÑ"ù¸{èŽÙ/ÝwìMÓsáR?HHžTB³§ÉWëÖ½¡Rî\¯”ØÞYpQRPtDu¢vž®%œš˜fdt˜C‡Òô ­§T,á¸JJGãh;ýûÙ÷Ì^NŽŸDXM.WäÔôQn)ùr‰Ðå‘sK8™Žž:qüú ±ÌÎ4âÁcLnÒwÄÌl›á±dütïg¯ÿôB,´ù£?þ€A¬’Z="¥üÏ'>õªÆ_÷#?HyꆾJGÁÒͳ?øF“£G‡)æ üþ?ÌÈè(–„;¿ý]ÖìücÕ˜(eeÏS÷ß²){ý¯ý³ŸåÂÈì ÃðÕÄÁ¡Ýsí.h?ðÛ_é.{Ë»K)ú*iœp’'ïþ{„dÒYNNŒãû-–,éehÃŽ£Bb­!Žc ¤ÕnÓò[ŒŽ£V«‘ɤéíY‚ßj’Ä ›ßz;±×ʼn©y—JÑ}ÛZ½b1n´# bÓ“O;8Zâ:¿:Çl½ÎlµÎàà ÃGGéè,FF%%BžEA; ÕnaCE ¤«ÒËðÑQ ¥ÆZ\GáhIb,®–/__”€ÈxÙŒÆu$±±¤ËK±‰å¯?ý¦§§yÇÛßÉþñs˜$!‰c¬P´Ú ¬µ$IBGZi”–‹þè£Çq]Š…ù©¿@¥ ÄÆà:!Ž–ÞË"à¶Ïÿl…19r)’‚02¤¼m«¸ó®¯³òÒKÙýônŠÅ"®çR›eåÊ•\³~;íV›jm†09rä(‡¢X*!ßùîÝlܰ‘#GŽÐ2 «S„ÁÕó¡¼ðo{‚[†¼£/I€ ب•$ížÍ'‘aÃÎ÷²÷ÞÏsòä~³Í5[·qàÀ~<×£V«ñÈ£ãy.ÖZÂ0Âu4§NMR(( ´Û=ü Ó3Ól¸év‚È€¸§CkÁÓr#ðÒÈ$YŸÎÎûþ$Ö’ë[Ca` ²1Âí·ßo±rpc'ކF“G~ k-¯Úr¥R‘Á•+‰£˜|%‹ë¸„AHaà*2=H!QÎÙ·¼1­åZàî—$ 6v0ãiœs‚8HŒaÅößàø£wsç]ÿÎŽm;ð[M´Vd2%Rn†OüéŸstd˜‰“c¤2.«V¯B èîîåáG$.¯eÅÕoÆUŠ”£ž7·bp1~‹ Hâdy6­ž³®ã°ô\ù&#|íž{XÝ›cýºµT*Ý”Š%R©ëÖ¬¥§»Bm¶FG©ÌŠåt”:izÌv‘O;tdÏs¿ ÐR,ÉÂ(éÍ¥ß<=Å å\ЉÔ*tçû©¶šüàøqìþCäM“‚;ÿŽ©‡‚9™%›¯ßóU]a٪ͬêÈ ÏÝH!Âö¾d61iW ÒÎ d E¾7G_9Íd=C³Ò¬Çb¦sº‹¤ÛÓdy¥$Îéì›Vó»8G ´” Y9­$®(¥ÐŠ…¶3 0¥%ZŠ…ñ´óu-•V¢C+‘_Œß„ ~¨Á>§ÿóÂÀóÄ…váxKž/Ž|n·Eï Xc³è ÿx9ˆÌËÁäÿÁ¢s/*@y®ÿò°¹xLWۋνøMlì.“˜?ƒ #Mâ0@I’)9]H9ãž­ƒ’%X8¦M+N×Ïöÿù1 ö›~¸ë77­zQ~´#Ÿü¤:vÕÚ”«$88ÎÙsÎÂáLÙáœÓ¸Î9–:ÝÙ=çš :Ì·ã ]mn˜ÙÿÃk¯åöËö¥þbñŠ~'~9ð+¯4~%à•Æÿ¤D;¥#3IEND®B`‚kfritz/icons/CMakeLists.txt0000664000175000017500000000005212065570711014047 0ustar jojokde4_install_icons( ${ICON_INSTALL_DIR} ) kfritz/KFritzModel.cpp0000664000175000017500000000371512067033012013071 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KFritzModel.h" #include KFritzModel::KFritzModel() { inputCodec = QTextCodec::codecForName(fritz::CharSetConv::SystemCharacterTable() ? fritz::CharSetConv::SystemCharacterTable() : "UTF-8"); // create timer, that periodically calls check() in the derived classes // this is used, to refresh connected views in case the library has changed data in the meantime // (e.g., new call in call list, init of phone book) timer = new QTimer(); connect(timer, SIGNAL(timeout()), SLOT(check())); timer->start(1000); } KFritzModel::~KFritzModel() { delete timer; } QModelIndex KFritzModel::index(int row, int column, const QModelIndex & parent) const { if (parent.isValid()) return QModelIndex(); else return createIndex(row, column); } QModelIndex KFritzModel::parent(const QModelIndex & child __attribute__((unused))) const { // always returning QModelIndex() == 'child has no parent'; ignoring parameter return QModelIndex(); } QString KFritzModel::toUnicode(const std::string str) const { return inputCodec->toUnicode(str.c_str()); } std::string KFritzModel::fromUnicode(const QString str) const { return inputCodec->fromUnicode(str).data(); } kfritz/README0000664000175000017500000000521212065570711011057 0ustar jojoThis file contains instructions on installing, a short description and hints on contributing. Please read carefully :-) *Installing* After unpacking the source code, run - make - make install *Description* A KDE program for users of AVMs Fritz!Box to get call signaling and other functions. This program has the following features: * Call notification KFritz connects to the Fritz!Box to inform you about incoming calls. Detailed configuration is possible either in the KFritz user interface or KDE's system settings. To enable this feature you have to dial "#96*5*" with a telephone connected to the Fritz!Box. This works for all firmware versions >= xx.03.99 You may experience problems when trying to dial "#96*5*" with an ISDN telephone. In such a case try to activate "auto keypad", "dial * and #" or some similar setting in your ISDN telephone. If your ISDN telephone contains no keypad support simply use an analogue telephone instead. If you do not want to be notified by every call, you can specify a list of MSNs you are interested on in the plugin\'s setup. Max. 22 monitored MSNs are supported. * Phone book support KFritz supports multiple phonebooks. You can configure which phonebooks are used. The order matters with respect to number lookup. When a call comes in, the plugin tries to resolve the number using the first configured phonebook. If that fails, it tries the second one, and so on. o Fritz!Box phone book This accesses the Fritz!Box phonebook stored on the box itself. o das-oertliche.de/nummerzoeker.com phone books This tries to resolve any number via online directories. o Local Phonebook This is a local CSV file. It must be called "localphonebook.csv" and has to be placed in $KDEHOME/share/apps/kfritz/. Each line contains one entry in the following format: "«name»,«type»,«number»". «type» has to be replaced with a type code (1=home, 2=mobile, 3=work). * Fritz!Box call list Shows the call history. Missed calls are indicated in KDE's system bar. *Contribute* Want to contribute? Bug reports and - even more - patches are always welcome. If you want to translate KFritz in your own language, just use po/kfritz.pot as a template and create your own .po file. Attach your .po file to an email to me for inclusion into the next release of KFritz. Contributors are mentioned in the HISTORY and AUTHORS file including email address. If you do not want this, please point this out in your email. kfritz/KSettingsMisc.h0000664000175000017500000000220412065570711013075 0ustar jojo/* * KFritz * * Copyright (C) 2011 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KSETTINGSMISC_H #define KSETTINGSMISC_H #include #include "ui_KSettingsMisc.h" // use this class to add a configuration page to a KConfigDialog class KSettingsMisc: public QWidget { Q_OBJECT private: Ui_KSettingsMisc *ui; public: KSettingsMisc(QWidget *parent); virtual ~KSettingsMisc(); }; #endif /* KSETTINGSMISC_H_ */ kfritz/KFritzDbusService.cpp0000664000175000017500000000272312067033012014245 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KFritzDbusService.h" #include "KFritzDbusServiceAdaptor.h" #include #include "Log.h" #include "DialDialog.h" KFritzDbusService::KFritzDbusService(KMainWindow *parent) : QObject(parent) { new KFritzDbusServiceAdaptor(this); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject("/KFritz",this); dbus.registerService("org.kde.KFritz"); } void KFritzDbusService::dialNumber(const QString &number) { INF("DBUS dialNumber:" + number.toStdString()); DialDialog d(static_cast(parent()), number.toStdString()); d.exec(); d.clearFocus(); d.setFocus(); d.raise(); d.activateWindow(); } kfritz/kfritz.kcfg0000664000175000017500000000372612065570711012354 0ustar jojo The host name of the Fritz!Box. This is the host name of the Fritz!Box in your network. Most probably this is "fritz.box". As an alternative you can also use the IP address instead of the host name. fritz.box The country code the Fritz!Box is located in. This is the country code your Fritz!Box is located in. Normally this is read automatically from your Fritz!Box so you do not need to specify it here. 49 The area code the Fritz!Box is located in. This is the area code your Fritz!Box is located in. Normally this is read automatically from your Fritz!Box so you do not need to specify it here. List of active phone books. LOCL,FRITZ,OERT true kfritz/QAdaptTreeView.h0000664000175000017500000000211612067033023013165 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef QADAPTTREEVIEW_H #define QADAPTTREEVIEW_H #include class QAdaptTreeView: public QTreeView { Q_OBJECT public: QAdaptTreeView(QWidget *parent); virtual ~QAdaptTreeView(); void adaptColumns(); private slots: virtual void reset(); }; #endif /* QADAPTTREEVIEW_H_ */ kfritz/KCalllistModel.h0000664000175000017500000000337712067033023013215 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KCALLLISTMODEL_H #define KCALLLISTMODEL_H #include #include "KFritzModel.h" class KCalllistModel : public KFritzModel { Q_OBJECT public: KCalllistModel(); virtual ~KCalllistModel(); virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual fritz::CallEntry *retrieveCallEntry(const QModelIndex &index) const; virtual void sort(int column, Qt::SortOrder order); virtual std::string number(const QModelIndex &index) const; virtual std::string name(const QModelIndex &index) const; private: fritz::CallList *calllist; time_t lastCall; private Q_SLOTS: virtual void check(); }; #endif /* KCALLLISTMODEL_H_ */ kfritz/DialDialog.ui0000664000175000017500000000247612065570711012540 0ustar jojo DialDialog 0 0 191 65 Number Provider KLineEdit QLineEdit

klineedit.h
KComboBox QComboBox
kcombobox.h
kfritz/LibFritzInit.h0000664000175000017500000000236012067033023012712 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef LIBFRITZINIT_H #define LIBFRITZINIT_H #include #include class LibFritzInit : public QThread { Q_OBJECT; public: LibFritzInit(QString password, fritz::EventHandler *eventHandler); virtual ~LibFritzInit(); void run(); void setPassword(QString password); private: QString password; fritz::EventHandler *eventHandler; Q_SIGNALS: void ready(bool isReady); void invalidPassword(); }; #endif /* LIBFRITZINIT_H_ */ kfritz/Makefile0000664000175000017500000000410612065575710011644 0ustar jojoVERSION = $(shell grep 'static const char \*VERSION *=' main.cpp | awk '{ print $$6 }' | sed -e 's/[";]//g') WDIR = $(shell pwd) ifdef DEVELOPMENT_INSTALL CWD = $(shell pwd) PREFIX = ${CWD}/build/install ifeq ($(shell uname -m),x86_64) LIB=lib64 else LIB=lib endif CMAKE_OPTS = -DCMAKE_INSTALL_PREFIX=${PREFIX} -DLIB_INSTALL_DIR=${PREFIX}/${LIB} endif cmake: LibFritzI18N.cpp @if test ! -d build; \ then mkdir -p build; \ cd build; cmake ${CMAKE_OPTS} ..; \ fi cmake-debug: LibFritzI18N.cpp @if test ! -d build; \ then mkdir -p build; \ cd build; cmake -DCMAKE_BUILD_TYPE:STRING=Debug ${CMAKE_OPTS} ..; \ fi all: cmake cd build; make debug: cmake-debug cd build; make clean: @-make -C libfritz++ clean @-rm ../kfritz-${VERSION}.orig.tar.gz @-rm -rf build dist: clean update-po tar cvz --dereference --exclude=l10n-kde4 \ --exclude-vcs --exclude="debian" --exclude=".settings" --exclude=".project" \ --exclude=".cproject" --exclude=".cdtproject" --exclude="test" --exclude="test.old" --exclude=".git*" \ -f ../kfritz_${VERSION}.orig.tar.gz ../kfritz fetch-po: @if test ! -d l10n-kde4; \ then svn co --depth=immediates svn+ssh://joachimwilke@svn.kde.org/home/kde/trunk/l10n-kde4/ ; \ for LCODE in `cat l10n-kde4/subdirs`; do svn up --set-depth=empty l10n-kde4/$$LCODE/messages/ ; done ; \ for LCODE in `cat l10n-kde4/subdirs`; do svn up --set-depth=files l10n-kde4/$$LCODE/messages/playground-network/ ; done ; \ fi update-po: fetch-po svn up l10n-kde4 for LCODE in `cat l10n-kde4/subdirs`; do \ if test -e l10n-kde4/$$LCODE/messages/playground-network/kfritz.po; then \ cp l10n-kde4/$$LCODE/messages/playground-network/kfritz.po po/$$LCODE.po ; fi ; done LibFritzI18N.cpp: libfritz++/*.cpp mv $@ $@.old cat $@.old | grep -v i18n > $@ rm $@.old grep -ir I18N_NOOP libfritz++/*.cpp | sed -e 's/.*I18N_NOOP(\([^)]*\).*/i18n(\1)/' | sort | uniq >> $@ install: all cd build; make install deb: dist debuild -i"(\.svn|\.settings|\.(c|cdt|)project|test)" deb-src: dist debuild -S -i"(\.svn|\.settings|\.(c|cdt|)project|test)" kfritz/org.kde.KFritz.xml0000664000175000017500000000046112065570711013463 0ustar jojo kfritz/ContainerWidget.cpp0000664000175000017500000000242212065570711013771 0ustar jojo/* * KFritz * * Copyright (C) 2011 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ContainerWidget.h" ContainerWidget::ContainerWidget(QWidget *parent, QAdaptTreeView *treeview, KFonbookModel *model) : QWidget(parent) { this->treeview = treeview; this->fonbookModel = model; this->calllistModel = NULL; } ContainerWidget::ContainerWidget(QWidget *parent, QAdaptTreeView *treeview, KCalllistProxyModel *model) : QWidget(parent) { this->treeview = treeview; this->fonbookModel = NULL; this->calllistModel = model; } ContainerWidget::~ContainerWidget() { } kfritz/Messages.sh0000664000175000017500000000021312065570711012276 0ustar jojo#!/bin/sh $EXTRACTRC `find . -name "*.ui" -o -name "*.kcfg"` >> rc.cpp $XGETTEXT `find . -name "*.cpp"` -o $podir/kfritz.pot rm -rf rc.cpp kfritz/KSettings.kcfgc0000664000175000017500000000014612065570711013112 0ustar jojoFile=kfritz.kcfg ClassName=KSettings ItemAccessors=true Mutators=true Singleton=true SetUserTexts=truekfritz/AUTHORS0000664000175000017500000000141712067266265011262 0ustar jojoDevelopers: * Joachim Wilke * Matthias Becker Contributors: * Christian * Christian Mangold * Richard Bos * Sebastian Trueg (alias trueg / kde-apps.org) * Tobias Roeser (alias lefou / kde-apps.org) * Mark Peter Wege * Markus Haitzer * Christoph Rauch * Urs Aregger * Michael Speier * Fabio Pirrello * Kurt Wanner * Honky * Achim Bohnet * Felix Geyer * Christian Holzberger * Sofasurfer kfritz/KFritzWindow.cpp0000664000175000017500000007104212067033012013276 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KFritzWindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ContainerWidget.h" #include "DialDialog.h" #include "KCalllistProxyModel.h" #include "KSettings.h" #include "KSettingsFonbooks.h" #include "KSettingsFritzBox.h" #include "KSettingsMisc.h" #include "Log.h" #include "MimeFonbookEntry.h" KFritzWindow::KFritzWindow() { appName = KGlobal::mainComponent().aboutData()->appName(); programName = KGlobal::mainComponent().aboutData()->programName(); notification = NULL; connect(this, SIGNAL(signalNotification(QString, QString, bool)), this, SLOT(slotNotification(QString, QString, bool))); dbusIface = new KFritzDbusService(this); initIndicator(); updateMissedCallsIndicator(); progressIndicator = NULL; logDialog = new LogDialog(this); KTextEdit *logArea = logDialog->getLogArea(); fritz::Config::SetupLogging(LogStream::getLogStream(LogBuf::DEBUG)->setLogWidget(logArea), LogStream::getLogStream(LogBuf::INFO)->setLogWidget(logArea), LogStream::getLogStream(LogBuf::ERROR)->setLogWidget(logArea)); bool savetoWallet = false; bool requestPassword = true; KWallet::Wallet *wallet = KWallet::Wallet::openWallet(KWallet::Wallet::LocalWallet(), winId()); if (wallet) { if (wallet->hasFolder(appName)) { wallet->setFolder(appName); if (wallet->hasEntry(KSettings::hostname())) { if (wallet->readPassword(KSettings::hostname(), fbPassword) == 0) { DBG("Got password data from KWallet."); requestPassword = false; } } else { DBG("No password for this host available."); } } else { DBG("No relevant data in KWallet yet."); } } else { INF("No access to KWallet."); } if (requestPassword) savetoWallet = showPasswordDialog(fbPassword, wallet != NULL); tabWidget = NULL; libFritzInit = new LibFritzInit(fbPassword, this); connect(libFritzInit, SIGNAL(ready(bool)), this, SLOT(showStatusbarBoxBusy(bool))); connect(libFritzInit, SIGNAL(invalidPassword()), this, SLOT(reenterPassword())); connect(libFritzInit, SIGNAL(ready(bool)), this, SLOT(updateMainWidgets(bool))); libFritzInit->start(); if (wallet && savetoWallet) saveToWallet(wallet); setupActions(); inputCodec = QTextCodec::codecForName(fritz::CharSetConv::SystemCharacterTable() ? fritz::CharSetConv::SystemCharacterTable() : "UTF-8"); setupGUI(); KXmlGuiWindow::stateChanged("NoEdit"); KXmlGuiWindow::stateChanged("NoFB"); // remove handbook menu entry actionCollection()->action("help_contents")->setVisible(false); } KFritzWindow::~KFritzWindow() { // move logging to console fritz::Config::SetupLogging(&std::clog, &std::cout, &std::cerr); delete dbusIface; delete libFritzInit; } QString KFritzWindow::toUnicode(const std::string string) const { return inputCodec->toUnicode(string.c_str()); } void KFritzWindow::HandleCall(bool outgoing, int connId __attribute__((unused)), std::string remoteNumber, std::string remoteName, fritz::FonbookEntry::eType type, std::string localParty __attribute__((unused)), std::string medium __attribute__((unused)), std::string mediumName) { QString qRemoteName = toUnicode(remoteName); QString qTypeName = KFonbookModel::getTypeName(type); if (qTypeName.size() > 0) qRemoteName += " (" + qTypeName + ')'; //QString qLocalParty = toUnicode(localParty); QString qMediumName = toUnicode(mediumName); QString qMessage; if (outgoing) qMessage=i18n("Outgoing call to %1
using %2", qRemoteName.size() ? qRemoteName : remoteNumber.c_str(), qMediumName); else qMessage=i18n("Incoming call from %1
using %2", qRemoteName.size() ? qRemoteName : remoteNumber.size() ? remoteNumber.c_str() : i18n("unknown"), qMediumName); emit signalNotification(outgoing ? "outgoingCall" : "incomingCall", qMessage, true); } void KFritzWindow::HandleConnect(int connId __attribute__((unused))) { if (notification) notification->close(); emit signalNotification("callConnected", i18n("Call connected."), false); } void KFritzWindow::HandleDisconnect(int connId __attribute__((unused)), std::string duration) { if (notification) notification->close(); std::stringstream ss(duration); int seconds; ss >> seconds; QTime time(seconds/3600,seconds%3600/60,seconds%60); QString qMessage = i18n("Call disconnected (%1).", time.toString("H:mm:ss")); emit signalNotification("callDisconnected", qMessage, false); } void KFritzWindow::slotNotification(QString event, QString qMessage, bool persistent) { notification = new KNotification (event, this, persistent ? KNotification::Persistent : KNotification::CloseOnTimeout); KIcon ico(event == "incomingCall" ? "incoming-call" : event == "outgoingCall" ? "outgoing-call" : "internet-telephony"); //krazy:exclude=spelling notification->setTitle(programName); notification->setPixmap(ico.pixmap(64, 64)); notification->setText(qMessage); notification->sendEvent(); connect(notification, SIGNAL(closed()), this, SLOT(notificationClosed())); } void KFritzWindow::notificationClosed() { notification = NULL; } void KFritzWindow::showSettings() { KConfigDialog *confDialog = new KConfigDialog(this, "settings", KSettings::self()); QWidget *frameFritzBox = new KSettingsFritzBox(this); confDialog->addPage(frameFritzBox, i18n("Fritz!Box"), "modem", i18n("Configure connection to Fritz!Box")); QWidget *frameFonbooks = new KSettingsFonbooks(this); confDialog->addPage(frameFonbooks, i18n("Phone books"), "x-office-address-book", i18n("Select phone books to use")); QWidget *frameMisc = new KSettingsMisc(this); confDialog->addPage(frameMisc, i18n("Other"), "preferences-other", i18n("Configure other settings")); connect(confDialog, SIGNAL(settingsChanged(const QString &)), this, SLOT(updateConfiguration(const QString &))); confDialog->show(); } void KFritzWindow::showNotificationSettings() { KNotifyConfigWidget::configure(this); } void KFritzWindow::updateConfiguration(const QString &dialogName __attribute__((unused))) { // stop any pending initialization libFritzInit->terminate(); showStatusbarBoxBusy(true); // clean up before changing the configuration fritz::Config::Shutdown(); libFritzInit->setPassword(fbPassword); libFritzInit->start(); } void KFritzWindow::reenterPassword() { KWallet::Wallet *wallet = KWallet::Wallet::openWallet(KWallet::Wallet::LocalWallet(), 0); bool keepPassword = showPasswordDialog(fbPassword, wallet != NULL); if (wallet && keepPassword) saveToWallet(wallet); updateConfiguration(); } void KFritzWindow::saveToWallet(KWallet::Wallet *wallet) { DBG("Trying to save password..."); if (wallet->hasFolder(appName) || wallet->createFolder(appName)) { wallet->setFolder(appName); if (wallet->writePassword(KSettings::hostname(), fbPassword) == 0) { INF("Saved password to KWallet."); } } else { ERR("Error accessing KWallet.") } } bool KFritzWindow::showPasswordDialog(QString &password, bool offerSaving) { KPasswordDialog pwd(this, offerSaving ? KPasswordDialog::ShowKeepPassword : KPasswordDialog::NoFlags); pwd.setPrompt(i18n("Enter your Fritz!Box password")); pwd.exec(); password = pwd.password(); return pwd.keepPassword(); } void KFritzWindow::setupActions() { KAction* aShowSettings = new KAction(this); aShowSettings->setText(i18n("Configure KFritz...")); aShowSettings->setIcon(KIcon("preferences-other")); actionCollection()->addAction("showSettings", aShowSettings); connect(aShowSettings, SIGNAL(triggered(bool)), this, SLOT(showSettings())); KAction* aShowNotifySettings = new KAction(this); aShowNotifySettings->setText(i18n("Configure Notifications...")); aShowNotifySettings->setIcon(KIcon("preferences-desktop-notification")); actionCollection()->addAction("showNotifySettings", aShowNotifySettings); connect(aShowNotifySettings, SIGNAL(triggered(bool)), this, SLOT(showNotificationSettings())); KAction *aShowLog = new KAction(this); aShowLog->setText(i18n("Show log")); aShowLog->setIcon(KIcon("text-x-log")); actionCollection()->addAction("showLog", aShowLog); connect(aShowLog, SIGNAL(triggered(bool)), this, SLOT(showLog())); KAction *aDialNumber = new KAction(this); aDialNumber->setText(i18n("Dial number")); aDialNumber->setIcon(KIcon("internet-telephony")); //krazy:exclude=spelling actionCollection()->addAction("dialNumber", aDialNumber); connect(aDialNumber, SIGNAL(triggered(bool)), this, SLOT(dialNumber())); KAction *aCopyNumber = new KAction(this); aCopyNumber->setText(i18n("Copy number to clipboard")); aCopyNumber->setIcon(KIcon("edit-copy")); actionCollection()->addAction("copyNumber", aCopyNumber); connect(aCopyNumber, SIGNAL(triggered(bool)), this, SLOT(copyNumberToClipboard())); KAction *aSetDefault = new KAction(this); aSetDefault->setText(i18n("Set as default")); aSetDefault->setIcon(KIcon("favorites")); actionCollection()->addAction("setDefault", aSetDefault); connect(aSetDefault, SIGNAL(triggered(bool)), this, SLOT(setDefault())); KSelectAction *aSetType = new KSelectAction(this); aSetType->setText(i18n("Set type")); // WARNING: mapIndexToType() has to be checked if code changes here: for (size_t p = fritz::FonbookEntry::TYPE_HOME; p < fritz::FonbookEntry::TYPES_COUNT; p++) { aSetType->addAction(KFonbookModel::getTypeName((fritz::FonbookEntry::eType) p)); } actionCollection()->addAction("setType", aSetType); connect(aSetType, SIGNAL(triggered(int)), this, SLOT(setType(int))); //TODO: Set Important KAction *aReload = new KAction(this); aReload->setText(i18n("Reload")); aReload->setIcon(KIcon("view-refresh")); actionCollection()->addAction("reload", aReload); connect(aReload, SIGNAL(triggered(bool)), this, SLOT(reload())); KAction *aReconnectISP = new KAction(this); aReconnectISP->setText(i18n("Reconnect to the Internet")); aReconnectISP->setIcon(KIcon("network-workgroup")); actionCollection()->addAction("reconnectISP", aReconnectISP); connect(aReconnectISP, SIGNAL(triggered(bool)), this, SLOT(reconnectISP())); KAction *aGetIP = new KAction(this); aGetIP->setText(i18n("Get current IP address")); aGetIP->setIcon(KIcon("network-server")); actionCollection()->addAction("getIP", aGetIP); connect(aGetIP, SIGNAL(triggered(bool)), this, SLOT(getIP())); KAction *aAddEntry = new KAction(this); aAddEntry->setText(i18n("Add")); aAddEntry->setIcon(KIcon("list-add")); aAddEntry->setShortcut(Qt::CTRL + Qt::Key_N); actionCollection()->addAction("addEntry", aAddEntry); connect(aAddEntry, SIGNAL(triggered(bool)), this, SLOT(addEntry())); KAction *aDeleteEntry = new KAction(this); aDeleteEntry->setText(i18n("Delete")); aDeleteEntry->setIcon(KIcon("list-remove")); aDeleteEntry->setShortcut(Qt::Key_Delete); actionCollection()->addAction("deleteEntry", aDeleteEntry); connect(aDeleteEntry, SIGNAL(triggered(bool)), this, SLOT(deleteEntry())); KAction *aResolveNumber = new KAction(this); aResolveNumber->setText(i18n("Look up number in phone books")); actionCollection()->addAction("resolveNumber", aResolveNumber); connect(aResolveNumber, SIGNAL(triggered(bool)), this, SLOT(resolveNumber())); KAction *aSeparator; aSeparator = new KAction(this); aSeparator->setSeparator(true); actionCollection()->addAction("separator1", aSeparator); aSeparator = new KAction(this); aSeparator->setSeparator(true); actionCollection()->addAction("separator2", aSeparator); KStandardAction::save(this, SLOT(save()), actionCollection()); KStandardAction::cut(this, SLOT(cutEntry()), actionCollection()); KStandardAction::copy(this, SLOT(copyEntry()), actionCollection()); KStandardAction::paste(this, SLOT(pasteEntry()), actionCollection()); KStandardAction::quit(this, SLOT(quit()), actionCollection()); } void KFritzWindow::initIndicator() { missedCallsIndicator = NULL; #ifdef INDICATEQT_FOUND QIndicate::Server *iServer = NULL; iServer = QIndicate::Server::defaultInstance(); iServer->setType("message.irc"); KService::Ptr service = KService::serviceByDesktopName(appName); if (service) iServer->setDesktopFile(service->entryPath()); iServer->show(); missedCallsIndicator = new QIndicate::Indicator(iServer); missedCallsIndicator->setNameProperty(i18n("Missed calls")); missedCallsIndicator->setDrawAttentionProperty(true); connect(iServer, SIGNAL(serverDisplay()), this, SLOT(showMainWindow())); connect(missedCallsIndicator, SIGNAL(display(QIndicate::Indicator*)), this, SLOT(showMissedCalls(QIndicate::Indicator*))); #endif } bool KFritzWindow::queryClose() { // don't quit, just minimize to systray hide(); return false; } void KFritzWindow::updateMissedCallsIndicator() { fritz::CallList *callList = fritz::CallList::getCallList(false); if (!callList) return; #ifdef INDICATEQT_FOUND size_t missedCallCount = callList->MissedCalls(KSettings::lastKnownMissedCall()); missedCallsIndicator->setCountProperty(missedCallCount); if (missedCallCount == 0) missedCallsIndicator->hide(); else missedCallsIndicator->show(); #endif } void KFritzWindow::showStatusbarBoxBusy(bool b) { if (!b) setProgressIndicator(i18n("Retrieving data from Fritz!Box...")); else setProgressIndicator(); } void KFritzWindow::updateMainWidgets(bool b) { if (!b) { if (tabWidget) { delete tabWidget; treeCallList = NULL; } tabWidget = new KTabWidget(); tabWidget->setMovable(true); setCentralWidget(tabWidget); return; } // init call list, add to tabWidget KCalllistModel *modelCalllist; modelCalllist = new KCalllistModel(); connect(modelCalllist, SIGNAL(updated()), this, SLOT(updateMissedCallsIndicator())); treeCallList = new QAdaptTreeView(this); treeCallList->setAlternatingRowColors(true); treeCallList->setItemsExpandable(false); treeCallList->setSortingEnabled(true); treeCallList->addAction(actionCollection()->action("edit_copy")); treeCallList->addAction(actionCollection()->action("separator1")); treeCallList->addAction(actionCollection()->action("dialNumber")); treeCallList->addAction(actionCollection()->action("copyNumber")); treeCallList->addAction(actionCollection()->action("resolveNumber")); treeCallList->setContextMenuPolicy(Qt::ActionsContextMenu); treeCallList->sortByColumn(1, Qt::DescendingOrder); //sort by Date // init proxy class for filtering KCalllistProxyModel *proxyModelCalllist = new KCalllistProxyModel(this); proxyModelCalllist->setSourceModel(modelCalllist); treeCallList->setModel(proxyModelCalllist); // search line widget KFilterProxySearchLine *search = new KFilterProxySearchLine(this); search->setProxy(proxyModelCalllist); // setup final calllist widget ContainerWidget *calllistContainer = new ContainerWidget(this, treeCallList, proxyModelCalllist); new QVBoxLayout(calllistContainer); calllistContainer->layout()->addWidget(search); calllistContainer->layout()->addWidget(treeCallList); tabWidget->insertTab(0, calllistContainer, KIcon("application-x-gnumeric"), i18n("Call history")); // init fonbooks, add to tabWidget fritz::FonbookManager *fm = fritz::FonbookManager::GetFonbookManager(); std::string first = fm->GetTechId(); if (first.length()) { do { KFonbookModel *modelFonbook = new KFonbookModel(fm->GetTechId()); connect(modelFonbook, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateFonbookState())); QAdaptTreeView *treeFonbook = new QAdaptTreeView(this); treeFonbook->setAlternatingRowColors(true); treeFonbook->setItemsExpandable(true); treeFonbook->setSortingEnabled(true); treeFonbook->setModel(modelFonbook); treeFonbook->sortByColumn(0, Qt::AscendingOrder); //sort by Name treeFonbook->addAction(actionCollection()->action("edit_cut")); treeFonbook->addAction(actionCollection()->action("edit_copy")); treeFonbook->addAction(actionCollection()->action("edit_paste")); treeFonbook->addAction(actionCollection()->action("separator1")); treeFonbook->addAction(actionCollection()->action("addEntry")); treeFonbook->addAction(actionCollection()->action("deleteEntry")); treeFonbook->addAction(actionCollection()->action("separator2")); treeFonbook->addAction(actionCollection()->action("dialNumber")); treeFonbook->addAction(actionCollection()->action("copyNumber")); treeFonbook->addAction(actionCollection()->action("setDefault")); treeFonbook->addAction(actionCollection()->action("setType")); treeFonbook->setContextMenuPolicy(Qt::ActionsContextMenu); connect(treeFonbook->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(updateFonbookContextMenu(const QModelIndex&, const QModelIndex&))); //TODO: also reaction on data changes (dataChanged on model) //TODO: TAB-order by row (not by column) reimplement moveCursor( ) ContainerWidget *fonbookContainer = new ContainerWidget(this, treeFonbook, modelFonbook); new QVBoxLayout(fonbookContainer); fonbookContainer->layout()->addWidget(treeFonbook); tabWidget->insertTab(0, fonbookContainer, KIcon("x-office-address-book"), i18n(fm->GetTitle().c_str())); fm->NextFonbook(); } while( first != fm->GetTechId() ); } connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateActionProperties(int))); connect(tabWidget, SIGNAL(currentChanged(int)), statusBar(), SLOT(clearMessage())); updateActionProperties(tabWidget->currentIndex()); connect(treeCallList->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(updateCallListContextMenu(const QModelIndex&, const QModelIndex&))); } void KFritzWindow::save() { ContainerWidget *container = static_cast(tabWidget->currentWidget()); if (container->isFonbook()) { std::string techid = container->getFonbookModel()->getFonbook()->GetTechId(); fritz::FonbookManager *fm = fritz::FonbookManager::GetFonbookManager(); fritz::Fonbooks *fbs = fm->GetFonbooks(); fritz::Fonbook *fb = (*fbs)[techid]; fb->Save(); statusBar()->showMessage(i18n("%1 saved.", toUnicode(fb->GetTitle())), 0); updateFonbookState(); } } //TODO: quit using systray void KFritzWindow::quit() { // check for pending changes fritz::FonbookManager *fm = fritz::FonbookManager::GetFonbookManager(); std::string first = fm->GetTechId(); if (first.length()) { do { if (fm->isModified()) { switch (KMessageBox::warningYesNoCancel( this, i18n("Save changes to %1?", fm->GetTitle().c_str()))) { case KMessageBox::Yes : fm->Save(); break; case KMessageBox::No : break; default: // cancel return; } } fm->NextFonbook(); } while (first != fm->GetTechId()); } QApplication::quit(); } void KFritzWindow::showMainWindow() { this->show(); } void KFritzWindow::showMissedCalls(QIndicate::Indicator* indicator __attribute__((unused))) { tabWidget->setCurrentWidget(treeCallList); this->show(); #ifdef INDICATEQT_FOUND if (missedCallsIndicator) missedCallsIndicator->hide(); #endif fritz::CallList *callList = fritz::CallList::getCallList(false); KSettings::setLastKnownMissedCall(callList->LastMissedCall()); KSettings::self()->writeConfig(); updateMissedCallsIndicator(); } void KFritzWindow::showLog() { logDialog->show(); } std::string KFritzWindow::getCurrentNumber() { ContainerWidget *container = static_cast(tabWidget->currentWidget()); QAdaptTreeView *treeView = container->getTreeView(); if (container->isFonbook()) { return container->getFonbookModel()->number(treeView->currentIndex()); } else if (container->isCalllist()) { return container->getCalllistModel()->number(treeView->currentIndex()); } return ""; } void KFritzWindow::dialNumber() { DialDialog d(this, getCurrentNumber()); d.exec(); } void KFritzWindow::copyNumberToClipboard() { KApplication::kApplication()->clipboard()->setText(getCurrentNumber().c_str()); } void KFritzWindow::setDefault() { ContainerWidget *container = static_cast(tabWidget->currentWidget()); QAdaptTreeView *treeView = container->getTreeView(); if (container->isFonbook()) { container->getFonbookModel()->setDefault(treeView->currentIndex()); } } fritz::FonbookEntry::eType KFritzWindow::mapIndexToType(int index) { return static_cast(index+1); } void KFritzWindow::setType(int index) { ContainerWidget *container = static_cast(tabWidget->currentWidget()); QAdaptTreeView *treeView = container->getTreeView(); if (container->isFonbook()) { container->getFonbookModel()->setType(treeView->currentIndex(), mapIndexToType(index)); } } void KFritzWindow::reload() { updateConfiguration(); //TODO: pending changes are lost without warning } void KFritzWindow::reconnectISP() { fritz::FritzClient *fc = fritz::gConfig->fritzClientFactory->create(); if (fc->reconnectISP()) KMessageBox::information(this, i18n("Reconnect initiated.")); else KMessageBox::error(this, i18n("Reconnect failed.")); delete fc; } void KFritzWindow::getIP() { fritz::FritzClient *fc = fritz::gConfig->fritzClientFactory->create();; std::string ip = fc->getCurrentIP(); delete fc; KMessageBox::information(this, i18n("Current IP address is: %1", ip.size() ? ip.c_str() : i18n("unknown"))); } void KFritzWindow::addEntry(fritz::FonbookEntry *fe) { ContainerWidget *container = static_cast(tabWidget->currentWidget()); QAdaptTreeView *treeView = container->getTreeView(); if (container->isFonbook()) { KFonbookModel *model = container->getFonbookModel(); if (fe) model->insertFonbookEntry(treeView->currentIndex(), *fe); else model->insertRows(container->getTreeView()->currentIndex().row(), 1, QModelIndex()); treeView->scrollTo(container->getTreeView()->currentIndex()); treeView->setCurrentIndex(model->index(treeView->currentIndex().row()-1,0,QModelIndex())); } } void KFritzWindow::deleteEntry() { ContainerWidget *container = static_cast(tabWidget->currentWidget()); QAdaptTreeView *treeView = container->getTreeView(); if (container->isFonbook()) { KFonbookModel *model = container->getFonbookModel(); size_t newRow = treeView->currentIndex().row(); if (treeView->currentIndex().row() == model->rowCount()-1) newRow--; QModelIndex index = model->index(newRow, treeView->currentIndex().column()); model->removeRows(treeView->currentIndex().row(), 1, QModelIndex()); treeView->setCurrentIndex(index); } } void KFritzWindow::cutEntry() { copyEntry(); deleteEntry(); } void KFritzWindow::copyEntry() { ContainerWidget *container = static_cast(tabWidget->currentWidget()); QAdaptTreeView *treeView = container->getTreeView(); if (container->isFonbook()) { KFonbookModel *model = container->getFonbookModel(); const fritz::FonbookEntry *fe = model->retrieveFonbookEntry(treeView->currentIndex()); QMimeData* mimeData = new MimeFonbookEntry(*fe); QApplication::clipboard()->setMimeData(mimeData); } if (container->isCalllist()) { KCalllistProxyModel *model = container->getCalllistModel(); const fritz::CallEntry *ce = model->retrieveCallEntry(treeView->currentIndex()); fritz::FonbookEntry fe(ce->remoteName); fe.AddNumber(0, ce->remoteNumber, fritz::FonbookEntry::TYPE_NONE); QMimeData* mimeData = new MimeFonbookEntry(fe); QApplication::clipboard()->setMimeData(mimeData); } } void KFritzWindow::pasteEntry() { const QMimeData *mime = QApplication::clipboard()->mimeData(); if (mime) { const MimeFonbookEntry *mimeFonbookEntry = qobject_cast(mime); if (mimeFonbookEntry) { fritz::FonbookEntry *fe = mimeFonbookEntry->retrieveFonbookEntry(); if (fe) addEntry(fe); } } } void KFritzWindow::resolveNumber() { ContainerWidget *container = static_cast(tabWidget->currentWidget()); if (container->isCalllist()) { std::string currentNumber = getCurrentNumber(); fritz::Fonbook::sResolveResult result = fritz::FonbookManager::GetFonbook()->ResolveToName(currentNumber); if (!result.name.compare(currentNumber)) { statusBar()->showMessage(i18n("%1 did not resolve.", toUnicode(currentNumber)), 0); } else { KCalllistProxyModel *model = container->getCalllistModel(); for (int pos = 0; pos < model->rowCount(QModelIndex()); pos++) { fritz::CallEntry *entry = model->retrieveCallEntry(model->index(pos, 0, QModelIndex())); if (entry->MatchesRemoteNumber(currentNumber)) entry->remoteName = result.name; } statusBar()->showMessage(i18n("%1 resolves to \"%2\".", toUnicode(currentNumber), toUnicode(result.name), 0)); } } } void KFritzWindow::updateActionProperties(int tabIndex __attribute__((unused))) { KXmlGuiWindow::stateChanged("NoEdit"); ContainerWidget *container = static_cast(tabWidget->currentWidget()); if (container->isFonbook()) { if (container->getFonbookModel()->flags(QModelIndex()) & QFlag(Qt::ItemIsEditable)) KXmlGuiWindow::stateChanged("WriteableFB"); if (container->getFonbookModel()->getFonbook()->isModified()) KXmlGuiWindow::stateChanged("DirtyFB"); else KXmlGuiWindow::stateChanged("CleanFB"); } else { KXmlGuiWindow::stateChanged("NoFB"); } } void KFritzWindow::updateCallListContextMenu(const QModelIndex ¤t, const QModelIndex &previous __attribute__((unused))) { ContainerWidget *container = static_cast(tabWidget->currentWidget()); if (container->isCalllist()) { KCalllistProxyModel *model = container->getCalllistModel(); bool canResolve = (model->name(current).compare(model->number(current)) == 0); actionCollection()->action("resolveNumber")->setEnabled(canResolve); } } void KFritzWindow::updateFonbookContextMenu(const QModelIndex ¤t, const QModelIndex &previous __attribute__((unused))) { ContainerWidget *container = static_cast(tabWidget->currentWidget()); KSelectAction *action = static_cast(actionCollection()->action("setType")); if (container->isFonbook()) { if (current.column() > 0 && current.column() <= ((int) fritz::FonbookEntry::MAX_NUMBERS)) { KFonbookModel *model = container->getFonbookModel(); const fritz::FonbookEntry *entry = model->retrieveFonbookEntry(current); fritz::FonbookEntry::eType type = entry->GetType(current.column()-1); if (entry->GetNumber(current.column()-1).size()) { action->setCurrentItem(type-1); action->setEnabled(true); } else { action->setEnabled(false); } } else { action->setEnabled(false); } } } void KFritzWindow::updateFonbookState() { ContainerWidget *container = static_cast(tabWidget->currentWidget()); if (container->isFonbook()) { if (container->getFonbookModel()->getFonbook()->isModified()) KXmlGuiWindow::stateChanged("DirtyFB"); else KXmlGuiWindow::stateChanged("CleanFB"); } else { KXmlGuiWindow::stateChanged("NoFB"); } } void KFritzWindow::setProgressIndicator(QString message) { if (!message.length()) { if (progressIndicator) { statusBar()->removeWidget(progressIndicator); delete progressIndicator; progressIndicator = NULL; } } else { progressIndicator = new QWidget(statusBar()); new QHBoxLayout(progressIndicator); QProgressBar *bar = new QProgressBar(progressIndicator); bar->setMaximum(0); bar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); bar->resize(100, 0); QLabel *label = new QLabel(message, progressIndicator); label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); progressIndicator->layout()->addWidget(label); progressIndicator->layout()->addWidget(bar); progressIndicator->layout()->setMargin(0); statusBar()->insertPermanentWidget(0, progressIndicator); } } kfritz/QAdaptTreeView.cpp0000664000175000017500000000244612067033012013524 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "QAdaptTreeView.h" #include "KCalllistProxyModel.h" #include "KFritzModel.h" QAdaptTreeView::QAdaptTreeView(QWidget *parent) :QTreeView(parent) { } QAdaptTreeView::~QAdaptTreeView() { delete model(); } void QAdaptTreeView::reset() { QTreeView::reset(); expandAll(); adaptColumns(); } void QAdaptTreeView::adaptColumns() { // Resize the column to the size of its contents for (int col=0; col < model()->columnCount(QModelIndex()); col++) resizeColumnToContents(col); } kfritz/KSettingsFonbooks.ui0000664000175000017500000000121012065570711014144 0ustar jojo KSettingsFonbooks 0 0 458 292 KActionSelector QWidget
kactionselector.h
kfritz/KFritzDbusService.h0000664000175000017500000000245312067033023013714 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KFRITZDBUSSERVICE_H #define KFRITZDBUSSERVICE_H #include #include #include /** DBus Service for KFritz will register at org.kde.KFritz */ class KFritzDbusService : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.kde.KFritz") public: KFritzDbusService(KMainWindow *parent); public Q_SLOTS: /** dial a number through kfritz */ void dialNumber(const QString &number); }; #endif kfritz/LogDialog.cpp0000664000175000017500000000231412067033012012532 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "LogDialog.h" #include LogDialog::LogDialog(QWidget *parent) :KDialog(parent) { setButtons(Close | Reset); logArea = new KTextEdit(this); logArea->setReadOnly(true); setMainWidget(logArea); connect(this, SIGNAL(resetClicked()), this, SLOT(resetLog())); resize(640,480); setCaption(i18n("Log")); hide(); } LogDialog::~LogDialog() { } void LogDialog::resetLog() { logArea->clear(); } kfritz/LogDialog.h0000664000175000017500000000216312067033023012203 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef LOGDIALOG_H #define LOGDIALOG_H #include #include class LogDialog: public KDialog { Q_OBJECT private: KTextEdit *logArea; public: LogDialog(QWidget *parent); virtual ~LogDialog(); KTextEdit *getLogArea() { return logArea; } public Q_SLOTS: void resetLog(); }; #endif /* LOGDIALOG_H_ */ kfritz/kfritz.desktop0000664000175000017500000000720312065570711013105 0ustar jojo[Desktop Entry] Name=KFritz Name[cs]=KFritz Name[de]=KFritz Name[es]=KFritz Name[et]=KFritz Name[fr]=KFritz Name[ga]=KFritz Name[gl]=KFritz Name[hu]=KFritz Name[km]=KFritz Name[nds]=KFritz Name[nl]=KFritz Name[pl]=KFritz Name[pt]=KFritz Name[pt_BR]=KFritz Name[sk]=KFritz Name[sv]=Kfritz Name[ug]=KFritz Name[uk]=KFritz Name[x-test]=xxKFritzxx Type=Application Icon=modem Exec=kfritz GenericName=Call notificator GenericName[cs]=Upozorňování na hovory GenericName[de]=Anruf-Benachrichtigung GenericName[es]=Notificación de llamada GenericName[et]=Telefonikõnede märguandja GenericName[fr]=Notificateur d'appels GenericName[gl]=Notificador de chamadas GenericName[hu]=HívásértesítÅ‘ GenericName[km]=កម្មវិធីជូន​ដំណឹង​​នៃ​ការ​ហៅ GenericName[nds]=Anroop-Bescheden GenericName[nl]=Oproepmelder GenericName[pl]=Powiadamianie o rozmowie telefonicznej GenericName[pt]=Notificador de chamadas GenericName[pt_BR]=Notificador de chamadas GenericName[sk]=Upozornenie na hovor GenericName[sv]=Samtalsunderrättelse GenericName[uk]=Програма ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ дзвінки GenericName[x-test]=xxCall notificatorxx Comment=Access call history and phone book of your Fritz!Box and get notifications on incoming and outgoing calls. Comment[es]=Accede al historial de llamadas y al directorio telefónico de su Fritz!Box y recibe notificaciones de las llamadas entrantes y salientes. Comment[et]=Oma Fritz!Boxi kõneajaloo ja telefoniraamatu kasutamise võimalus ning märguannete saamine sisenevate ja väljuvate kõnede kohta. Comment[fr]=Accédez à l'historique des appels, au répertoire téléphonique de votre Fritz!Box et obtenez les notifications sur les appels entrants et sortants. Comment[gl]=Acceda ao historial de chamadas e ao caderno de enderezos da súa Fritz!Box e obteña notificacións sobre as chamadas entrantes e saíntes. Comment[hu]=Hozzáférés a Fritz!Box hívási elÅ‘zményeihez és telefonkönyvéhez, valamint értesítések fogadása bejövÅ‘ és kimenÅ‘ híváskor. Comment[km]=ចូល​មើល​ប្រវážáŸ’ážáž·â€‹áž áŸ… និង​សៀវភៅ​ទូរសáŸáž–្ទ​នៃ Fritz!Box របស់​អ្នក​ ហើយ​យក​ការ​ជូនដំណឹង​​នៅ​ពáŸáž›â€‹áž áŸ…​ចូល និង​ចáŸáž‰Â áŸ” Comment[nl]=Toegang tot de geschiedenis en telefoonboek van uw Fritz!Box en meldingen verkrijgen van inkomende en uitgaande oproepen. Comment[pl]=PrzeglÄ…daj historiÄ™ rozmów telefonicznych i książkÄ™ telefonicznÄ… swojego Fritz!Box i otrzymuj powiadomienia o rozmowach przychodzÄ…cych i wychodzÄ…cych. Comment[pt]=Aceder ao histórico de chamadas e lista telefónica da sua Fritz!Box e obter notificações sobre as chamadas recebidas e efectuadas. Comment[pt_BR]=Acessar o histórico de chamadas e a lista telefônica da sua Fritz!Box e obter notificações sobre as chamadas recebidas e efetuadas. Comment[sk]=Pristupujte k histórii hovorov a telefónnemu zoznamu vášho Fritz!Boxu a dostávajte upozornenia o prichádzajúcich a odchádzajúcich hovoroch. Comment[sv]=Hämta samtalshistorik och telefonkatalog frÃ¥n Fritz!Box och erhÃ¥ll underrättelser om inkommande och utgÃ¥ende samtal. Comment[uk]=КориÑтуйтеÑÑ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¾Ð¼ дзвінків та телефонною книгою вашого Fritz!Box та отримуйте ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ вхідні та вихідні дзвінки. Comment[x-test]=xxAccess call history and phone book of your Fritz!Box and get notifications on incoming and outgoing calls.xx Terminal=false Categories=Qt;KDE;Utility;TelephonyTools; X-KDE-StartupNotify=true kfritz/DialDialog.h0000664000175000017500000000216612067033023012336 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DIALDIALOG_H #define DIALDIALOG_H #include #include "ui_DialDialog.h" class DialDialog: public KDialog { Q_OBJECT private: Ui::DialDialog *ui; public: explicit DialDialog(QWidget *parent, std::string number = ""); virtual ~DialDialog(); public Q_SLOTS: void dialNumber(); }; #endif /* DIALDIALOG_H_ */ kfritz/KSettingsFonbooks.h0000664000175000017500000000344012067033023013755 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KSETTINGSFONBOOKS_H #define KSETTINGSFONBOOKS_H #include #include #include "ui_KSettingsFonbooks.h" // use this class to add a configuration page to a KConfigDialog class KSettingsFonbooks : public QWidget { Q_OBJECT private: Ui_KSettingsFonbooks *ui; public: KSettingsFonbooks(QWidget *parent); virtual ~KSettingsFonbooks(); }; // this is a wrapper class used by KSettingsFonbooks to enable // auto-management of KActionSelector by KConfigDialog class KFonbooksWidget : public QWidget { Q_OBJECT Q_PROPERTY(QStringList list READ getList WRITE setList NOTIFY listChanged USER true) private: KActionSelector *actionSelector; fritz::Fonbooks *fonbooks; public: KFonbooksWidget(QWidget *parent, KActionSelector *actionSelector); virtual ~KFonbooksWidget(); QStringList getList() const; void setList(QStringList &list); public Q_SLOTS: void listChangedSlot(); Q_SIGNALS: void listChanged(const QStringList &text); }; #endif /* KSETTINGSFONBOOKS_H_ */ kfritz/KSettingsMisc.ui0000664000175000017500000000152712065570711013272 0ustar jojo KSettingsMisc 0 0 425 214 Start minimized Qt::Vertical 20 40 kfritz/KSettingsFritzBox.cpp0000664000175000017500000000362012067033012014275 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "KSettingsFritzBox.h" #include KSettingsFritzBox::KSettingsFritzBox(QWidget *parent) :QWidget(parent) { ui = new Ui_KSettingsFritzBox(); ui->setupUi(this); layout()->addWidget(new KMSNListWidget(this, ui->msnList)); // invisible helper widget } KSettingsFritzBox::~KSettingsFritzBox() { delete ui; } KMSNListWidget::KMSNListWidget(QWidget *parent, KEditListBox *msnList) :QWidget(parent) { KConfigDialogManager::changedMap()->insert("KMSNListWidget", SIGNAL(listChanged(const QStringList &))); setObjectName(QString::fromUtf8("kcfg_MSNFilter")); this->msnList = msnList; connect(msnList, SIGNAL(added(const QString &)), this, SLOT(listChangedSlot())); connect(msnList, SIGNAL(changed()), this, SLOT(listChangedSlot())); connect(msnList, SIGNAL(removed(const QString &)), this, SLOT(listChangedSlot())); } KMSNListWidget::~KMSNListWidget() { } QStringList KMSNListWidget::getList() const { return msnList->items(); } void KMSNListWidget::setList(QStringList &list) { msnList->setItems(list); } void KMSNListWidget::listChangedSlot() { emit listChanged(getList()); } kfritz/KCalllistProxyModel.h0000664000175000017500000000254312067033023014251 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KCALLLISTPROXYMODEL_H #define KCALLLISTPROXYMODEL_H #include #include class KCalllistProxyModel : public QSortFilterProxyModel { public: KCalllistProxyModel(QObject *parent); virtual ~KCalllistProxyModel(); virtual fritz::CallEntry *retrieveCallEntry(const QModelIndex &index) const; virtual std::string number(const QModelIndex &index) const; virtual std::string name(const QModelIndex &index) const; virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); }; #endif /* FILTERPROXYMODEL_H_ */ kfritz/HISTORY0000664000175000017500000003603712067266603011300 0ustar jojoFritz!Box call monitor for KDE 'kfritz' Revision History -------------------------------------------------------- 2008-12-21: Initial program - First KDE based approach of a callmonitor for Fritz!Boxes - Bases on libfritz++, part of vdr-fritz Plugin for the VideoDiscRecorder VDR. 2010-02-11: Version 0.0.1 - Updates in libfritz++ * Made CallList a singleton. * Renamed various methods in fonbook classes from *Fonbuch* to *Fonbook*. * Implemented in-library msn filtering and reverse-lookups. * Renamed various methods in FonbookManager from *Fonbuch* to *Fonbook*. * Introduced callType::ALL to get one complete call list (containing missed, incoming and outgoing) * Moved callType to CallEntry * A call to Config::SetupFonbookIDs now deletes a previously instantiated FonbookManager to allow multiple calls to SetupFonbookIDs in case of configuration changes. * Introduced new method CallList::DeleteCallList() to explicitly delete the singleton instance. * Made Listener a singleton. A call to Listener::CreateListener() is used to activate this feature. * Introduced new method CallList::CreateCallList() to explicitly pre-fetch the call list before calling CallList::getCallList(). * Moved Config::SetupFonbookIDs to FonbookManager::CreateFonbookManager(). * Renamed Tools::GetPhoneSettings() to Tools::GetLocationSettings(). * Added resolving of SIP[0-9] to real provider names. * Added sort routines to libfritz++ * Fixed a possible segfault when sorting calllists and fonbooks * Added Config::SetupPorts() to provide non-standard ports * Removed useless check in CallList::RetrieveEntry() * Fixed some warnings about ununsed parameters in base-classes and empty implementations - Added "-fPIC" to Makefiles. - Added sort routines to KCalllistModel and KFonbookModel - Fixed some warnings about unused parameters - Added debug mode to cmake file - Now logging to both UI and stdout - Introduced tabs for fonbook, calllist and log - Implemented configuration dialog. Hostname, area code and country code are now configurable - Using KNotify for notification only, now - Refactored KFonbookModel and KCalllistModel using a generic base class KFritzModel - Moved all libfritz initialization to a threaded class LibFritzInit, speeding up application start - Modified LogStream to support logging from libfritz++ and main program. Introduced logging macros DBG, INF, ERR - Added support for password saving using KWallet - Added a ':' in logging messages for better readability - Added support for libindicate-qt in CMakeLists.txt, introduced define INDICATEQT_FOUND - Added "outgoingCall", "callConnected" and "callDisconnected" to KNotify - Integrated KEventHandler into KFritzBoxWindow - Implemented support for libindicate-qt, "missed calls" are notified via that way - Added .desktop file - Added application specific icons "incoming-call", "outgoing-call", "missed-call" and "new-call" - Renamed relevant occurences of kfritzbox to kfritz - Some improvements to debian subdir - Added configuration page "Phone books" - Added configuration tab "MSN filter" on page "Fritz!Box" - Added configuration option "Show log" - First steps to integrate i18n support - Fixed crash when reloading call history and phone book after configuration changes - Replace the term "calllist" with "call history" on user interface - Translated UI texts to german - Closing kfritz main window now minimizes to systray - Passing window id to KWallet to remove warning - Translated texts coming from libfritz++ to german - Added message to status bar while reading data from Fritz!Box - Moved log to a separate dialog, moved menu entry to help menu - Fixed formatting of time at disconnect-notification - Added call to libfritz to set up config dir (in most cases ~/.kde/share/apps/kfritz) 2010-02-16: Version 0.0.2 - Fixed translation of "Missed calls" wrt. desktop indicator - Fixed translation of "POTS" and "ISDN", which are strings sent from the FB - Added german translation to kfritz.notifyrc - Fixed a compiler failure on systems without libindicate-qt-dev and detection of ssl-package in cmake (reported by Richard Bos) - Added german translation to kfritz.desktop file. - Set default build type in cmake, cleaned up makefiles of static libs - Added missing KDE4_ENABLE_EXCEPTIONS to CXX_FLAGS - Adapted to new logging system of libfritz++ - Added missing COPYING and AUTHORS file (reported by Christian Mangold) 2010-02-16: Version 0.0.3 - Adapted to changes in libfritz++ * Removed dependency to OpenSSL due to licensing issues, using copy of MD5 implementation from GNU coreutils 5.93 - Dropped linking to libssl 2010-02-20: Version 0.0.4 - Changes in libfritz++ * Removed md5.[h,c] in favor of libgcrypt, libfritz++ now needs libgcrypt's development header "gcrypt.h" to compile - Fixed "missed calls" indicator. Missed calls during runtime were not indicated. (reported by Christian Mangold) - Fixed clicking on "missed calls" indicator. A click now shows KFritz's call history. - Added a missing ';' to kfritz.desktop - Call history no longer shows a length (0:00) for missed calls. - Added dutch translations (provided by Richard Bos) - Added CMAKE_SKIP_RPATH to avoid setting a rpath in kfritz binary - Added CMakeModules/FindGCrypt.cmake from http://marc.info/?l=gcrypt-devel&m=126252802612599&w=2 for cmake support of libgcrypt - Now linking to libgcrypt - Fixed dutch translation string "Incoming call from %1
using %2" (reported by Richard Bos) - Fixed installation location of kfritz.desktop in CMakeLists.txt (patch provided by Sebastian Trueg) - Added "Dial number" action, which dials the current selection in a phone book or the call history (suggested by Richard Bos) 2010-12-24: Version 0.0.5 - Changes in libfritz++ * Implemented functions to retrieve current IP and trigger a reconnect * phone book entries now have the addtional fields "quickdial", "vanity", "priority", "important" * Fixed decoding of entities in xml phone book parser * Modified FonbookEntry class: one FonbookEntry now holds all numbers of a person * phone book entries now have the additional fields "quickdial", "vanity", "priority", "important" * now parsing the Fritz Box's phone book via xml export file (if available) * adapted local phonebook to use the same xml format, new FB versions use. Existing csv phone books are converted to xml automagically, entries with TYPE_NONE are converted to TYPE_HOME * Updated OertlichesFonbook to website changes * Fixed parsing SIP provider names * Sensitive Information like passwords, phone numbers, etc. are no longer logged by default. -> The new command line option --log-personal-info re-enables logging all information - Important changes in libtcpclient++ * Fixed a possible issue with "thread-safety" of TcpClient, a TcpClient object can now be deleted out of another thread while running -> This prevents possible crashes when closing KFritz - Added menu entries for getting IP and reconnecting to ISP - Added new columns to Fritz Box's phone book view - Moved ${GCRYPT_LIBRARIES} in CMakeLists.txt to support linking with --as-needed (suggested by Richard Bos) - Added README with installing instructions - Makefile: Moved install target to kde-install and created install target using sudo instead of kdesudo. - Implemented "Copy number to clipboard", added entry to context menu (suggested by Richard Bos) - Fixed project's home URL in KAboutData (reported by Richard Bos) - Updated dutch translations (thanks to Richard Bos) - Updated README with contribution instructions - Modified displaying of phone books accordingly - Reworked displaying of phone books * All numbers of a contact are shown in one line * Default numbers are shown in bold face - Enabled editing of existing entries of writable phonebooks. Writeable phone books are the local phone book and the Fritz!Box phone book. The Fritz!Box phone book can only edited with recent firmware versions, that provide an export button on the webinterface. - Added tel.local.ch phonebook (suggested by Urs Aregger) - Changed color of incoming call icon to blue, to improve readability (suggested by Mark Peter Wege and Markus Haitzer) - Set larger default size for log dialog - Dial arbitrary numbers (suggested by Richard Bos and Christoph Rauch) - Moved partially from libtcpclient++ to socket support of libccgnu2/libccext2. - Moved from libpthread++ to thread support of libccgnu2. To compile kfritz, development header files of the gnu common c++ library are needed! - Fixed german translation of "Call connected." - Added option to reload phone books and call list manually (suggested by Michael Speier) - Added "copy number to clipboard" option to menu bar - Added italian translations (provided by Fabio Pirrello) 2011-01-16: Version 0.0.6 - Changes in libfritz++ * Fixed resolving numbers with "Das Oertliche" phone book (patch provided by Kurt Wanner) * Improve checks when parsing result list in OertlichesFonbook Check that at most one result is returned (reported by Honky) * Improve OertlichesFonbook parser Looking for the onclick=... as a last attribute does not always work * Add missing include to XmlFonbook (reported by Richard Bos) * Add Config::Shutdown() to gracefully shutdown the library * Keep current call list as long as possible on reload Current call list is now cleared after the new call list has been parsed * Fix XmlFonbook parser XmlFonbook Parser was not aware of empty tags (reported by Richard Bos and Achim Bohnet) * Fix retry delay calculation in Listener - Add missing include to KCalllistModel (reported by Richard Bos) - Simpler message "Reconnect initiated", changed message "Current IP adress is..." (suggested by Richard Bos) - Updated NL translation (provided by Richard Bos) - Adapt to new library function Config::Shutdown() This fixes changing the configuration at runtime. The library is now shutdown before the configuration is changed and setup again afterwards - Remove X-Ubuntu-Gettext-Domain (patch provided by Christian Mangold, reported by Felix Geyer) - Remove handbook menu entry (patch provided by Felix Geyer) - Fix include commoncpp libraries in CMakeLists (reported by Felix Geyer) 2011-02-13: Version 0.0.7 - Important changes in libfritz++ * Fix FonbookManager if no phone book is configured at all * Add methods for adding and deleting fonbook entries * Only write phone books back if changes are pending * Extend Fonbook::AddFonbookEntry() to allow arbitrary position for new entry - Fix init if FRITZ phone book is not configured - Fix crash if no phone book is configured at all - Enable filtering in call list - Speed up shutdown of kfritz - Fixed some compiler warnings - Removed libtcpclient, which is obsolete after complete migration to libcommoncpp2 - Handle umlauts in phone book editing correctly (reported by Achim Bohnet) - Add and delete phone book entries - Add copy, paste and cut actions - Add "Resolve number" action in call list - Copy elements from call list and non-writeable phone books - New setup option "Start minimized" 2011-10-30: Version 0.0.8 - Important changes in libfritz++ * Added parsing of SIP MSNs * Fix logging into Fritz!Box without password * Fix compile error with libcommoncpp2 / IPv6 * Initialization speedup * Adapt to more flexible Fritz!Box phone books * Fix resolve in OertlichesFonbook - Adapted to KDE's translation process - Updated contributed translations from KDE SVN - Fix sorting in call list. Sorting by date was wrong after the introduction of KCalllistProxyModel (reported by Richard Bos) - Only active "Resolve number" context menu entry where it makes sense. Entries with already resolved numbers or unknown caller are excluded. (suggested by Richard Bos) - Renamed context menu entry of resolveNumber action (suggested by Richard Bos) - Fixed possible crash caused by number() and name() in KCalllistModel - Add provider selection in dial dialog (closes #267338 in KDE bugtracker) - Fix logging into Fritz!Box without password (closes #267478 in KDE bugtracker) - Code cleanup - Fix missing translation of 'unknown' - Changed default value of 'Start minimized' Default behaviour before introduction of this parameter was to start minimized (closes #267820 in KDE bugtracker) - Fix 'reconnect ISP' and 'Get current IP' Both crashed if no connection to the fritz box is available - Do not save changes on shutdown per default Ask on application quit if pending changes should be saved - Adapt to new Fritzbox features * Phone book entries with more then one numbers of the same type (home, mobile, ...) are supported now * The number columns got more generic names * The type of a phone number is shown as tooltip - Fix possible crash on shutdown of KFritz - Fix resolving numbers with das-oertliche.de (closes #277230 in KDE bugtracker) - Fix encoding of data received from libfritz++ and shown in kfritz GUI (closes #277228 in KDE bugtracker) - Call list now resolves all occurences of the same number (closes #277229 in KDE bugtracker) - Add possibility to change type of phone numbers 2012-03-11: Version 0.0.9 - Changes in libfritz++ * Fixed resolving numbers with "Das Oertliche" phone book (patch provided by Kurt Wanner) - Updated various translations 2012-10-14: Version 0.0.10 - Important changes in libfritz++ * Fixes a deadlock when initializating call list and phone books - Add Save action to save changed phone book explicitly - Add caching to lookup phone books - Fix unnecessary clean in Makefile - Fix compiler warnings -Wsign-compare, -Wunused-parameter - Refactored build process - Fix a crash when accessing settings dialog (closes #297527 in KDE bugtracker, reported by Alfred Egger) - Fixed resolv in TelLocalChFonbook (closes #298763 in KDE bugtracker, reported by Luca Giambonini) - Added DBus interface (based on a patch provided by Christian Holzberger) - New tray icon in black-and-white style - Updated various translations 2012-12-23: Version 0.0.11 - Support for new FB firmware versions xx.05.50 - Important changes in libfritz++ * Hide msn in syslog if logPersonalInfo is disabled * Adapt to new FW version 05.50 * Implement new login scheme using login_sid.lua for FB firmware >= xx.05.50 * Adapt sip settings, location settings, call list and phone book requests to new uris and format 2012-12-27: Version 0.0.12 - Fixes compatibility issues with older fw-versions - Important changes in libfritz++ * Fixes login problems with old fw-versions that return 404 on login_sid.lua (reported by sofasurfer) * Fix encoding conversion when requesting call list 2012-12-28: Version 0.0.12a - Fixes compatibility issues with older fw-versions - Important changes in libfritz++ * Further fixes to allow access to older FB firmwares (closes #312204 in KDE bugtracker, reported by sofasurfer) kfritz/ContainerWidget.h0000664000175000017500000000316712065570711013445 0ustar jojo/* * KFritz * * Copyright (C) 2011 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CONTAINERWIDGET_H #define CONTAINERWIDGET_H #include #include "QAdaptTreeView.h" #include "KFonbookModel.h" #include "KCalllistProxyModel.h" class ContainerWidget: public QWidget { private: QAdaptTreeView *treeview; KFonbookModel *fonbookModel; KCalllistProxyModel *calllistModel; public: ContainerWidget(QWidget *parent, QAdaptTreeView *treeview, KFonbookModel *model); ContainerWidget(QWidget *parent, QAdaptTreeView *treeview, KCalllistProxyModel *model); virtual ~ContainerWidget(); QAdaptTreeView *getTreeView() { return treeview; } KFonbookModel *getFonbookModel() { return fonbookModel; } KCalllistProxyModel *getCalllistModel() { return calllistModel; } bool isFonbook() { return fonbookModel ? true : false; } bool isCalllist() { return calllistModel ? true : false; } }; #endif /* CONTAINERWIDGET_H_ */ kfritz/MimeFonbookEntry.h0000664000175000017500000000265412065570711013606 0ustar jojo/* * KFritz * * Copyright (C) 2011 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIMEFONBOOKENTRY_H #define MIMEFONBOOKENTRY_H #include #include #include class MimeFonbookEntry: public QMimeData { Q_OBJECT private: fritz::FonbookEntry *fonbookEntry; protected: virtual QVariant retrieveData(const QString &mimetype, QVariant::Type preferredType) const; public: MimeFonbookEntry(const fritz::FonbookEntry &fonbookEntry); virtual ~MimeFonbookEntry(); virtual bool hasFormat(const QString &mimetype) const; virtual QStringList formats() const; fritz::FonbookEntry *retrieveFonbookEntry() const; }; #endif /* MIMEFONBOOKENTRY_H_ */ kfritz/kfritz.notifyrc0000664000175000017500000000467412065570711013302 0ustar jojo[Global] IconName=modem [Event/incomingCall] Name=Incoming Call Name[cs]=Příchozí hovor Name[de]=Eingehender Anruf Name[es]=Llamada entrante Name[et]=Sisenev kõne Name[fr]=Appel entrant Name[ga]=Glao Isteach Name[gl]=Chamada entrante Name[hu]=BejövÅ‘ hívás Name[km]=ការ​ហៅ​ចូល Name[nds]=Ankamen Anroop Name[nl]=Inkomende oproep Name[pl]=Rozmowa przychodzÄ…ca Name[pt]=Chamada Recebida Name[pt_BR]=Chamada recebida Name[sk]=Prichádzajúci hovor Name[sv]=Inkommande samtal Name[uk]=Вхідний дзвінок Name[x-test]=xxIncoming Callxx Action=Popup|Sound Sound=KDE-Im-New-Mail.ogg [Event/outgoingCall] Name=Outgoing Call Name[cs]=Odchozí hovor Name[de]=Ausgehender Anruf Name[es]=Llamada saliente Name[et]=Väljuv kõne Name[fr]=Appel sortant Name[ga]=Glao Amach Name[gl]=Chamada saínte Name[hu]=KimenÅ‘ hívás Name[km]=ការ​ហៅ​ចáŸáž‰ Name[nl]=Uitgaande oproep Name[pl]=Rozmowa wychodzÄ…ca Name[pt]=Chamada Enviada Name[pt_BR]=Chamada enviada Name[sk]=Odchádzajúci hovor Name[sv]=UtgÃ¥ende samtal Name[uk]=Вихідний дзвінок Name[x-test]=xxOutgoing Callxx Action=Popup|Sound Sound=KDE-Im-New-Mail.ogg [Event/callConnected] Name=Call got connected Name[cs]=Hovor byl spojen Name[de]=Der Anruf wurde angenommen Name[es]=La llamada se ha establecido Name[et]=Kõneühendus loodi Name[fr]=Appel connecté Name[gl]=Ligouse a chamada Name[hu]=Hívás csatlakoztatva Name[km]=ការ​ហៅ​ážáŸ’រូវបាន​ážáž—្ជាប់ Name[nl]=Oproep werd verbonden Name[pl]=Rozmowa zostaÅ‚a ustanowiona Name[pt]=A chamada foi estabelecida Name[pt_BR]=A chamada foi estabelecida Name[sk]=Hovor bol pripojený Name[sv]=Samtalet har kopplats upp Name[uk]=Ð’Ñтановлено Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Name[x-test]=xxCall got connectedxx Action=Popup [Event/callDisconnected] Name=Call got disconnected Name[cs]=Hovor byl odpojen Name[de]=Der Anruf wurde beendet Name[es]=La llamada se ha desconectado Name[et]=Kõneühendus katkestati Name[fr]=Appel déconnecté Name[ga]=Scoireadh an glao Name[gl]=Desligouse a chamada Name[hu]=Hívás szétkapcsolva Name[km]=ការ​ហៅ​ážáŸ’រូវ​បានផ្ដាច់ Name[nl]=Verbinding werd verbroken Name[pl]=Rozmowa zostaÅ‚a rozłączona Name[pt]=A chamada terminou Name[pt_BR]=A chamada terminou Name[sk]=Hovor bol odpojený Name[sv]=Samtalet har avslutats Name[uk]=Розірвано Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Name[x-test]=xxCall got disconnectedxx Action=Popup kfritz/CMakeModules/0000775000175000017500000000000012065570711012510 5ustar jojokfritz/CMakeModules/FindGcryptConfig.cmake0000664000175000017500000002260112065570711016712 0ustar jojo# - a gcrypt-config module for CMake # # Usage: # gcrypt_check( [REQUIRED] ) # checks if gcrypt is avialable # # When the 'REQUIRED' argument was set, macros will fail with an error # when gcrypt could not be found. # # It sets the following variables: # GCRYPT_CONFIG_FOUND ... true if libgcrypt-config works on the system # GCRYPT_CONFIG_EXECUTABLE ... pathname of the libgcrypt-config program # _FOUND ... set to 1 if libgcrypt exist # _LIBRARIES ... the libraries # _CFLAGS ... all required cflags # _ALGORITHMS ... the algorithms that this libgcrypt supports # _VERSION ... gcrypt's version # # Examples: # gcrypt_check (GCRYPT gcrypt) # Check if a version of gcrypt is available, issues a warning # if not. # # gcrypt_check (GCRYPT REQUIRED gcrypt) # Check if a version of gcrypt is available and fails # if not. # # gcrypt_check (GCRYPT gcrypt>=1.4) # requires at least version 1.4 of gcrypt and defines e.g. # GCRYPT_VERSION=1.4.4. Issues a warning if a lower version # is available only. # # gcrypt_check (GCRYPT REQUIRED gcrypt>=1.4.4) # requires at least version 1.4.4 of gcrypt and fails if # only gcrypt 1.4.3 or lower is available only. # # Copyright (C) 2010 Werner Dittmann # # Redistribution and use, with or without modification, are permitted # provided that the following conditions are met: # # 1. Redistributions must retain the above copyright notice, this # list of conditions and the following disclaimer. # 2. The name of the author may not be used to endorse or promote # products derived from this software without specific prior # written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # This is a much edited and simplified variant of the original UsePkgConfig.cmake # from Enrico Scholz # Copyright (C) 2006 Enrico Scholz # ### Common stuff #### set(GCR_CONFIG_VERSION 1) set(GCR_CONFIG_FOUND 0) find_program(GCR_CONFIG_EXECUTABLE NAMES libgcrypt-config --version DOC "libgcrypt-config executable") mark_as_advanced(GCR_CONFIG_EXECUTABLE) if(GCR_CONFIG_EXECUTABLE) set(GCR_CONFIG_FOUND 1) endif(GCR_CONFIG_EXECUTABLE) # Unsets the given variables macro(_gcrconfig_unset var) set(${var} "" CACHE INTERNAL "") endmacro(_gcrconfig_unset) macro(_gcrconfig_set var value) set(${var} ${value} CACHE INTERNAL "") endmacro(_gcrconfig_set) # Invokes libgcrypt-config, cleans up the result and sets variables macro(_gcrconfig_invoke _gcrlist _prefix _varname _regexp) set(_gcrconfig_invoke_result) execute_process( COMMAND ${GCR_CONFIG_EXECUTABLE} ${ARGN} OUTPUT_VARIABLE _gcrconfig_invoke_result RESULT_VARIABLE _gcrconfig_failed) if (_gcrconfig_failed) set(_gcrconfig_${_varname} "") _gcrconfig_unset(${_prefix}_${_varname}) else(_gcrconfig_failed) string(REGEX REPLACE "[\r\n]" " " _gcrconfig_invoke_result "${_gcrconfig_invoke_result}") string(REGEX REPLACE " +$" "" _gcrconfig_invoke_result "${_gcrconfig_invoke_result}") if (NOT ${_regexp} STREQUAL "") string(REGEX REPLACE "${_regexp}" " " _gcrconfig_invoke_result "${_gcrconfig_invoke_result}") endif(NOT ${_regexp} STREQUAL "") separate_arguments(_gcrconfig_invoke_result) #message(STATUS " ${_varname} ... ${_gcrconfig_invoke_result}") set(_gcrconfig_${_varname} ${_gcrconfig_invoke_result}) _gcrconfig_set(${_prefix}_${_varname} "${_gcrconfig_invoke_result}") endif(_gcrconfig_failed) endmacro(_gcrconfig_invoke) macro(_gcrconfig_invoke_dyn _gcrlist _prefix _varname cleanup_regexp) _gcrconfig_invoke("${_gcrlist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) endmacro(_gcrconfig_invoke_dyn) # Splits given arguments into options and a package list macro(_gcrconfig_parse_options _result _is_req) set(${_is_req} 0) foreach(_gcr ${ARGN}) if (_gcr STREQUAL "REQUIRED") set(${_is_req} 1) endif (_gcr STREQUAL "REQUIRED") endforeach(_gcr ${ARGN}) set(${_result} ${ARGN}) list(REMOVE_ITEM ${_result} "REQUIRED") endmacro(_gcrconfig_parse_options) ### macro(_gcr_check_modules_internal _is_required _is_silent _prefix) _gcrconfig_unset(${_prefix}_FOUND) _gcrconfig_unset(${_prefix}_VERSION) _gcrconfig_unset(${_prefix}_PREFIX) _gcrconfig_unset(${_prefix}_LIBDIR) _gcrconfig_unset(${_prefix}_LIBRARIES) _gcrconfig_unset(${_prefix}_CFLAGS) _gcrconfig_unset(${_prefix}_ALGORITHMS) # create a better addressable variable of the modules and calculate its size set(_gcr_check_modules_list ${ARGN}) list(LENGTH _gcr_check_modules_list _gcr_check_modules_cnt) if(GCR_CONFIG_EXECUTABLE) # give out status message telling checked module if (NOT ${_is_silent}) message(STATUS "checking for module '${_gcr_check_modules_list}'") endif(NOT ${_is_silent}) # iterate through module list and check whether they exist and match the required version foreach (_gcr_check_modules_gcr ${_gcr_check_modules_list}) # check whether version is given if (_gcr_check_modules_gcr MATCHES ".*(>=|=|<=).*") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _gcr_check_modules_gcr_name "${_gcr_check_modules_gcr}") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _gcr_check_modules_gcr_op "${_gcr_check_modules_gcr}") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _gcr_check_modules_gcr_ver "${_gcr_check_modules_gcr}") else(_gcr_check_modules_gcr MATCHES ".*(>=|=|<=).*") set(_gcr_check_modules_gcr_name "${_gcr_check_modules_gcr}") set(_gcr_check_modules_gcr_op) set(_gcr_check_modules_gcr_ver) endif(_gcr_check_modules_gcr MATCHES ".*(>=|=|<=).*") set(_gcr_check_prefix "${_prefix}") _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" VERSION "" --version ) # _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" PREFIX "" --prefix ) _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" LIBRARIES "" --libs ) _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" CFLAGS "" --cflags ) _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" ALGORITHMS "" --algorithms ) message(STATUS " found ${_gcr_check_modules_gcr}, version ${_gcrconfig_VERSION}") # handle the operands set(_gcr_wrong_version 0) if (_gcr_check_modules_gcr_op STREQUAL ">=") if((_gcr_check_modules_gcr_ver VERSION_EQUAL _gcrconfig_VERSION) OR (_gcrconfig_VERSION VERSION_LESS _gcr_check_modules_gcr_ver )) message(STATUS " gcrypt wrong version: required: ${_gcr_check_modules_gcr_op}${_gcr_check_modules_gcr_ver}, found: ${_gcrconfig_VERSION}") set(_gcr_wrong_version 1) endif() endif(_gcr_check_modules_gcr_op STREQUAL ">=") if (_gcr_check_modules_gcr_op STREQUAL "=") if(_gcr_check_modules_gcr_ver VERSION_EQUAL _gcrconfig_VERSION) message(STATUS " gcrypt wrong version: required: ${_gcr_check_modules_gcr_op}${_gcr_check_modules_gcr_ver}, found: ${_gcrconfig_VERSION}") set(_gcr_wrong_version 1) endif() endif(_gcr_check_modules_gcr_op STREQUAL "=") if (_gcr_check_modules_gcr_op STREQUAL "<=") if((_gcr_check_modules_gcr_ver VERSION_EQUAL _gcrconfig_VERSION) OR (_gcrconfig_VERSION VERSION_GREATER _gcr_check_modules_gcr_ver)) message(STATUS " gcrypt wrong version: required: ${_gcr_check_modules_gcr_op}${_gcr_check_modules_gcr_ver}, found: ${_gcrconfig_VERSION}") set(_gcr_wrong_version 1) endif() endif(_gcr_check_modules_gcr_op STREQUAL "<=") if (${_is_required} AND _gcr_wrong_version) message(FATAL_ERROR "") endif() endforeach(_gcr_check_modules_gcr) _gcrconfig_set(${_prefix}_FOUND 1) else(GCR_CONFIG_EXECUTABLE) if (${_is_required}) message(FATAL_ERROR "libgcrypt-config tool not found") endif (${_is_required}) endif(GCR_CONFIG_EXECUTABLE) endmacro(_gcr_check_modules_internal) ### ### User visible macro starts here ### ### macro(gcrypt_check _prefix _module0) # check cached value if (NOT DEFINED __gcr_config_checked_${_prefix} OR __gcr_config_checked_${_prefix} LESS ${GCR_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) _gcrconfig_parse_options (_gcr_modules _gcr_is_required "${_module0}" ${ARGN}) _gcr_check_modules_internal("${_gcr_is_required}" 0 "${_prefix}" ${_gcr_modules}) _gcrconfig_set(__gcr_config_checked_${_prefix} ${GCR_CONFIG_VERSION}) endif(NOT DEFINED __gcr_config_checked_${_prefix} OR __gcr_config_checked_${_prefix} LESS ${GCR_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) endmacro(gcrypt_check) ### ### Local Variables: ### mode: cmake ### End: kfritz/KFonbookModel.h0000664000175000017500000000522312067033023013033 0ustar jojo/* * KFritz * * Copyright (C) 2010-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KFONBOOKMODEL_H #define KFONBOOKMODEL_H #include #include "KFritzModel.h" class KFonbookModel : public KFritzModel { Q_OBJECT public: KFonbookModel(std::string techID); virtual ~KFonbookModel(); virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); void setDefault(const QModelIndex &index); void setType(const QModelIndex &index, fritz::FonbookEntry::eType type); virtual Qt::ItemFlags flags(const QModelIndex & index) const; virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); static QString getTypeName(const fritz::FonbookEntry::eType type); virtual std::string number(const QModelIndex &index) const; virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; virtual QModelIndex parent(const QModelIndex &child) const; virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()); virtual bool insertFonbookEntry(const QModelIndex &index, fritz::FonbookEntry &fe); virtual const fritz::FonbookEntry *retrieveFonbookEntry(const QModelIndex &index) const; virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); const fritz::Fonbook *getFonbook() const { return fonbook; } public Q_SLOTS: virtual void check(); private: fritz::Fonbook *fonbook; int lastRows; size_t mapColumnToNumberIndex(int column); }; #endif /* KFONBOOKMODEL_H_ */ kfritz/libfritz++/0000775000175000017500000000000012067267001012147 5ustar jojokfritz/libfritz++/TelLocalChFonbook.cpp0000664000175000017500000000464212065572605016160 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * TelLocalChFonbook created by Christian Richter * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "TelLocalChFonbook.h" #include #include "Config.h" #include "HttpClient.h" #include "Tools.h" namespace fritz{ TelLocalChFonbook::TelLocalChFonbook() : LookupFonbook(I18N_NOOP("tel.local.ch"), "LOCCH") {} TelLocalChFonbook::sResolveResult TelLocalChFonbook::Lookup(std::string number) const { TelLocalChFonbook::sResolveResult result(number); // resolve only (swiss) phone numbers if (number.length() == 0 || Tools::NormalizeNumber(number).find("0041") != 0) return result; std::string msg; std::string name; try { DBG("sending reverse lookup request for " << Tools::NormalizeNumber(number) << " to tel.local.ch"); std::string host = "tel.local.ch"; HttpClient tc(host); msg = tc.Get(std::stringstream().flush() << "/de/q/" << Tools::NormalizeNumber(number) << ".html"); } catch (ost::SockException &se) { ERR("Exception - " << se.what()); return result; } // parse answer size_t start = msg.find("

", start); name = msg.substr(start, stop - start); // convert the string from latin1 to current system character table CharSetConv *conv = new CharSetConv("UTF-8", CharSetConv::SystemCharacterTable()); const char *s_converted = conv->Convert(name.c_str()); name = s_converted; delete (conv); name = convertEntities(name); INF("resolves to " << name.c_str()); result.name = name; result.successful = true; return result; } } kfritz/libfritz++/Config.cpp0000664000175000017500000000645512065572605014101 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "Config.h" #include #include "CallList.h" #include "FonbookManager.h" #include "Listener.h" #include "Tools.h" namespace fritz { Config* gConfig = NULL; ost::Mutex *syslogMutex = new ost::Mutex(); std::ostream *dsyslog = &std::clog; std::ostream *isyslog = &std::cout; std::ostream *esyslog = &std::cerr; void Config::Setup(std::string hostname, std::string password, bool logPersonalInfo) { if (gConfig) delete gConfig; gConfig = new Config( hostname, password); gConfig->mConfig.logPersonalInfo = logPersonalInfo; } bool Config::Init(bool *locationSettingsDetected, std::string *countryCode, std::string *regionCode){ // preload phone settings from Fritz!Box bool validPassword = Tools::GetLocationSettings(); if (gConfig->getCountryCode().empty() || gConfig->getRegionCode().empty()) { if (locationSettingsDetected) *locationSettingsDetected = false; if (countryCode) gConfig->setCountryCode(*countryCode); if (regionCode) gConfig->setRegionCode(*regionCode); } else { if (locationSettingsDetected) *locationSettingsDetected = true; if (countryCode) *countryCode = gConfig->getCountryCode(); if (regionCode) *regionCode = gConfig->getRegionCode(); } // fetch SIP provider names Tools::GetSipSettings(); return validPassword; } bool Config::Shutdown() { fritz::Listener::DeleteListener(); fritz::FonbookManager::DeleteFonbookManager(); fritz::CallList::DeleteCallList(); if (gConfig) { delete gConfig; gConfig = NULL; } INF("Shutdown of libfritz++ completed."); return true; } void Config::SetupPorts ( int listener, int ui, int upnp ) { if (gConfig) { gConfig->mConfig.listenerPort = listener; gConfig->mConfig.uiPort = ui; gConfig->mConfig.upnpPort = upnp; } } void Config::SetupMsnFilter( std::vector vMsn) { if (gConfig) gConfig->mConfig.msn = vMsn; } void Config::SetupConfigDir(std::string dir) { if (gConfig) gConfig->mConfig.configDir = dir; } void Config::SetupLogging(std::ostream *d, std::ostream *i, std::ostream *e) { // set own logging objects dsyslog = d; isyslog = i; esyslog = e; } Config::Config( std::string url, std::string password) { mConfig.url = url; mConfig.password = password; mConfig.uiPort = 80; mConfig.listenerPort = 1012; mConfig.upnpPort = 49000; mConfig.loginType = UNKNOWN; mConfig.lastRequestTime = 0; mConfig.logPersonalInfo = false; CharSetConv::DetectCharset(); fritzClientFactory = new FritzClientFactory(); } Config::~Config() { } } kfritz/libfritz++/LocalFonbook.h0000664000175000017500000000222212065572605014675 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef LOCALFONBOOK_H #define LOCALFONBOOK_H #include "XmlFonbook.h" namespace fritz { class LocalFonbook : public XmlFonbook { friend class FonbookManager; private: char* filePath; LocalFonbook(); void ParseCsvFonbook(std::string filePath); virtual void Write(); public: bool Initialize(); void Reload(); }; } #endif /*LOCALFONBOOK_H_*/ kfritz/libfritz++/Nummerzoeker.cpp0000664000175000017500000000604712065572605015354 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "Nummerzoeker.h" #include #include "Config.h" #include "HttpClient.h" #include "Tools.h" namespace fritz{ NummerzoekerFonbook::NummerzoekerFonbook() : LookupFonbook(I18N_NOOP("nummerzoeker.com"), "ZOEK") {} Fonbook::sResolveResult NummerzoekerFonbook::Lookup(std::string number) const { Fonbook::sResolveResult result(number); // resolve only NL phone numbers std::string normNumber = Tools::NormalizeNumber(number); if (number.length() == 0 || normNumber.find("0031") != 0) return result; // __FILE__om works only with national number: remove 0031 prefix, add 0 normNumber = '0' + normNumber.substr(4); std::string msg; try { DBG("sending reverse lookup request for " << (gConfig->logPersonalInfo() ? normNumber : HIDDEN) << " to www.nummerzoeker.com"); std::string host = "www.nummerzoeker.com"; HttpClient tc(host); msg = tc.Get(std::stringstream().flush() << "/index.php?search=Zoeken&phonenumber=" << normNumber << "&export=csv"); } catch (ost::SockException &se) { ERR("Exception - " << se.what()); return result; } if (msg.find("Content-Type: text/html") != std::string::npos) { INF("no entry found."); return result; } // parse answer, format is "number",name,surname,street,zip,city size_t lineStart = 0; std::string name, surname; while ((lineStart = msg.find("\n", lineStart)) != std::string::npos) { lineStart++; if (msg[lineStart] == '"') { size_t nameStart = msg.find(",", lineStart); size_t surnameStart = msg.find(",", nameStart+1); size_t streetStart = msg.find(",", surnameStart+1); name = msg.substr(nameStart, surnameStart-nameStart-1); surname = msg.substr(surnameStart, streetStart-surnameStart-1); name = surname + ' ' + name; break; } } // convert the string from latin1 to current system character table // Q: is this really ISO-8859-1, the webservers' response is unclear (html pages are UTF8) CharSetConv *conv = new CharSetConv("ISO-8859-1", CharSetConv::SystemCharacterTable()); const char *s_converted = conv->Convert(name.c_str()); name = s_converted; delete (conv); INF("resolves to " << (gConfig->logPersonalInfo() ? name.c_str() : HIDDEN)); result.name = name; result.successful = true; return result; } } kfritz/libfritz++/OertlichesFonbook.cpp0000664000175000017500000000533012065572605016302 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "OertlichesFonbook.h" #include #include "Config.h" #include "HttpClient.h" #include "Tools.h" namespace fritz{ OertlichesFonbook::OertlichesFonbook() :LookupFonbook(I18N_NOOP("das-oertliche.de"), "OERT") {} Fonbook::sResolveResult OertlichesFonbook::Lookup(std::string number) const { Fonbook::sResolveResult result(number); // resolve only (german) phone numbers if (number.length() == 0 || Tools::NormalizeNumber(number).find("0049") != 0) return result; std::string msg; std::string name; try { DBG("sending reverse lookup request for " << (gConfig->logPersonalInfo()? Tools::NormalizeNumber(number) : HIDDEN) << " to www.dasoertliche.de"); std::string host = "www.dasoertliche.de"; HttpClient tc(host); msg = tc.Get(std::stringstream().flush() << "/Controller?form_name=search_inv&ph=" << Tools::NormalizeNumber(number)); } catch (ost::SockException &se) { ERR("Exception - " << se.what()); return result; } // check that at most one result is returned size_t second_result = msg.find("id=\"entry_1\""); if (second_result != std::string::npos) { INF("multiple entries found, not returning any."); return result; } // parse answer size_t start = msg.find("getItemData("); if (start == std::string::npos) { INF("no entry found."); return result; } // add the length of the last search pattern start += 12; size_t stop = msg.find(");", start); std::string dataset = msg.substr(start, stop - start); name = Tools::Tokenize(dataset, ',', 5); name = name.substr(2, name.length()-3); // convert the string from latin1 to current system character table CharSetConv *conv = new CharSetConv("ISO-8859-1", CharSetConv::SystemCharacterTable()); const char *s_converted = conv->Convert(name.c_str()); name = s_converted; delete (conv); INF("resolves to " << (gConfig->logPersonalInfo() ? name.c_str() : HIDDEN)); result.name = name; result.successful = true; return result; } } kfritz/libfritz++/XmlFonbook.h0000664000175000017500000000252112065570712014402 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2010 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMLFONBOOK_H #define XMLFONBOOK_H #include "Fonbook.h" namespace fritz { class XmlFonbook: public Fonbook { private: std::string ExtractXmlAttributeValue(std::string element, std::string attribute, std::string xml); std::string ExtractXmlElementValue(std::string element, std::string xml); std::string charset; protected: void ParseXmlFonbook(std::string *msg); std::string SerializeToXml(); public: XmlFonbook(std::string title, std::string techId, bool writeable); virtual ~XmlFonbook(); }; } #endif /* XMLFONBOOK_H_ */ kfritz/libfritz++/CallList.cpp0000664000175000017500000002075012065572605014375 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "CallList.h" #include #include #include #include "Tools.h" #include "Config.h" #include "FritzClient.h" namespace fritz{ class CallEntrySort { private: bool ascending; CallEntry::eElements element; public: CallEntrySort(CallEntry::eElements element = CallEntry::ELEM_DATE, bool ascending = true) { this->element = element; this->ascending = ascending; } bool operator() (CallEntry ce1, CallEntry ce2){ switch(element) { case CallEntry::ELEM_DATE: return (ascending ? (ce1.timestamp < ce2.timestamp) : (ce1.timestamp > ce2.timestamp)); break; case CallEntry::ELEM_DURATION: if (ce1.duration.size() < ce2.duration.size()) return (ascending ? true : false); if (ce1.duration.size() > ce2.duration.size()) return (ascending ? false : true); return (ascending ? (ce1.duration < ce2.duration) : (ce1.duration > ce2.duration)); break; case CallEntry::ELEM_LOCALNAME: return (ascending ? (ce1.localName < ce2.localName) : (ce1.localName > ce2.localName)); break; case CallEntry::ELEM_LOCALNUMBER: return (ascending ? (ce1.localNumber < ce2.localNumber) : (ce1.localNumber > ce2.localNumber)); break; case CallEntry::ELEM_REMOTENAME: if (ce1.remoteName == "unknown" && ce2.remoteName == "unknown") return false; if (ce1.remoteName == "unknown") return (ascending ? true : false); if (ce2.remoteName == "unknown") return (ascending ? false : true); return (ascending ? (ce1.remoteName < ce2.remoteName) : (ce1.remoteName > ce2.remoteName)); break; case CallEntry::ELEM_REMOTENUMBER: return (ascending ? (ce1.remoteNumber < ce2.remoteNumber) : (ce1.remoteNumber > ce2.remoteNumber)); break; case CallEntry::ELEM_TYPE: return (ascending ? (ce1.type < ce2.type) : (ce1.type > ce2.type)); break; default: ERR("invalid element given for sorting."); return false; } } }; CallList *CallList::me = NULL; CallList::CallList() :Thread() { setName("CallList"); setCancel(cancelDeferred); lastMissedCall = 0; lastCall = 0; valid = false; start(); } CallList *CallList::getCallList(bool create){ if(!me && create){ me = new CallList(); } return me; } void CallList::CreateCallList() { DeleteCallList(); me = new CallList(); } void CallList::DeleteCallList() { if (me) { DBG("deleting call list"); delete me; me = NULL; } } CallList::~CallList() { terminate(); DBG("deleted call list"); } void CallList::run() { DBG("CallList thread started"); FritzClient *fc = gConfig->fritzClientFactory->create(); std::string msg = fc->RequestCallList(); delete fc; std::vector callList; // parse answer size_t pos = 2; // parse body int count = 0; while ((pos = msg.find("\n", pos)) != std::string::npos /*&& msg[pos+1] != '\n'*/) { pos++; int type = pos; if (msg[type] < '0' || msg[type] > '9') { // ignore lines not starting with a number (headers, comments, etc.) { DBG("parser skipped line in calllist"); continue; } int dateStart = msg.find(';', type) +1; int timeStart = msg.find(' ', dateStart) +1; int nameStart = msg.find(';', timeStart) +1; int numberStart = msg.find(';', nameStart) +1; int lNameStart = msg.find(';', numberStart) +1; int lNumberStart = msg.find(';', lNameStart) +1; int durationStart = msg.find(';', lNumberStart) +1; int durationStop = msg.find("\n", durationStart)-1; if (msg[durationStop] == '\r') // fix for new Fritz!Box Firmwares that use "\r\n" on linebreak durationStop--; CallEntry ce; // FB developers introduce new numbering in call type column: '4' is the new '3' type = atoi(&msg[type]); ce.type = (CallEntry::eCallType) (type == 4 ? 3: type); ce.date = msg.substr(dateStart, timeStart - dateStart -1); ce.time = msg.substr(timeStart, nameStart - timeStart -1); ce.remoteName = msg.substr(nameStart, numberStart - nameStart -1); ce.remoteNumber = msg.substr(numberStart, lNameStart - numberStart -1); ce.localName = msg.substr(lNameStart, lNumberStart - lNameStart -1); ce.localNumber = msg.substr(lNumberStart, durationStart - lNumberStart -1); ce.duration = msg.substr(durationStart, durationStop - durationStart +1); // put the number into the name field if name is not available if (ce.remoteName.size() == 0) ce.remoteName = ce.remoteNumber; // 01234567 01234 // date: dd.mm.yy, time: hh:mm tm tmCallTime; tmCallTime.tm_mday = atoi(ce.date.substr(0, 2).c_str()); tmCallTime.tm_mon = atoi(ce.date.substr(3, 2).c_str()) - 1; tmCallTime.tm_year = atoi(ce.date.substr(6, 2).c_str()) + 100; tmCallTime.tm_hour = atoi(ce.time.substr(0, 2).c_str()); tmCallTime.tm_min = atoi(ce.time.substr(3, 2).c_str()); tmCallTime.tm_sec = 0; tmCallTime.tm_isdst = 0; ce.timestamp = mktime(&tmCallTime); // workaround for AVM debugging entries in CVS list if (ce.remoteNumber.compare("1234567") == 0 && ce.date.compare("12.03.2005") == 0) continue; callList.push_back(ce); count++; } INF("CallList -> read " << count << " entries."); valid = false; callListAll = callList; callListIn.clear(); callListOut.clear(); callListMissed.clear(); lastCall = 0; lastMissedCall = 0; for(std::vector::iterator it = callListAll.begin(); it < callListAll.end(); ++it) { CallEntry ce = *it; if (lastCall < ce.timestamp) lastCall = ce.timestamp; switch (ce.type) { case CallEntry::INCOMING: callListIn.push_back(ce); break; case CallEntry::OUTGOING: callListOut.push_back(ce); break; case CallEntry::MISSED: if (lastMissedCall < ce.timestamp) lastMissedCall = ce.timestamp; callListMissed.push_back(ce); break; default: DBG("parser skipped unknown call type"); continue; } } valid = true; DBG("CallList thread ended"); } CallEntry *CallList::RetrieveEntry(CallEntry::eCallType type, size_t id) { switch (type) { case CallEntry::ALL: return &callListAll[id]; case CallEntry::INCOMING: return &callListIn[id]; case CallEntry::OUTGOING: return &callListOut[id]; case CallEntry::MISSED: return &callListMissed[id]; default: return NULL; } } size_t CallList::GetSize(CallEntry::eCallType type) { switch (type) { case CallEntry::ALL: return callListAll.size(); case CallEntry::INCOMING: return callListIn.size(); case CallEntry::OUTGOING: return callListOut.size(); case CallEntry::MISSED: return callListMissed.size(); default: return 0; } } size_t CallList::MissedCalls(time_t since) { size_t missedCalls = 0; for (unsigned int pos=0; pos < callListMissed.size(); pos++) { CallEntry ce = callListMissed[pos]; // track number of new missed calls if (ce.timestamp > since) { if (ce.MatchesFilter()) missedCalls++; } else { break; // no older calls will match the missed-calls condition } } return missedCalls; } void CallList::Sort(CallEntry::eElements element, bool ascending) { CallEntrySort ces(element, ascending); std::sort(callListAll.begin(), callListAll.end(), ces); //TODO: other lists? } bool CallEntry::MatchesFilter() { // entries are filtered according to the MSN filter) if ( Tools::MatchesMsnFilter(localNumber)) return true; else{ // if local number does not contain any of the MSNs in MSN filter, we test // if it does contain any number (if POTS is used fritzbox reports "Festnetz" // instead of the local number) for (unsigned int pos=0; pos < localNumber.size(); pos++) { if (localNumber[pos] >= '0' && localNumber[pos] <= '9') return false; } return true; } } bool CallEntry::MatchesRemoteNumber(std::string number) { return (Tools::NormalizeNumber(number).compare(Tools::NormalizeNumber(remoteNumber)) == 0); } } kfritz/libfritz++/Fonbook.cpp0000664000175000017500000002454212065572605014266 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "Fonbook.h" #include #include "Config.h" #include "Tools.h" namespace fritz { const char *Entities[97][2] = { {" ", " "}, {"¡", "¡"}, {"¢", "¢"}, {"£", "£"}, {"¤","€"}, //krazy:exclude=spelling {"¥", "Â¥"}, {"¦","Å "}, {"§", "§"}, {"¨", "Å¡"}, {"©", "©"}, {"ª", "ª"}, {"«", "«"}, {"¬", "¬"}, {"­", "­"}, {"®", "®"}, {"¯", "¯"}, {"°", "°"}, {"±","±"}, {"²", "²"}, {"³", "³"}, {"´", "Ž"}, {"µ", "µ"}, {"¶", "¶"}, {"·","·"}, {"¸", "ž"}, {"¹", "¹"}, {"º", "º"}, {"»", "»"}, {"¼","Å’"}, {"½","Å“"}, {"¾","Ÿ"}, {"¿","¿"}, {"À","À"}, {"Á","Ã"}, {"Â", "Â"}, {"Ã","Ã"}, {"Ä", "Ä"}, {"Å", "Ã…"}, {"Æ", "Æ"}, {"Ç","Ç"}, {"È","È"}, {"É","É"}, {"Ê", "Ê"}, {"Ë", "Ë"}, {"Ì","ÃŒ"}, {"Í","Ã"}, {"Î", "ÃŽ"}, {"Ï", "Ã"}, {"Ð", "Ã"}, {"Ñ","Ñ"}, {"Ò","Ã’"}, {"Ó","Ó"}, {"Ô", "Ô"}, {"Õ","Õ"}, {"Ö", "Ö"}, {"×", "×"}, {"Ø","Ø"}, {"Ù","Ù"}, {"Ú","Ú"}, {"Û", "Û"}, {"Ü", "Ü"}, {"Ý","Ã"}, {"Þ", "Þ"}, {"ß", "ß"}, {"à","à"}, {"á","á"}, {"â", "â"}, {"ã","ã"}, {"ä", "ä"}, {"å", "Ã¥"}, {"æ", "æ"}, {"ç","ç"}, {"è","è"}, {"é","é"}, {"ê", "ê"}, {"ë", "ë"}, {"ì","ì"}, {"í","í"}, {"î", "î"}, {"ï", "ï"}, {"ð", "ð"}, {"ñ","ñ"}, {"ò","ò"}, {"ó","ó"}, {"ô", "ô"}, {"õ","õ"}, {"ö", "ö"}, {"÷","÷"}, {"ø","ø"}, {"ù","ù"}, {"ú","ú"}, {"û", "û"}, {"ü", "ü"}, {"ý","ý"}, {"þ", "þ"}, {"ÿ", "ÿ"}, {"&", "&"}, }; std::string Fonbook::convertEntities(std::string s) const { if (s.find("&") != std::string::npos) { // convert the entities from UTF-8 to current system character table CharSetConv *conv = new CharSetConv("UTF-8", CharSetConv::SystemCharacterTable()); // convert entities of format ÿ (unicode) while (s.find("&#x") != std::string::npos) { size_t pos = s.find("&#x"); size_t end = s.find(";", pos); // get hex code std::string unicode = s.substr(pos+3, end - pos - 3); // convert to int std::stringstream ss; ss << std::hex << unicode; int codepoint; ss >> codepoint; // get corresponding char char out_buffer[8]; memset(out_buffer, 0, 8); char *out = &(out_buffer[0]); wchar_t in_buffer = codepoint; char *in = (char *)&(in_buffer); size_t inlen = sizeof(in_buffer), outlen = sizeof(out_buffer); iconv_t cd; cd = iconv_open("utf-8", "ucs-2"); iconv(cd, &in, &inlen, &out, &outlen); iconv_close(cd); // replace it s.replace(pos, end-pos+1, std::string(out_buffer)); } // convert other entities with table for (int i=0; i<97; i++) { std::string::size_type pos = s.find(Entities[i][0]); if (pos != std::string::npos) { s.replace(pos, strlen(Entities[i][0]), conv->Convert(Entities[i][1])); i--; //search for the same entity again } } delete (conv); } return s; } FonbookEntry::FonbookEntry(std::string name, bool important) { this->name = name; this->important = important; for (size_t pos=0; pos < MAX_NUMBERS; pos++) { numbers[pos].priority = 0; numbers[pos].type = TYPE_NONE; } } void FonbookEntry::AddNumber(size_t pos, std::string number, eType type, std::string quickdial, std::string vanity, int priority) { numbers[pos].number = number; numbers[pos].type = type; numbers[pos].quickdial = quickdial; numbers[pos].vanity = vanity; numbers[pos].priority = priority; } size_t FonbookEntry::GetDefault() const { size_t t = 0; while (t < MAX_NUMBERS) { if (GetPriority(t) == 1) return t; t++; } return 0; } void FonbookEntry::SetDefault(size_t pos) { size_t oldPos = GetDefault(); if (pos != oldPos) { SetPrioriy(0, oldPos); SetPrioriy(1, pos); SetQuickdial(GetQuickdial(oldPos), pos); SetVanity(GetVanity(oldPos), pos); SetQuickdial("", oldPos); SetVanity("", oldPos); } } std::string FonbookEntry::GetQuickdialFormatted(size_t pos) const { switch (GetQuickdial(pos).length()) { case 1: return "**70" + GetQuickdial(pos); case 2: return "**7" + GetQuickdial(pos); default: return ""; } } std::string FonbookEntry::GetQuickdial(size_t pos) const { // if no special type is given, the default "TYPES_COUNT" indicates, // that the correct type has to be determined first, i.e., priority == 1 return numbers[pos == std::string::npos ? GetDefault() : pos].quickdial; } void FonbookEntry::SetQuickdial(std::string quickdial, size_t pos) { //TODO: sanity check numbers[pos == std::string::npos ? GetDefault() : pos].quickdial = quickdial; } std::string FonbookEntry::GetVanity(size_t pos) const { return numbers[pos == std::string::npos ? GetDefault() : pos].vanity; } std::string FonbookEntry::GetVanityFormatted(size_t pos) const { return GetVanity(pos).length() ? "**8"+GetVanity(pos) : ""; } void FonbookEntry::SetVanity(std::string vanity, size_t pos) { //TODO: sanity check numbers[pos == std::string::npos ? GetDefault() : pos].vanity = vanity; } bool FonbookEntry::operator<(const FonbookEntry &fe) const { int cresult = this->name.compare(fe.name); if (cresult == 0) return false; return (cresult < 0); } size_t FonbookEntry::GetSize() { size_t size = 0; // ignore TYPE_NONE for (size_t type = 1; type < MAX_NUMBERS; type++) if (numbers[type].number.size()) size++; return size; } class FonbookEntrySort { private: bool ascending; FonbookEntry::eElements element; public: FonbookEntrySort(FonbookEntry::eElements element = FonbookEntry::ELEM_NAME, bool ascending = true) { this->element = element; this->ascending = ascending; } bool operator() (FonbookEntry fe1, FonbookEntry fe2){ switch(element) { case FonbookEntry::ELEM_NAME: return (ascending ? (fe1.GetName() < fe2.GetName()) : (fe1.GetName() > fe2.GetName())); break; // case FonbookEntry::ELEM_TYPE: // return (ascending ? (fe1.getType() < fe2.getType()) : (fe1.getType() > fe2.getType())); // break; // case FonbookEntry::ELEM_NUMBER: // return (ascending ? (fe1.getNumber() < fe2.getNumber()) : (fe1.getNumber() > fe2.getNumber())); // break; case FonbookEntry::ELEM_IMPORTANT: return (ascending ? (fe1.IsImportant() < fe2.IsImportant()) : (fe1.IsImportant() > fe2.IsImportant())); break; case FonbookEntry::ELEM_QUICKDIAL: { int qd1 = atoi(fe1.GetQuickdial().c_str()); int qd2 = atoi(fe2.GetQuickdial().c_str()); return (ascending ? (qd1 < qd2) : (qd1 > qd2)); } break; case FonbookEntry::ELEM_VANITY: { int vt1 = atoi(fe1.GetVanity().c_str()); int vt2 = atoi(fe2.GetVanity().c_str()); return (ascending ? (vt1 < vt2) : (vt1 > vt2)); } // break; // case FonbookEntry::ELEM_PRIORITY: // return (ascending ? (fe1.getPriority() < fe2.getPriority()) : (fe1.getPriority() > fe2.getPriority())); // break; default: ERR("invalid element given for sorting."); return false; } } }; Fonbook::Fonbook(std::string title, std::string techId, bool writeable) : title(title), techId(techId), writeable(writeable) { displayable = true; initialized = false; dirty = false; } void Fonbook::SetDirty() { if (initialized) dirty = true; } Fonbook::sResolveResult Fonbook::ResolveToName(std::string number) { sResolveResult result(number); if (number.length() > 0) for (unsigned int pos=0; pos < fonbookList.size(); pos++) for (size_t num=0; num < FonbookEntry::MAX_NUMBERS; num++) { std::string fonbookNumber = fonbookList[pos].GetNumber(num); if (fonbookNumber.length() > 0 && Tools::CompareNormalized(number, fonbookNumber) == 0) { result.name = fonbookList[pos].GetName(); result.type = fonbookList[pos].GetType(num); result.successful = true; return result; } } return result; } const FonbookEntry *Fonbook::RetrieveFonbookEntry(size_t id) const { if (id >= GetFonbookSize()) return NULL; return &fonbookList[id]; } bool Fonbook::ChangeFonbookEntry(size_t id, FonbookEntry &fe) { if (id < GetFonbookSize()) { fonbookList[id] = fe; SetDirty(); return true; } else { return false; } } bool Fonbook::SetDefault(size_t id, size_t pos) { if (id < GetFonbookSize()) { fonbookList[id].SetDefault(pos); SetDirty(); return true; } else { return false; } } void Fonbook::AddFonbookEntry(FonbookEntry &fe, size_t position) { if (position == std::string::npos || position > fonbookList.size()) fonbookList.push_back(fe); else fonbookList.insert(fonbookList.begin() + position, fe); SetDirty(); } bool Fonbook::DeleteFonbookEntry(size_t id) { if (id < GetFonbookSize()) { fonbookList.erase(fonbookList.begin() + id); SetDirty(); return true; } else { return false; } } void Fonbook::Save() { if (dirty && writeable) { Write(); dirty = false; } } void Fonbook::setInitialized(bool isInitialized) { initialized = isInitialized; if (displayable && isInitialized) INF(title << " initialized (" << GetFonbookSize() << " entries)."); } size_t Fonbook::GetFonbookSize() const { if (initialized) return fonbookList.size(); else return 0; } void Fonbook::Sort(FonbookEntry::eElements element, bool ascending) { FonbookEntrySort fes(element, ascending); std::sort(fonbookList.begin(), fonbookList.end(), fes); } } kfritz/libfritz++/COPYING0000664000175000017500000004310312065570712013207 0ustar jojo GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. kfritz/libfritz++/TelLocalChFonbook.h0000664000175000017500000000226612065572605015625 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * TelLocalChFonbook created by Christian Richter * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef TelLocalChFonbook_H #define TelLocalChFonbook_H #include "LookupFonbook.h" namespace fritz { class TelLocalChFonbook : public LookupFonbook { friend class FonbookManager; private: TelLocalChFonbook(); public: virtual sResolveResult Lookup(std::string number) const; }; } #endif /*TelLocalChFonbook_H_*/ kfritz/libfritz++/Listener.h0000664000175000017500000000476112065572605014124 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FRITZLISTENER_H #define FRITZLISTENER_H #include #include "Fonbook.h" namespace fritz{ class sCallInfo{ public: bool isOutgoing; std::string remoteNumber; std::string remoteName; std::string localNumber; std::string medium; }; class EventHandler { public: EventHandler() { } virtual ~EventHandler() { } virtual void HandleCall(bool outgoing, int connId, std::string remoteNumber, std::string remoteName, fritz::FonbookEntry::eType remoteType, std::string localParty, std::string medium, std::string mediumName) = 0; virtual void HandleConnect(int connId) = 0; virtual void HandleDisconnect(int connId, std::string duration) = 0; }; class Listener : public ost::Thread { private: static Listener *me; EventHandler *event; std::vector activeConnections; Listener(EventHandler *event); void HandleNewCall(bool outgoing, int connId, std::string remoteNumber, std::string localParty, std::string medium); void HandleConnect(int connId); void HandleDisconnect(int connId, std::string duration); public: /** * Activate listener support. * This method instantiates a Listener object, which takes care of call events from the * Fritz!Box. The application has to provide an EventHandler object, which has to inherit * fritz::EventHandler. The listener notifies the application about call events using this object. * @param A pointer to the eventHandler. Subsequent calls to CreateListener, e.g., in case of * configuration changes, can omit this parameter. Then, the existing EventHandler is used. */ static void CreateListener(EventHandler *event = NULL); static void DeleteListener(); virtual ~Listener(); virtual void run(); }; } #endif /*FRITZLISTENER_H_*/ kfritz/libfritz++/FonbookManager.h0000664000175000017500000001377312065572605015232 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FONBOOKMANAGER_H #define FONBOOKMANAGER_H #include "Fonbooks.h" namespace fritz{ class FonbookManager : public Fonbook { private: static FonbookManager* me; Fonbooks fonbooks; FonbookManager(bool saveOnShutdown); Fonbook *GetActiveFonbook() const; size_t activeFonbookPos; bool saveOnShutdown; public: virtual ~FonbookManager(); /** * Creates the central FonbookManager and activates certain fonbooks. * This method instantiates the fonbookmanager. Following calls to * getFonbookManager() return a reference to this object. * CreateFonbookManager should be called before any call to getFonbookManager() to allow * the configured fonbooks to initialize and fetch data which may be done in separate threads. * If some of the fonbooks provided by libfritz++ shall be used, they need to be * activated by this method. These fonbooks are used for reverse lookup on call events. * The order of the fonbooks determines the priority regarding these lookups. * Regarding queries to the fonbooks, a pointer is maintained which points to the currently * "active" fonbook. This pointer can be moved, using FonbookManager::NextFonbook(). * @param the list of enabled fonbooks * @param the currently "active" fonbook * @param wether changes to fonbooks are saved on FonbookManager deletion */ static void CreateFonbookManager( std::vector vFonbookID, std::string activeFonbook, bool saveOnShutdown = true); /** * Returns the instance object of the FonbookManager casted to Fonbook. */ static Fonbook *GetFonbook(); /** * Returns the instance object of the FonbookManager */ static FonbookManager *GetFonbookManager(); /* * Deletes the FonbookManager instance. */ static void DeleteFonbookManager(); /** * Switch to next displayable phonebook. * @return void */ void NextFonbook(); /** * Resolves the number given to the corresponding name. * @param number to resolve * @return resolved name and type or the number, if unsuccessful */ virtual sResolveResult ResolveToName(std::string number); /** * Returns a specific telephonebook entry. * @param id unique identifier of the requested entry * @return the entry with key id or NULL, if unsuccessful */ const FonbookEntry *RetrieveFonbookEntry(size_t id) const; /** * Changes the Fonbook entry with the given id * @param id unique identifier to the entry to be changed * @param fe FonbookEntry with the new content * @return true, if successful */ virtual bool ChangeFonbookEntry(size_t id, FonbookEntry &fe); /** * Sets the default number for a Fonbook entry with the given id * @param id unique identifier to the entry to be changed * @param type the new default * @return true, if successful */ virtual bool SetDefault(size_t id, size_t pos); /** * Adds a new entry to the phonebook. * @param fe a new phonebook entry * @return true, if add was successful */ virtual void AddFonbookEntry(FonbookEntry &fe, size_t position = std::string::npos); /** * Adds a new entry to the phonebook. * @param id unique id to the entry to be deleted * @return true, if deletion was successful */ virtual bool DeleteFonbookEntry(size_t id); /** * Clears all entries from phonebook. */ virtual void Clear(); /** * Save pending changes. * Can be called periodically to assert pending changes in a phone book are written. */ void Save(); /** * Returns if it is possible to display the entries of this phonebook. * @return true, if this phonebook has displayable entries. "Reverse lookup only" phonebooks must return false here. */ virtual bool isDisplayable() const; /** * Returns if this phonebook is ready to use. * @return true, if this phonebook is ready to use */ virtual bool isInitialized() const; /** * Returns if this phonebook is writeable, e.g. entries can be added or modified. * @return true, if this phonebook is writeable */ virtual bool isWriteable() const; /** * Returns if this phonebook has changes that are not yet written. * @return true, if changes are pending */ virtual bool isModified() const; /** * Sets the initialized-status. * @param isInititalized the value initialized is set to */ virtual void setInitialized(bool isInitialized); /** * Sorts the phonebook's entries by the given element and in given order. * @param the element used for sorting * @param true if sort order is ascending, false otherwise */ virtual void Sort(FonbookEntry::eElements element = FonbookEntry::ELEM_NAME, bool ascending = true); /** * Returns the number of entries in the telephonebook. * @return the number of entries or cFonbook::npos, if requesting specific telephonebook entries is not possible for this telephonebook */ size_t GetFonbookSize() const; /** * Reloads the telephonebook's content */ void Reload(); /** * Returns a string that should be displayed as title in the menu when the telephonebook is displayed. */ std::string GetTitle() const; /** * Returns the technical id of this phonebook. This id has to be unique among all phonebooks and is used when storing * the plugin's setup. * @return the technical id */ virtual std::string GetTechId() const; /** * */ Fonbooks *GetFonbooks(); }; } #endif /*FONBOOKMANAGER_H_*/ kfritz/libfritz++/FritzFonbook.cpp0000664000175000017500000001245212065572605015302 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "FritzFonbook.h" #include #include #include "Config.h" #include "FritzClient.h" #include "Tools.h" namespace fritz { FritzFonbook::FritzFonbook() :Thread(), XmlFonbook(I18N_NOOP("Fritz!Box phone book"), "FRITZ", true) { setCancel(cancelDeferred); setInitialized(false); } FritzFonbook::~FritzFonbook() { terminate(); } bool FritzFonbook::Initialize() { return start(); } void FritzFonbook::run() { DBG("FritzFonbook thread started"); setInitialized(false); Clear(); FritzClient *fc = gConfig->fritzClientFactory->create(); std::string msg = fc->RequestFonbook(); delete fc; if (msg.find("find("find("charset=", pos); if (pos != std::string::npos) charset = msg->substr(pos+8, msg->find('"', pos)-pos-8); } DBG("using charset " << charset); CharSetConv *conv = new CharSetConv(charset.c_str(), CharSetConv::SystemCharacterTable()); const char *s_converted = conv->Convert(msg->c_str()); std::string msgConv = s_converted; delete (conv); // parse answer pos = 0; int count = 0; // parser for old format const std::string tag("(TrFon("); while ((pos = msgConv.find(tag, pos)) != std::string::npos) { pos += 7; // points to the first " int nameStart = msgConv.find(',', pos) +3; int nameStop = msgConv.find('"', nameStart) -1; int numberStart = msgConv.find(',', nameStop) +3; int numberStop = msgConv.find('"', numberStart) -1; if (msgConv[nameStart] == '!') // skip '!' char, older firmware versions use to mark important nameStart++; std::string namePart = msgConv.substr(nameStart, nameStop - nameStart+1); std::string namePart2 = convertEntities(namePart); std::string numberPart = msgConv.substr(numberStart, numberStop - numberStart+1); if (namePart2.length() && numberPart.length()) { FonbookEntry fe(namePart2, false); // TODO: important is not parsed here fe.AddNumber(0, numberPart, FonbookEntry::TYPE_NONE); AddFonbookEntry(fe); //DBG("(%s / %s)", fe.number.c_str(), fe.name.c_str()); } pos += 10; count++; } // parser for new format pos = 0; const std::string tagName("TrFonName("); const std::string tagNumber("TrFonNr(" ); // iterate over all tagNames while ((pos = msgConv.find(tagName, ++pos)) != std::string::npos) { int nameStart = msgConv.find(',', pos+7) +3; int nameStop = msgConv.find('"', nameStart) -1; std::string namePart = msgConv.substr(nameStart, nameStop - nameStart+1); std::string namePartConv = convertEntities(namePart); FonbookEntry fe(namePartConv, false); // TODO: important is not parsed here size_t posInner = pos; size_t numberCount = 0; // iterate over all tagNumbers between two tagNames while ((posInner = msgConv.find(tagNumber, ++posInner)) != std::string::npos && posInner < msgConv.find(tagName, pos+1)) { int typeStart = posInner + 9; int numberStart = msgConv.find(',', posInner) +3; int typeStop = numberStart - 5; int numberStop = msgConv.find('"', numberStart) -1; std::string numberPart = msgConv.substr(numberStart, numberStop - numberStart+1); std::string typePart = msgConv.substr(typeStart, typeStop - typeStart+1); FonbookEntry::eType type = FonbookEntry::TYPE_NONE; if (typePart.compare("home") == 0) type = FonbookEntry::TYPE_HOME; else if (typePart.compare("mobile") == 0) type = FonbookEntry::TYPE_MOBILE; else if (typePart.compare("work") == 0) type = FonbookEntry::TYPE_WORK; if (namePartConv.length() && numberPart.length()) { fe.AddNumber(numberCount++, numberPart, type); // TODO: quickdial, vanity and priority not parsed here //DBG("(%s / %s / %i)", fe.number.c_str(), fe.name.c_str(), fe.type); } count++; } AddFonbookEntry(fe); } } void FritzFonbook::Reload() { start(); } void FritzFonbook::Write() { if (isWriteable()) { INF("Uploading phonebook to Fritz!Box."); FritzClient *fc = gConfig->fritzClientFactory->create(); fc->WriteFonbook(SerializeToXml()); delete fc; } } } kfritz/libfritz++/FonbookManager.cpp0000664000175000017500000001665312065572605015565 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "FonbookManager.h" #include #include "Config.h" #include "FritzFonbook.h" #include "LocalFonbook.h" #include "Nummerzoeker.h" #include "OertlichesFonbook.h" #include "TelLocalChFonbook.h" namespace fritz{ FonbookManager* FonbookManager::me = NULL; FonbookManager::FonbookManager(bool saveOnShutdown) :Fonbook("Manager", "MNGR") { this->saveOnShutdown = saveOnShutdown; // create all fonbooks fonbooks.push_back(new FritzFonbook()); fonbooks.push_back(new OertlichesFonbook()); fonbooks.push_back(new TelLocalChFonbook()); fonbooks.push_back(new NummerzoekerFonbook()); fonbooks.push_back(new LocalFonbook()); // initialize the fonbooks that are used for (int i=gConfig->getFonbookIDs().size()-1; i>=0; i--) { Fonbook *fb = fonbooks[gConfig->getFonbookIDs()[i]]; if (fb) fb->Initialize(); else gConfig->getFonbookIDs().erase(gConfig->getFonbookIDs().begin()+i); } // track the currently active (=shown) fonbook activeFonbookPos = std::string::npos; // set activeFonbookPos to the last displayed fonbook (if this is still valid and displayable) size_t pos = 0; while (pos < gConfig->getFonbookIDs().size() && gConfig->getFonbookIDs()[pos] != gConfig->getActiveFonbook() ) pos++; if (pos < gConfig->getFonbookIDs().size()) { if (fonbooks[gConfig->getFonbookIDs()[pos]]->isDisplayable()) activeFonbookPos = pos; } // if no valid phone book is selected, advance to the next valid one if (!GetActiveFonbook()) NextFonbook(); } FonbookManager::~FonbookManager() { for (size_t i= 0; i < fonbooks.size(); i++) { DBG("deleting fonbook with ID: " << fonbooks[i]->GetTechId()); // save pending changes if (saveOnShutdown) fonbooks[i]->Save(); delete(fonbooks[i]); } } void FonbookManager::CreateFonbookManager(std::vector vFonbookID, std::string activeFonbook, bool saveOnShutdown) { if (gConfig) { // if there is already a FonbookManager, delete it, so it can adapt to configuration changes DeleteFonbookManager(); // save new list of fonbook ids gConfig->setFonbookIDs(vFonbookID); // check if activeFonbook is valid if (activeFonbook.size() > 0) { bool activeFonbookValid = false; for (unsigned int pos = 0; pos < vFonbookID.size(); pos++) if (vFonbookID[pos].compare(activeFonbook) == 0) { activeFonbookValid = true; break; } if (activeFonbookValid) gConfig->setActiveFonbook(activeFonbook); else ERR("Invalid call parameter. ActiveFonbook '" << activeFonbook << "' is not enabled or unknown"); } // create fonbookmanger (was deleted above) so that it can initialize all fonbooks me = new FonbookManager(saveOnShutdown); } else { ERR("Wrong call sequence. Configuration does not exist when trying to create FonbookManager." ); } } Fonbook* FonbookManager::GetFonbook() { return (Fonbook*) me; } FonbookManager* FonbookManager::GetFonbookManager() { return me; } void FonbookManager::DeleteFonbookManager() { if (me) { DBG("deleting Fonbook Manager"); delete me; me = NULL; } } void FonbookManager::NextFonbook() { size_t pos = activeFonbookPos + 1; // no phonebooks -> no switching if ( gConfig->getFonbookIDs().size() == 0) return; while (pos < gConfig->getFonbookIDs().size() && fonbooks[gConfig->getFonbookIDs()[pos]]->isDisplayable() == false) pos++; // if no displayable fonbook found -> start from beginning if (pos == gConfig->getFonbookIDs().size()) { pos = 0; while (pos < gConfig->getFonbookIDs().size() && fonbooks[gConfig->getFonbookIDs()[pos]]->isDisplayable() == false) pos++; // if this fails, too, just return npos if (pos == gConfig->getFonbookIDs().size()) { pos = std::string::npos; } } activeFonbookPos = pos; if (activeFonbookPos != std::string::npos) { // save the tech-id of the active fonbook in setup gConfig->setActiveFonbook( gConfig->getFonbookIDs()[pos] ); } } Fonbook::sResolveResult FonbookManager::ResolveToName(std::string number) { sResolveResult result(number); for (size_t i=0; igetFonbookIDs().size(); i++) { result = fonbooks[gConfig->getFonbookIDs()[i]]->ResolveToName(number); DBG("ResolveToName: " << gConfig->getFonbookIDs()[i] << " " << (gConfig->logPersonalInfo() ? result.name : HIDDEN)); if (result.successful) return result; } return result; } Fonbook *FonbookManager::GetActiveFonbook() const { if (activeFonbookPos == std::string::npos) { return NULL; } return fonbooks[gConfig->getFonbookIDs()[activeFonbookPos]]; } const FonbookEntry *FonbookManager::RetrieveFonbookEntry(size_t id) const { return GetActiveFonbook() ? GetActiveFonbook()->RetrieveFonbookEntry(id) : NULL; } bool FonbookManager::ChangeFonbookEntry(size_t id, FonbookEntry &fe) { return GetActiveFonbook() ? GetActiveFonbook()->ChangeFonbookEntry(id, fe) : false; } bool FonbookManager::SetDefault(size_t id, size_t pos) { return GetActiveFonbook() ? GetActiveFonbook()->SetDefault(id, pos) : false; } void FonbookManager::AddFonbookEntry(FonbookEntry &fe, size_t position) { if (GetActiveFonbook()) GetActiveFonbook()->AddFonbookEntry(fe, position); } bool FonbookManager::DeleteFonbookEntry(size_t id) { return GetActiveFonbook() ? GetActiveFonbook()->DeleteFonbookEntry(id) : false; } void FonbookManager::Clear() { if (GetActiveFonbook()) GetActiveFonbook()->Clear(); } void FonbookManager::Save() { if (GetActiveFonbook()) GetActiveFonbook()->Save(); } bool FonbookManager::isDisplayable() const { return GetActiveFonbook() ? GetActiveFonbook()->isDisplayable() : false; } bool FonbookManager::isInitialized() const { return GetActiveFonbook() ? GetActiveFonbook()->isInitialized() : false; } bool FonbookManager::isWriteable() const { return GetActiveFonbook() ? GetActiveFonbook()->isWriteable() : false; } bool FonbookManager::isModified() const { return GetActiveFonbook() ? GetActiveFonbook()->isModified() : false; } void FonbookManager::setInitialized(bool isInitialized) { if (GetActiveFonbook()) GetActiveFonbook()->setInitialized(isInitialized); } void FonbookManager::Sort(FonbookEntry::eElements element, bool ascending){ if (GetActiveFonbook()) GetActiveFonbook()->Sort(element, ascending); } size_t FonbookManager::GetFonbookSize() const { return GetActiveFonbook() ? GetActiveFonbook()->GetFonbookSize() : 0; } std::string FonbookManager::GetTitle() const { return GetActiveFonbook() ? GetActiveFonbook()->GetTitle() : ""; } std::string FonbookManager::GetTechId() const { return GetActiveFonbook() ? GetActiveFonbook()->GetTechId() : ""; } void FonbookManager::Reload() { for (size_t i=0; igetFonbookIDs().size(); i++) { fonbooks[gConfig->getFonbookIDs()[i]]->Reload(); } } Fonbooks *FonbookManager::GetFonbooks() { return &fonbooks; } } kfritz/libfritz++/HttpClient.cpp0000664000175000017500000000560112065572605014742 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "HttpClient.h" #include #include "Config.h" namespace fritz { HttpClient::HttpClient(std::string &host, int port) : TcpClient(host, port, new ost2::URLStream()) { urlStream = static_cast(stream); } HttpClient::HttpClient(std::string &host, int port, ost2::URLStream *stream) : TcpClient(host, port, stream) { urlStream = static_cast(stream); } HttpClient::~HttpClient() { } std::string HttpClient::BuildUrl(const std::ostream & url){ std::stringstream request; request << "http://" << host << ":" << port << url.rdbuf(); //todo: url must start with '/' return request.str(); } std::string HttpClient::Result() { std::string response; while (!urlStream->eof()) { char buffer[1024]; urlStream->read(buffer, sizeof(buffer)-1); buffer[urlStream->gcount()] = 0; response += buffer; } urlStream->close(); return response; } std::string HttpClient::Get(const std::ostream& url) { urlStream->setAgent("Lynx/2.8.5"); ost2::URLStream::Error returnCode = urlStream->get(BuildUrl(url).c_str()); if (returnCode != ost2::URLStream::errSuccess) THROW(ost::SockException("Arbitrary error occured", ost::Socket::errNotConnected)); return Result(); } std::string HttpClient::Post(const std::ostream &url, const std::ostream &postdata) { const std::stringstream &payload = static_cast(postdata); char param0[payload.str().size()+1]; strcpy(param0, payload.str().c_str()); const char * params[2]; params[0] = param0; params[1] = 0; ost2::URLStream::Error returnCode = urlStream->post(BuildUrl(url).c_str(), params); if (returnCode != ost2::URLStream::errSuccess) THROW(ost::SockException("Arbitrary error occured", ost::Socket::errNotConnected)); return Result(); } std::string HttpClient::PostMIME(const std::ostream &url, ost2::MIMEMultipartForm &form) { ost2::URLStream::Error returnCode = urlStream->post(BuildUrl(url).c_str(), form); if (returnCode != ost2::URLStream::errSuccess) THROW(ost::SockException("Arbitrary error occured", ost::Socket::errNotConnected)); return Result(); } } kfritz/libfritz++/LookupFonbook.h0000664000175000017500000000416712065572605015126 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef LOOKUPFONBOOK_H_ #define LOOKUPFONBOOK_H_ #include "Fonbook.h" namespace fritz { class LookupFonbook: public Fonbook { public: LookupFonbook(std::string title, std::string techId, bool writeable = false); virtual ~LookupFonbook(); /** * Take action to fill phonebook with content. * Initialize() may be called more than once per session. * @return if initialization was successful */ virtual bool Initialize(); /** * Resolves the number given to the corresponding name. * @param number to resolve * @return resolved name and type or the number, if unsuccessful */ virtual sResolveResult ResolveToName(std::string number); /** * Resolves number doing a (costly) lookup * @param number to resolve * @return resolved name and type or number, if not successful */ virtual sResolveResult Lookup(std::string number) const; /** * Returns the number of entries in the telephonebook. * @return the number of entries */ virtual size_t GetFonbookSize() const { return 0; } /** * Returns a specific telephonebook entry. * @param id unique identifier of the requested entry * @return the entry with key id or NULL, if unsuccessful */ virtual const FonbookEntry *RetrieveFonbookEntry(size_t id __attribute__((unused))) const { return NULL; } }; } /* namespace fritz */ #endif /* LOOKUPFONBOOK_H_ */ kfritz/libfritz++/Listener.cpp0000664000175000017500000001443412065572605014455 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "Listener.h" #include #include #include #include #include #include "CallList.h" #include "Config.h" #include "FonbookManager.h" #include "Tools.h" namespace fritz{ Listener *Listener::me = NULL; Listener::Listener(EventHandler *event) :Thread() { setName("Listener"); setCancel(cancelDeferred); this->event = event; start(); } Listener::~Listener() { terminate(); } void Listener::CreateListener(EventHandler *event) { EventHandler *oldEvent = me ? me->event : NULL; DeleteListener(); if (event || oldEvent) me = new Listener(event ? event : oldEvent); else ERR("Invalid call parameter. First call to CreateListener needs event handler object."); } void Listener::DeleteListener() { if (me) { DBG("deleting listener"); delete me; me = NULL; } } void Listener::HandleNewCall(bool outgoing, int connId, std::string remoteNumber, std::string localParty, std::string medium) { if ( Tools::MatchesMsnFilter(localParty) ) { // do reverse lookup Fonbook::sResolveResult result = FonbookManager::GetFonbook()->ResolveToName(remoteNumber); // resolve SIP names std::string mediumName; if (medium.find("SIP") != std::string::npos && gConfig->getSipNames().size() > (size_t)atoi(&medium[3])) mediumName = gConfig->getSipNames()[atoi(&medium[3])]; else mediumName = medium; // notify application if (event) event->HandleCall(outgoing, connId, remoteNumber, result.name, result.type, localParty, medium, mediumName); activeConnections.push_back(connId); } } void Listener::HandleConnect(int connId) { // only notify application if this connection is part of activeConnections bool notify = false; for (std::vector::iterator it = activeConnections.begin(); it < activeConnections.end(); ++it) { if (*it == connId) { notify = true; break; } } if (notify) if (event) event->HandleConnect(connId); } void Listener::HandleDisconnect(int connId, std::string duration) { // only notify application if this connection is part of activeConnections bool notify = false; for (std::vector::iterator it = activeConnections.begin(); it < activeConnections.end(); ++it) { if (*it == connId) { activeConnections.erase(it); notify = true; break; } } if (notify) { if (event) event->HandleDisconnect(connId, duration); // force reload of callList CallList *callList = CallList::getCallList(false); if (callList) callList->start(); } } void Listener::run() { DBG("Listener thread started"); Thread::setException(Thread::throwException); unsigned int retry_delay = RETRY_DELAY / 2; while (true) { try { retry_delay = retry_delay > 1800 ? 3600 : retry_delay * 2; ost::TCPStream tcpStream(ost::IPV4Host(gConfig->getUrl().c_str()), gConfig->getListenerPort()); while (true) { DBG("Waiting for a message."); char data[1024]; tcpStream.getline(data, sizeof(data)); if (gConfig->logPersonalInfo()) DBG("Got message " << data); // split line into tokens std::string date = Tools::Tokenize(data, ';', 0); std::string type = Tools::Tokenize(data, ';', 1); int connId = atoi(Tools::Tokenize(data, ';', 2).c_str()); std::string partA = Tools::Tokenize(data, ';', 3); std::string partB = Tools::Tokenize(data, ';', 4); std::string partC = Tools::Tokenize(data, ';', 5); std::string partD = Tools::Tokenize(data, ';', 6); #if 0 // some strings sent from the FB, made available to xgettext I18N_NOOP("POTS"); I18N_NOOP("ISDN"); #endif if (type.compare("CALL") == 0) { // partA => box port // partB => caller Id (local) // partC => called Id (remote) // partD => medium (POTS, SIP[1-9], ISDN, ...) DBG("CALL " << ", " << partA << ", " << (gConfig->logPersonalInfo() ? partB : HIDDEN) << ", " << (gConfig->logPersonalInfo() ? partC : HIDDEN) << ", " << partD); // an '#' can be appended to outgoing calls by the phone, so delete it if (partC[partC.length()-1] == '#') partC = partC.substr(0, partC.length()-1); HandleNewCall(true, connId, partC, partB, partD); } else if (type.compare("RING") == 0) { // partA => caller Id (remote) // partB => called Id (local) // partC => medium (POTS, SIP[1-9], ISDN, ...) DBG("RING " << ", " << (gConfig->logPersonalInfo() ? partA : HIDDEN) << ", " << (gConfig->logPersonalInfo() ? partB : HIDDEN) << ", " << partC); HandleNewCall(false, connId, partA, partB, partC); } else if (type.compare("CONNECT") == 0) { // partA => box port // partB => local/remote Id DBG("CONNECT " << ", " << partA << ", " << (gConfig->logPersonalInfo() ? partB : HIDDEN)); HandleConnect(connId); } else if (type.compare("DISCONNECT") == 0) { // partA => call duration DBG("DISCONNECT " << ", " << partA ); HandleDisconnect(connId, partA); } else { DBG("Got unknown message " << data); throw this; } retry_delay = RETRY_DELAY; } } catch(ost::SockException& se) { ERR("Exception - " << se.what()); if (se.getSocketError() == ost::Socket::errConnectRefused) ERR("Make sure to enable the Fritz!Box call monitor by dialing #96*5* once."); } catch (Listener *listener) { ERR("Exception unknown data received."); } ERR("waiting " << retry_delay << " seconds before retrying"); ost::Thread::sleep(retry_delay*1000); // delay the retry } DBG("Listener thread ended"); } } kfritz/libfritz++/Fonbooks.cpp0000664000175000017500000000225712065572605014450 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "Fonbooks.h" namespace fritz{ Fonbooks::Fonbooks() { } Fonbooks::~Fonbooks() { } Fonbook *Fonbooks::operator[](std::string key) const { for (size_t i=0; isize(); i++) { if ((*this)[i]->GetTechId() == key) { return ((*this)[i]); } } return NULL; } Fonbook *Fonbooks::operator[](size_t i) const { return (*((std::vector*) this))[i]; } } kfritz/libfritz++/TcpClient.h0000664000175000017500000000220712065572605014215 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef TCPCLIENT_H #define TCPCLIENT_H #include namespace fritz { class TcpClient { protected: TcpClient(std::string &host, int port, ost::TCPStream *stream); std::string host; int port; ost::TCPStream *stream; public: TcpClient(std::string &host, int port); virtual ~TcpClient(); }; } #endif /* TCPCLIENT_H_ */ kfritz/libfritz++/FritzFonbook.h0000664000175000017500000000232412065572605014744 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FRITZFONBOOK_H #define FRITZFONBOOK_H #include #include "XmlFonbook.h" namespace fritz{ class FritzFonbook : public ost::Thread, public XmlFonbook { friend class FonbookManager; private: FritzFonbook(); void ParseHtmlFonbook(std::string *msg); virtual void Write(); public: virtual ~FritzFonbook(); bool Initialize(); void run(); void Reload(); }; } #endif /*FRITZFONBUCH_H_*/ kfritz/libfritz++/Doxyfile0000664000175000017500000021514712065570712013673 0ustar jojo# Doxyfile 1.7.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = libfritz++ # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is adviced to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the # mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called Helvetica to the output # directory and reference it in all dot files that doxygen generates. # When you want a differently looking font you can specify the font name # using DOT_FONTNAME. You need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = Helvetica # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES kfritz/libfritz++/Makefile0000664000175000017500000000152412065570712013615 0ustar jojoLIB = libfritz++.a OBJS = cc++/url.o cc++/mime.o cc++/urlstring.o cc++/soap.o CallList.o Config.o Fonbooks.o Fonbook.o FonbookManager.o FritzClient.o FritzFonbook.o HttpClient.o Listener.o LookupFonbook.o Tools.o LocalFonbook.o Nummerzoeker.o OertlichesFonbook.o SoapClient.o TcpClient.o TelLocalChFonbook.o XmlFonbook.o CXXFLAGS ?= -g -O2 -Wall -fPIC .PHONY: all test clean ### for cc++ dir INCLUDES += -I. all: $(LIB) test %.o: %.cpp $(CXX) $(CXXFLAGS) -o $@ -c $(DEFINES) $(INCLUDES) $< $(LIB): $(OBJS) ar ru $(LIB) $(OBJS) @-echo Built $(LIB). clean: @-make -C test clean @-rm $(LIB) $(OBJS) $(DEPFILE) $(TEST_OBJS) $(TEST_EXEC) ### # Tests test: @-make -C test ### # Dependencies: MAKEDEP = $(CXX) -MM -MG DEPFILE = .dependencies $(DEPFILE): Makefile @$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.cpp) > $@ -include $(DEPFILE)kfritz/libfritz++/Nummerzoeker.h0000664000175000017500000000214712065572605015016 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef NUMMERZOEKER_H #define NUMMERZOEKER_H #include "LookupFonbook.h" namespace fritz { class NummerzoekerFonbook : public LookupFonbook { friend class FonbookManager; private: NummerzoekerFonbook(); public: virtual sResolveResult Lookup(std::string number) const; }; } #endif /*NUMMERZOEKER_H_*/ kfritz/libfritz++/AUTHORS0000664000175000017500000000014412065570712013222 0ustar jojoDevelopers: * Joachim Wilke * Matthias Becker kfritz/libfritz++/Tools.h0000664000175000017500000001274012065570712013430 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2010 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FRITZTOOLS_H #define FRITZTOOLS_H #include #include #include #include #define I18N_NOOP(x) x namespace fritz{ typedef unsigned char uchar; // When handling strings that might contain UTF-8 characters, it may be necessary // to process a "symbol" that consists of several actual character bytes. The // following functions allow transparently accessing a "char *" string without // having to worry about what character set is actually used. int Utf8CharLen(const char *s); ///< Returns the number of character bytes at the beginning of the given ///< string that form a UTF-8 symbol. uint Utf8CharGet(const char *s, int Length = 0); ///< Returns the UTF-8 symbol at the beginning of the given string. ///< Length can be given from a previous call to Utf8CharLen() to avoid calculating ///< it again. If no Length is given, Utf8CharLen() will be called. int Utf8CharSet(uint c, char *s = NULL); ///< Converts the given UTF-8 symbol to a sequence of character bytes and copies ///< them to the given string. Returns the number of bytes written. If no string ///< is given, only the number of bytes is returned and nothing is copied. int Utf8SymChars(const char *s, int Symbols); ///< Returns the number of character bytes at the beginning of the given ///< string that form at most the given number of UTF-8 symbols. int Utf8StrLen(const char *s); ///< Returns the number of UTF-8 symbols formed by the given string of ///< character bytes. char *Utf8Strn0Cpy(char *Dest, const char *Src, int n); ///< Copies at most n character bytes from Src to Dst, making sure that the ///< resulting copy ends with a complete UTF-8 symbol. The copy is guaranteed ///< to be zero terminated. ///< Returns a pointer to Dest. int Utf8ToArray(const char *s, uint *a, int Size); ///< Converts the given character bytes (including the terminating 0) into an ///< array of UTF-8 symbols of the given Size. Returns the number of symbols ///< in the array (without the terminating 0). int Utf8FromArray(const uint *a, char *s, int Size, int Max = -1); ///< Converts the given array of UTF-8 symbols (including the terminating 0) ///< into a sequence of character bytes of at most Size length. Returns the ///< number of character bytes written (without the terminating 0). ///< If Max is given, only that many symbols will be converted. ///< The resulting string is always zero-terminated if Size is big enough. // When allocating buffer space, make sure we reserve enough space to hold // a string in UTF-8 representation: #define Utf8BufSize(s) ((s) * 4) // The following macros automatically use the correct versions of the character // class functions: #define Utf8to(conv, c) (cCharSetConv::SystemCharacterTable() ? to##conv(c) : tow##conv(c)) #define Utf8is(ccls, c) (cCharSetConv::SystemCharacterTable() ? is##ccls(c) : isw##ccls(c)) class CharSetConv { private: iconv_t cd; char *result; size_t length; static char *systemCharacterTable; public: explicit CharSetConv(const char *FromCode = NULL, const char *ToCode = NULL); ///< Sets up a character set converter to convert from FromCode to ToCode. ///< If FromCode is NULL, the previously set systemCharacterTable is used. ///< If ToCode is NULL, "UTF-8" is used. ~CharSetConv(); const char *Convert(const char *From, char *To = NULL, size_t ToLength = 0); ///< Converts the given Text from FromCode to ToCode (as set in the constructor). ///< If To is given, it is used to copy at most ToLength bytes of the result ///< (including the terminating 0) into that buffer. If To is not given, ///< the result is copied into a dynamically allocated buffer and is valid as ///< long as this object lives, or until the next call to Convert(). The ///< return value always points to the result if the conversion was successful ///< (even if a fixed size To buffer was given and the result didn't fit into ///< it). If the string could not be converted, the result points to the ///< original From string. static void DetectCharset(); static const char *SystemCharacterTable(void) { return systemCharacterTable; } static void SetSystemCharacterTable(const char *CharacterTable); }; class Tools { public: Tools(); virtual ~Tools(); static bool MatchesMsnFilter(const std::string &number); static std::string NormalizeNumber(std::string number); static int CompareNormalized(std::string number1, std::string number2); static bool GetLocationSettings(); static void GetSipSettings(); static std::string Tokenize(const std::string &buffer, const char delimiter, size_t pos); }; } #endif /*FRITZTOOLS_H_*/ kfritz/libfritz++/CallList.h0000664000175000017500000000546012065572605014043 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CALLLIST_H #define CALLLIST_H #include #include #include namespace fritz{ class CallList; class CallEntry { public: enum eCallType { ALL = 0, INCOMING = 1, MISSED = 2, OUTGOING = 3 }; enum eElements { ELEM_TYPE, ELEM_DATE, ELEM_REMOTENAME, ELEM_REMOTENUMBER, ELEM_LOCALNAME, ELEM_LOCALNUMBER, ELEM_DURATION, }; eCallType type; std::string date; std::string time; std::string remoteName; std::string remoteNumber; std::string localName; std::string localNumber; std::string duration; time_t timestamp; bool MatchesFilter(); bool MatchesRemoteNumber(std::string number); }; class CallList : public ost::Thread { private: std::vector callListIn; std::vector callListMissed; std::vector callListOut; std::vector callListAll; time_t lastCall; time_t lastMissedCall; bool valid; static CallList *me; CallList(); public: static CallList *getCallList(bool create = true); /** * Activate call list support. * This method fetches the call list from the fritz box. Following calls to * CallList::getCallList() return a reference to this call list object. * If CreateCallList is not called before a call to getCallList() this triggers fetching * the call list in a separate thread (which is possibly not wanted). */ static void CreateCallList(); static void DeleteCallList(); virtual ~CallList(); void run(); bool isValid() { return valid; } CallEntry *RetrieveEntry(CallEntry::eCallType type, size_t id); size_t GetSize(CallEntry::eCallType type); size_t MissedCalls(time_t since); time_t LastCall() { return lastCall; } time_t LastMissedCall() { return lastMissedCall; } /** * Sorts the calllist's entries by the given element and in given order. * @param the element used for sorting * @param true if sort order is ascending, false otherwise */ void Sort(CallEntry::eElements element = CallEntry::ELEM_DATE, bool ascending = true); }; } #endif /*CALLLIST_H_*/ kfritz/libfritz++/FritzClient.h0000664000175000017500000000342012065572605014563 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FRITZCLIENT_H #define FRITZCLIENT_H #include #include "SoapClient.h" namespace fritz { class FritzClient { private: static ost::Mutex *mutex; std::string CalculateLoginResponse(std::string challenge); std::string UrlEncode(std::string &s); bool Login(); std::string GetLang(); bool validPassword; HttpClient *httpClient; SoapClient *soapClient; public: FritzClient (); virtual ~FritzClient(); virtual bool InitCall(std::string &number); virtual std::string RequestLocationSettings(); virtual std::string RequestSipSettings(); virtual std::string RequestCallList(); virtual std::string RequestFonbook(); virtual void WriteFonbook(std::string xmlData); virtual bool hasValidPassword() { return validPassword; } virtual bool reconnectISP(); virtual std::string getCurrentIP(); }; class FritzClientFactory { public: virtual ~FritzClientFactory() {} virtual FritzClient *create() { return new FritzClient; } }; } #endif /* FRITZCLIENT_H_ */ kfritz/libfritz++/LookupFonbook.cpp0000664000175000017500000000331612065572605015454 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "LookupFonbook.h" #include "Config.h" namespace fritz { LookupFonbook::LookupFonbook(std::string title, std::string techId, bool writeable) :Fonbook(title, techId, writeable) { displayable = false; } LookupFonbook::~LookupFonbook() {} bool LookupFonbook::Initialize() { setInitialized(true); return true; } Fonbook::sResolveResult LookupFonbook::ResolveToName(std::string number) { // First, try to get a cached result sResolveResult resolve = Fonbook::ResolveToName(number); // Second, to lookup (e.g., via HTTP) if (! resolve.successful) { resolve = Lookup(number); // cache result despite it was successful FonbookEntry fe(resolve.name, false); fe.AddNumber(0, number, resolve.type, "", "", 0); AddFonbookEntry(fe); } return resolve; } Fonbook::sResolveResult LookupFonbook::Lookup(std::string number) const { sResolveResult result(number); return result; } } /* namespace fritz */ kfritz/libfritz++/XmlFonbook.cpp0000664000175000017500000001427012065570712014741 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2010 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "XmlFonbook.h" #include #include #include #include "Config.h" #include "Tools.h" namespace fritz { XmlFonbook::XmlFonbook(std::string title, std::string techId, bool writeable) : Fonbook(title, techId, writeable) { charset = CharSetConv::SystemCharacterTable() ? CharSetConv::SystemCharacterTable() : "UTF-8"; } XmlFonbook::~XmlFonbook() { } std::string XmlFonbook::ExtractXmlAttributeValue(std::string element, std::string attribute, std::string xml) { size_t posStart = xml.find('<'+element); if (posStart != std::string::npos) { posStart = xml.find(attribute+"=\"", posStart); if (posStart != std::string::npos) { size_t posEnd = xml.find("\"", posStart + attribute.length() + 2); if (posEnd != std::string::npos) return xml.substr(posStart + attribute.length() + 2, posEnd - posStart - attribute.length() - 2); } } return ""; } std::string XmlFonbook::ExtractXmlElementValue(std::string element, std::string xml) { size_t posStart = xml.find('<'+element); if (posStart != std::string::npos) { posStart = xml.find(">", posStart); if (xml[posStart-1] == '/') return ""; size_t posEnd = xml.find("'); if (posEnd != std::string::npos) return xml.substr(posStart + 1, posEnd - posStart - 1); } return ""; } void XmlFonbook::ParseXmlFonbook(std::string *msg) { DBG("Parsing fonbook using xml parser.") // determine charset size_t pos, posStart, posEnd; posStart = msg->find("encoding=\""); if (posStart != std::string::npos) { posEnd = msg->find("\"", posStart + 10); if (posEnd != std::string::npos) charset = msg->substr(posStart + 10, posEnd - posStart - 10); } DBG("using charset " << charset); CharSetConv *conv = new CharSetConv(charset.c_str(), CharSetConv::SystemCharacterTable()); const char *s_converted = conv->Convert(msg->c_str()); std::string msgConv = s_converted; delete (conv); pos = msgConv.find(""); while (pos != std::string::npos) { std::string msgPart = msgConv.substr(pos, msgConv.find("", pos) - pos + 10); std::string category = ExtractXmlElementValue("category", msgPart); std::string name = convertEntities(ExtractXmlElementValue("realName", msgPart)); FonbookEntry fe(name, category == "1"); size_t posNumber = msgPart.find("", posNumber) - posNumber + 9); std::string number = ExtractXmlElementValue ("number", msgPartofPart); std::string typeStr = ExtractXmlAttributeValue("number", "type", msgPartofPart); std::string quickdial = ExtractXmlAttributeValue("number", "quickdial", msgPartofPart); std::string vanity = ExtractXmlAttributeValue("number", "vanity", msgPartofPart); std::string prio = ExtractXmlAttributeValue("number", "prio", msgPartofPart); if (number.size()) { // the xml may contain entries without a number! FonbookEntry::eType type = FonbookEntry::TYPE_NONE; if (typeStr == "home") type = FonbookEntry::TYPE_HOME; if (typeStr == "mobile") type = FonbookEntry::TYPE_MOBILE; if (typeStr == "work") type = FonbookEntry::TYPE_WORK; fe.AddNumber(numberCount++, number, type, quickdial, vanity, atoi(prio.c_str())); } posNumber = msgPart.find("", pos+1); } } std::string XmlFonbook::SerializeToXml() { std::stringstream result; result << "" "" ""; for (size_t i = 0; i < GetFonbookSize(); i++) { const FonbookEntry *fe = RetrieveFonbookEntry(i); result << "" << "" << (fe->IsImportant() ? "1" : "0") << "" << "" << "" << fe->GetName() << "" << "" << ""; for (size_t numberPos = 0; numberPos < FonbookEntry::MAX_NUMBERS; numberPos++) if (fe->GetNumber(numberPos).length() > 0) { //just iterate over all numbers std::string typeName = ""; switch (fe->GetType(numberPos)) { case FonbookEntry::TYPE_NONE: case FonbookEntry::TYPE_HOME: typeName="home"; break; case FonbookEntry::TYPE_MOBILE: typeName="mobile"; break; case FonbookEntry::TYPE_WORK: typeName="work"; break; default: // should not happen break; } result << "GetQuickdial(numberPos) << "\" " "vanity=\"" << fe->GetVanity(numberPos) << "\" " "prio=\"" << fe->GetPriority(numberPos) << "\">" << fe->GetNumber(numberPos) << ""; } //TODO: add 1306951031 result << "" << "" << "" << ""; } result << "" ""; CharSetConv *conv = new CharSetConv(CharSetConv::SystemCharacterTable(), charset.c_str()); const char *result_converted = conv->Convert(result.str().c_str()); std::string xmlData = result_converted; delete (conv); // replace '&' with '&' std::string::size_type pos = 0; while ((pos = xmlData.find('&', pos)) != std::string::npos) { xmlData.replace(pos, 1, "&"); pos += 5; } return xmlData; } } kfritz/libfritz++/LocalFonbook.cpp0000664000175000017500000001211512065572605015232 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "LocalFonbook.h" #include #include #include #include #include "Config.h" #include "Tools.h" namespace fritz { class ReadLine { private: size_t size; char *buffer; public: ReadLine(void); ~ReadLine(); char *Read(FILE *f); }; ReadLine::ReadLine(void) { size = 0; buffer = NULL; } ReadLine::~ReadLine() { free(buffer); } char *ReadLine::Read(FILE *f) { int n = getline(&buffer, &size, f); if (n > 0) { n--; if (buffer[n] == '\n') { buffer[n] = 0; if (n > 0) { n--; if (buffer[n] == '\r') buffer[n] = 0; } } return buffer; } return NULL; } LocalFonbook::LocalFonbook() : XmlFonbook(I18N_NOOP("Local phone book"), "LOCL", true) { filePath = NULL; } bool LocalFonbook::Initialize() { setInitialized(false); Clear(); // first, try xml phonebook int ret = asprintf(&filePath, "%s/localphonebook.xml", gConfig->getConfigDir().c_str()); if (ret <= 0) return false; if (access(filePath, F_OK) == 0) { INF("loading " << filePath); std::ifstream file(filePath); if (!file.good()) return false; std::string xmlData((std::istreambuf_iterator(file)),std::istreambuf_iterator()); ParseXmlFonbook(&xmlData); setInitialized(true); return true; } else DBG("XML phonebook not found, trying old csv based ones."); // try deprecated filenames free(filePath); filePath = NULL; char fileNames[3][20] = {"localphonebook.csv", "localfonbook.csv", "localfonbuch.csv"}; for (size_t pos = 0; pos < 3; pos++) { int ret = asprintf(&filePath, "%s/%s", gConfig->getConfigDir().c_str(), fileNames[pos]); if (ret <= 0) return false; if (access(filePath, F_OK) == 0) { if (pos > 0) INF("warning, using deprecated file " << filePath << ", please rename to " << fileNames[0] << "."); break; } free(filePath); filePath = NULL; } if (filePath) { ParseCsvFonbook(filePath); free(filePath); setInitialized(true); // convert to xml when saving int res = asprintf(&filePath, "%s/localphonebook.xml", gConfig->getConfigDir().c_str()); if (res <= 0) return false; return true; } else { // file not available -> log preferred filename and location ERR("file " << gConfig->getConfigDir().c_str() << "/" << fileNames[0] << " not found."); // if no file exists, put the preferred name into filepath (for later usage) // convert to xml when saving int res = asprintf(&filePath, "%s/localphonebook.xml", gConfig->getConfigDir().c_str()); if (res <= 0) return false; setInitialized(true); return false; } return false; } void LocalFonbook::Reload() { Initialize(); } void LocalFonbook::ParseCsvFonbook(std::string filePath) { INF("loading " << filePath); FILE *f = fopen(filePath.c_str(), "r"); if (f) { char *s; ReadLine ReadLine; while ((s = ReadLine.Read(f)) != NULL) { if (s[0] == '#') continue; char* name_buffer = strtok(s, ",;"); char* type_buffer = strtok(NULL, ",;"); char* number_buffer = strtok(NULL, ",;"); if (name_buffer && type_buffer && number_buffer) { std::string name = name_buffer; FonbookEntry::eType type = (FonbookEntry::eType) atoi(type_buffer); std::string number = number_buffer; // search for existing fe bool feExists = false; for (size_t feNr = 0; feNr < GetFonbookSize(); feNr++) if (RetrieveFonbookEntry(feNr)->GetName() == name) { FonbookEntry fe(RetrieveFonbookEntry(feNr)); fe.AddNumber(type, number, type); //TODO: quickdial, vanity and priority not supported here ChangeFonbookEntry(feNr, fe); feExists = true; } // add to new fe if (!feExists) { FonbookEntry fe(name, false); //TODO: important not supported here fe.AddNumber(type, number, type); AddFonbookEntry(fe); } } else { ERR("parse error at " << s); } } Sort(FonbookEntry::ELEM_NAME, true); fclose(f); } } void LocalFonbook::Write() { DBG("Saving to " << filePath << "."); // filePath should always contain a valid content, this is just to be sure if (!filePath) return; // open file std::ofstream file(filePath, std::ios_base::trunc); if (file.fail()) return; // write all entries to the file file << SerializeToXml(); // close file file.close(); DBG("Saving successful."); } } kfritz/libfritz++/HttpClient.h0000664000175000017500000000270112065572605014405 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef HTTPCLIENT_H #define HTTPCLIENT_H #include "cc++/url.h" #include "TcpClient.h" namespace fritz { class HttpClient : public TcpClient { private: ost2::URLStream *urlStream; protected: HttpClient(std::string &host, int port, ost2::URLStream *stream); std::string Result(); std::string BuildUrl(const std::ostream & url); public: explicit HttpClient(std::string &host, int port = 80); virtual ~HttpClient(); std::string Get(const std::ostream& os); std::string Post(const std::ostream &url, const std::ostream &postdata); std::string PostMIME(const std::ostream &url, ost2::MIMEMultipartForm &form); }; } #endif /* HTTPCLIENT_H_ */ kfritz/libfritz++/TcpClient.cpp0000664000175000017500000000220412065572605014545 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "TcpClient.h" namespace fritz { TcpClient::TcpClient(std::string &host, int port) { TcpClient(host, port, new ost::TCPStream()); } TcpClient::TcpClient(std::string &host, int port, ost::TCPStream *stream) { this->host = host; this->port = port; this->stream = stream; } TcpClient::~TcpClient() { delete stream; } } kfritz/libfritz++/HISTORY0000664000175000017500000003123212067266303013240 0ustar jojo2008-12: - Added type "ALL" to CallList to retrieve complete list of calls at once. - Moved callType from CallList to CallEntry. - Implemented in-library msn filtering and reverse-lookups. - Renamed various methods in FonbookManager from *Fonbuch* to *Fonbook*. - Made CallList a singleton. - Replaced string tokenizer in Listener. - Refactored MSN-filter functionality. - Added "-fPIC" to Makefiles. - A call to Config::SetupFonbookIDs now deletes a previously instantiated FonbookManager to allow multiple calls to SetupFonbookIDs in case of configuration changes. - Introduced new method CallList::DeleteCallList() to explicitly delete the singleton instance. - Made Listener a singleton. A call to Listener::CreateListener() is used to activate this feature. - Introduced new method CallList::CreateCallList() to explicitly pre-fetch the call list before calling CallList::getCallList(). - Moved Config::SetupFonbookIDs to FonbookManager::CreateFonbookManager(). - Renamed Tools::GetPhoneSettings() to Tools::GetLocationSettings(). - Added resolving of SIP[0-9] to real provider names. - removed the port defines and replaced them by two new fields in class Config to allow easier unit testing - default LKZ to 49 (Germany) if an error occurs 2009-02: - added exception catch in Tools::GetLang() and Tools::Login() 2009-03: - Removed the default of countryCode = "49" if Tools::GetLocationSettings() fails. This task is handed over to the caller, see next. - Added new parameters to Config::Setup() to give default values for countryCode and regionCode. The default parameters are used, when auto-detection in Tools::GetLocationSettings() fails. The new parameter locationSettingsDetected indicates whether auto-detection was successful. In this case, the given default values are overwritten to give the caller access to the new values. 2009-04: - Fixed naming of local phonebook. The recommended name is now localphonebook.csv, the old name localfonbuch.csv is still accepted. The directory remains $vdrconfigdir/plugins/fritzbox/. 2009-05: - Updated OertlichesFonbook to new website layout - Fixed naming of local phonebook. The plugin now really looks for a file called localphonebook.csv. 2009-06: - Provided Interface to add entries to phone books. By default, existing implementations do not support this feature. - Implemented adding of entries in local phone book. 2009-08: - Implemented new login method for Fritz!Box firmware >= xx.04.74 using SIDs. This needs features from openssl library. For compiling, libssl-dev (or similar) is needed. - Adapted to new tcpclient++ - Fixed a warning warn_unused_result in LocalFonbook.cpp - Fixed wrong HTTP-GET header in Nummerzoeker.cpp - Fixed detection of login failure in Tools::Login() - Improved cleanup when deleting Listener, FritzFonbook, CallList - Delay destructor of FritzFonbook and CallList to wait for running threads to end - Improved concurrent access to Fritz!Box using Tools::GetFritzBoxMutex() 2009-09: - Improved detection of login type (SID or PASSWORD), which is now done only once - Improved Tools::Login() to avoid unneccessary logins - Created FritzClient to act as an facade to the FB which uses tcpclient::HttpClient. FritzClient handles all communication to the FB including login. The consumer just uses one of the following methods to get information from the FB * RequestCallList() * RequestLocationSettings() * RequestSipSettings() * RequestFonbook() This class uses a mutex to automatically serialize multiple instances of itself. The lock is aquired at creation and released at destruction of the class instance. Removed mutex in Tools. - Login() and GetLang() moved as private methods to FritzClient - Code cleanup and introduction of RETRY_* macros for easy retry handling when communicating with the FB - Fixed entity decoding in FritzFonbook.cpp - Added sort routines in CallList and Fonbook 2009-11: - Adapted to changes in tcpclient++ * fixed TcpClient to throw correct exceptions on connect. This fixes detection of disabled call monitor, the corresponding hint "dial #96*5*" is now shown in syslog again - Improved matching of phone numbers: Fritz!Box control codes *xxx# are now ignored. - Added missing include in FritzClient.cpp 2009-12: - Fixed retry delay calculation in case of connection refused 2010-01: - Fixed a possible segfault when sorting calllists and fonbooks - Added Config::SetupPorts() to provide non-standard ports - Fixed some warnings about ununsed parameters in base-classes and empty implementations - Removed useless check in CallList::RetrieveEntry() - FritzClient::Login() now returns a bool wether login was successful - FritzClient::hasValidPassword() can now be used to determine the result of the last Login() - Tools::GetLocationSettings() now returns a bool wether the password used to access the FB was valid - Fixed two bugs in sorting call lists by date / time - Improved destructor of Listener to allow proper cleanup of thread - Added CallList::LastCall() - removed FonbookEntry::getTypeName() as this is something the consumer has to take care about 2010-02: - introduced I18N_NOOP macro, this allows application that use libfritz++ to identify strings delivered by the library (e.g., using xgettext) they should localize - fixed sorting issue in calllist by putting remoteNumber / "unknown" into the remoteName field - "unknown" call list entries are now always sorted to beginning of the list - addes a missing redefinition of GetTechId() in class FonbookManager - modified logging to handle full path filenames cause by cmake in __FILE__. Provided new logging macros DBG, INF, ERR - Removed dependency to OpenSSL due to licensing issues, using copy of MD5 implementation from GNU coreutils 5.93 - Removed md5.[h,c] in favor of libgcrypt, libfritz++ now needs libgcrypt's development header "gcrypt.h" to compile - Added a missing call to Login() in FritzClient::InitCall() - Do not initiate a call if no number is given in FritzClient::InitCall() - Fixed LOCATOR macro to support cmake and make - Implemented FritzClient::getCurrentIP and FritzClient::reconnectISP - Fixed bug in FritzClient::reconnectISP - added config option for setting the UPNP port - now parsing the Fritz Box's phone book via xml export file (if available) - phone book entries now have the additional fields "quickdial", "vanity", "priority", "important" - Fixed decoding of entities in xml phone book parser 2010-03: - Modified FonbookEntry class: one FonbookEntry now holds all numbers of a person * Changed construction of FonbookEntrys accordingly * Changed interface of Fonbook::ResolveToName * Adapted FritzFonbook's parser * Adapted LocalFonbook's parser * Adapted ResolveToName in NummerzoekerFonbook and OertlichesFonbook - Adapted local phonebook to use the same xml format, new FB versions use. Existing csv phone books are converted to xml automagically, entries with TYPE_NONE are converted to TYPE_HOME - FritzFonbook is now writeable, if FB xml import is available (firmware >= xx.04.76 needed) - Added various set methods to FonbookEntry 2010-07: - Updated OertlichesFonbook to website changes - Added XmlFonbook.cpp to Makefile - Fixed resolving of calls from unknown caller - Code cleanup in Listener, OertlichesFonbook and Nummerzoeker - Added tel.local.ch phonebook 2010-08: - Added missing initialization of libgcrypt 2010-11: - Sensitive Information like passwords, phone numbers, etc. are no longer logged by default. Logging this information can be enabled via Config::Setup() - Fixed parser in Tools::GetSipSettings() - Fixed serializing XML phone books in XmlFonbook::SerializeToXml() -> this fixes uploading an xml phone book to the FB - Include TelLocalChFonbook.cpp in CMakeLists.txt - Moved from libpthread++ to libccgnu2 2010-12: - First steps in migrating to socket implementation of common c++ - Splitted Config::Setup into Config::Setup and Config::Init - Fix reverse lookup in OertlichesFonbook - Add missing include to XmlFonbook 2011-01: - Add Config::Shutdown() to gracefully shutdown the library This can be used for re-inits as well as on program exit - Improve checks when parsing result list in OertlichesFonbook Check that at most one result is returned - Fix parser of OertlichesFonbook again Looking for the onclick=... as a last attribute does not always work New method looks for the first element containing the onclick attribute and then moves to the end of the element - Keep current call list as long as possible on reload Current call list is now cleared after the new call list has been parsed (Fixes #514) - Fix XmlFonbook parser XmlFonbook Parser was not aware of empty tags - Fix retry delay calculation in Listener - Fix FonbookManager if no phone book is configured at all - Add several consts to Fonbook, FonbookEntry and Reverse Lookup Fonbooks - Add copy constructor to FonbookEntry - Add Fonbook::ChangeFonbookEntry, Fonbook::SetDefaultType - Add methods for adding and deleting fonbook entries Fonbook::AddFonbookEntry and ::DeleteFonbookEntry - Make Fonbook::fonbookList private, add a Clear() method to erase it - Only write phone books back if changes are pending - Fixed setInitialized in LocalFonbook - Added HttpClient to libfritz++ to replace remaining functionality of libtcpclient++ - Adapted Makefile / CMakeLists.txt to add HttpClient - Adapted FritzClient's get and post calls - Adapted CallList, because new implementation doesn't return the header lines - Imported some files from libcommoncpp to fix issues * remove newline after HTTP POST data An unnecessary \r\n was added to data in HTTP POST requests, with certain webservers this causes errors * boundary spelling error In MIME multipart requests, boundary is spelled boundry * HTTP POST multipart consider form data in content length, send from data together with HTTP header * Extend MIMEFormData support for filename and content-type is added * SOAPStream Flexibilize URLStream with regard to content type in http posts Add SOAPStream class - Improve HttpClient to use default HTTP port - Migrate reverse lookup phone books to use new HttpClient - Provide PostMIME method in HttpClient - Make Fonbook::GetFonbookSize() more robust If not initialized, always return 0 and not the current intermediate state - Fix missing initialization in CallList 2011-02: - Extend Fonbook::AddFonbookEntry() to allow arbitrary position for new entry - Fix initialization of LocalFonbook Add setInitialized(true) in case of no local phonebook file exists 2011-03: - Add parsing of sipMsns - Fix logging into Fritz!Box without password - Fix krazy issues - Remove translatable string 'unknown' - Fix catching exceptions in FritzClient - Fix compile error with libcommoncpp2 / IPv6 - Add some debug output regarding threading - Remove unnecessary calls to exit() at end of threads - Initialization speedup - Add mutex to access syslog 2011-04: - Add new parameter 'saveOnShutdown' to CreateFonbookManager() - Add Fonbook::isModified() - Add missing FonbookManager::Save() to forward calls to Fonbook::Save() 2011-06: - Adapt to more flexible Fritz!Box phone books 2011-07: - Fix resolve in OertlichesFonbook - Add MatchesRemoteNumber to CallEntry - Fix fonbook ResolveToName - Get rid of TYPES_COUNT in FonbookEntry 2012-03: - Fix resolve in OertlichesFonbook - Add missing const in Fonbook / FonbookManager - Fix compiler warnings -Wsign-compare and -Wswitch - Improve constructor Fonbook() to ask for title, techid, writeable * Removes direct access to these members * Adds setWriteable() if a fonbook is determined to be writeable later - Add LookupFonbook class * Lookup-only foonbooks now inherit this class * Simplifies OertlichesFonbook, Nummerzoeker, TelLocalChFonbook significantly * Caches lookups in memory * Add successful field to sResolveResult * Removed const qualifier from Fonbook::ResolveToName - Add constructor to sResolveResult * Adapt users of sResolveResult - Reorganized some includes - Provide Doxyfile - Add missing documentation in Fonbook class 2012-04: - Fix resolve in OertlichesFonbook - Fix a possible deadlock in Tools::GetSipSettings() - Move convertEntities from XmlFonbook up to Fonbook and improved it - Fix resolve in TelLocalChFonbook 2012-12: - Implement new login scheme using login_sid.lua for FB firmware >= xx.05.50 - Adapt sip settings, location settings, call list and phone book requests to new uris and format - Hide msn in syslog if logPersonalInfo is disabled - Fixes login problems with old fw-versions that return 404 on login_sid.lua https://bugs.kde.org/show_bug.cgi?id=312204 - Fix encoding conversion when requesting call list - Further fixes to allow access to older FB firmwares https://bugs.kde.org/show_bug.cgi?id=312204 kfritz/libfritz++/Tools.cpp0000664000175000017500000003263312065572605013771 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2010 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "Tools.h" #include #include #include #include #include #include #include #include "Config.h" #include "FritzClient.h" namespace fritz{ // --- UTF-8 support --------------------------------------------------------- static uint SystemToUtf8[128] = { 0 }; int Utf8CharLen(const char *s) { if (CharSetConv::SystemCharacterTable()) return 1; #define MT(s, m, v) ((*(s) & (m)) == (v)) // Mask Test if (MT(s, 0xE0, 0xC0) && MT(s + 1, 0xC0, 0x80)) return 2; if (MT(s, 0xF0, 0xE0) && MT(s + 1, 0xC0, 0x80) && MT(s + 2, 0xC0, 0x80)) return 3; if (MT(s, 0xF8, 0xF0) && MT(s + 1, 0xC0, 0x80) && MT(s + 2, 0xC0, 0x80) && MT(s + 3, 0xC0, 0x80)) return 4; return 1; } uint Utf8CharGet(const char *s, int Length) { if (CharSetConv::SystemCharacterTable()) return (uchar)*s < 128 ? *s : SystemToUtf8[(uchar)*s - 128]; if (!Length) Length = Utf8CharLen(s); switch (Length) { case 2: return ((*s & 0x1F) << 6) | (*(s + 1) & 0x3F); case 3: return ((*s & 0x0F) << 12) | ((*(s + 1) & 0x3F) << 6) | (*(s + 2) & 0x3F); case 4: return ((*s & 0x07) << 18) | ((*(s + 1) & 0x3F) << 12) | ((*(s + 2) & 0x3F) << 6) | (*(s + 3) & 0x3F); } return *s; } char *CharSetConv::systemCharacterTable = NULL; CharSetConv::CharSetConv(const char *FromCode, const char *ToCode) { if (!FromCode) FromCode = systemCharacterTable ? systemCharacterTable : "UTF-8"; if (!ToCode) ToCode = "UTF-8"; cd = iconv_open(ToCode, FromCode); result = NULL; length = 0; } CharSetConv::~CharSetConv() { free(result); iconv_close(cd); } void CharSetConv::DetectCharset() { char *CodeSet = NULL; if (setlocale(LC_CTYPE, "")) CodeSet = nl_langinfo(CODESET); else { char *LangEnv = getenv("LANG"); // last resort in case locale stuff isn't installed if (LangEnv) { CodeSet = strchr(LangEnv, '.'); if (CodeSet) CodeSet++; // skip the dot } } if (CodeSet) { INF("detected codeset is '" << CodeSet << "'"); SetSystemCharacterTable(CodeSet); } } void CharSetConv::SetSystemCharacterTable(const char *CharacterTable) { free(systemCharacterTable); systemCharacterTable = NULL; if (!strcasestr(CharacterTable, "UTF-8")) { // Set up a map for the character values 128...255: char buf[129]; for (int i = 0; i < 128; i++) buf[i] = i + 128; buf[128] = 0; CharSetConv csc(CharacterTable); const char *s = csc.Convert(buf); int i = 0; while (*s) { int sl = Utf8CharLen(s); SystemToUtf8[i] = Utf8CharGet(s, sl); s += sl; i++; } systemCharacterTable = strdup(CharacterTable); } } const char *CharSetConv::Convert(const char *From, char *To, size_t ToLength) { if (From && *From) { char *FromPtr = (char *)From; size_t FromLength = strlen(From); char *ToPtr = To; if (!ToPtr) { if (length < (FromLength * 2)) // some reserve to avoid later reallocations length = FromLength * 2; result = (char *)realloc(result, length); ToPtr = result; ToLength = length; } else if (!ToLength) return From; // can't convert into a zero sized buffer ToLength--; // save space for terminating 0 char *Converted = ToPtr; while (FromLength > 0) { if (iconv(cd, &FromPtr, &FromLength, &ToPtr, &ToLength) == size_t(-1)) { if (errno == E2BIG || (errno == EILSEQ && ToLength < 1)) { if (To) break; // caller provided a fixed size buffer, but it was too small // The result buffer is too small, so increase it: size_t d = ToPtr - result; size_t r = length / 2; length += r; Converted = result = (char *)realloc(result, length); ToLength += r; ToPtr = result + d; } if (errno == EILSEQ) { // A character can't be converted, so mark it with '?' and proceed: FromPtr++; FromLength--; *ToPtr++ = '?'; ToLength--; } else if (errno != E2BIG) return From; // unknown error, return original string } } *ToPtr = 0; return Converted; } return From; } Tools::Tools() { } Tools::~Tools() { } bool Tools::MatchesMsnFilter(const std::string &number){ // if no MSN filter is set, true is returned if (gConfig->getMsnFilter().size() == 0) return true; // if number does contain a MSN out of the MSN filter, true is returned for (size_t pos=0; pos < gConfig->getMsnFilter().size(); pos++) { if (number.find(gConfig->getMsnFilter()[pos]) != std::string::npos ) { //matched return true; } } // no match return false; } std::string Tools::NormalizeNumber(std::string number) { // Remove Fritz!Box control codes *xyz# if used if (number[0] == '*') { size_t hashPos = number.find('#'); if (hashPos != std::string::npos) number.erase(0, hashPos + 1); } // Only for Germany: Remove Call-By-Call Provider Selection Codes 010(0)xx if ( gConfig->getCountryCode() == "49") { if (number[0] == '0' && number[1] == '1' && number[2] == '0') { if (number[3] == '0') number.erase(0, 6); else number.erase(0, 5); } } // Modifies 'number' to the following format // '00' + countryCode + regionCode + phoneNumber if (number[0] == '+') { //international prefix given in form +49 -> 0049 number.replace(0, 1, "00"); } else if (number[0] == '0' && number[1] != '0') { //national prefix given 089 -> 004989 number.replace(0, 1, gConfig->getCountryCode().c_str()); number = "00" + number; } else if (number[0] != '0') { // number without country or region code, 1234 -> +49891234 number = "00" + gConfig->getCountryCode() + gConfig->getRegionCode() + number; } // else: number starts with '00', do not change return number; } int Tools::CompareNormalized(std::string number1, std::string number2) { return NormalizeNumber(number1).compare(NormalizeNumber(number2)); } bool Tools::GetLocationSettings() { // get settings from Fritz!Box. FritzClient *fc = gConfig->fritzClientFactory->create(); std::string msg = fc->RequestLocationSettings(); size_t lkzStart = msg.find("telcfg:settings/Location/LKZ"); if (lkzStart == std::string::npos) { ERR("Parser error in GetLocationSettings(). Could not find LKZ."); ERR("LKZ/OKZ not set! Resolving phone numbers may not always work."); bool returnValue = fc->hasValidPassword(); delete fc; return returnValue; } lkzStart += 30; lkzStart = msg.find("\"", lkzStart) +1; size_t lkzStop = msg.find("\"", lkzStart); size_t okzStart = msg.find("telcfg:settings/Location/OKZ"); if (okzStart == std::string::npos) { ERR("Parser error in GetLocationSettings(). Could not find OKZ."); ERR("OKZ not set! Resolving phone numbers may not always work."); bool returnValue = fc->hasValidPassword(); delete fc; return returnValue; } okzStart += 30; okzStart = msg.find("\"", okzStart) +1; size_t okzStop = msg.find("\"", okzStart); gConfig->setCountryCode( msg.substr(lkzStart, lkzStop - lkzStart) ); gConfig->setRegionCode( msg.substr(okzStart, okzStop - okzStart) ); if (gConfig->getCountryCode().size() > 0) { DBG("Found LKZ " << (gConfig->logPersonalInfo() ? gConfig->getCountryCode() : HIDDEN)); } else { ERR("LKZ not set! Resolving phone numbers may not always work."); } if (gConfig->getRegionCode().size() > 0) { DBG("Found OKZ " << (gConfig->logPersonalInfo() ? gConfig->getRegionCode() : HIDDEN)); } else { ERR("OKZ not set! Resolving phone numbers may not always work."); } bool returnValue = fc->hasValidPassword(); delete fc; return returnValue; } void Tools::GetSipSettings() { // if SIP settings are already set, exit here... if ( gConfig->getSipNames().size() > 0 ) return; // ...otherwise get settings from Fritz!Box. FritzClient *fc = gConfig->fritzClientFactory->create(); std::string msg = fc->RequestSipSettings(); delete fc; std::vector sipNames; std::vector sipMsns; // new parser for lua page if (msg.find("") != std::string::npos) { std::string name, msn; for (size_t i = 0; i < 10; i++) { std::stringstream msnTag, nameTag; msnTag << "telcfg:settings/SIP" << i << "/MSN"; nameTag << "telcfg:settings/SIP" << i << "/Name"; size_t msnPos = msg.find(msnTag.str()); size_t namePos = msg.find(nameTag.str()); if (msnPos == std::string::npos) { sipNames.push_back(""); sipMsns.push_back(""); continue; } msnPos = msg.find("\"", msnPos + msnTag.str().length() + 1); namePos = msg.find("\"", namePos + nameTag.str().length() + 1); msn = msg.substr(msnPos + 1, msg.find("\"", msnPos + 1) - msnPos -1); name = msg.substr(namePos + 1, msg.find("\"", namePos + 1) - namePos -1); sipNames.push_back(name); sipMsns.push_back(msn); DBG("Found SIP" << i << " provider name " << name << " / MSN " << (gConfig->logPersonalInfo() ? msn : HIDDEN)); } gConfig->setSipNames(sipNames); gConfig->setSipMsns(sipMsns); return; } // old parser // check if the structure of the HTML page matches our search pattern if (msg.find("function AuswahlDisplay") == std::string::npos){ ERR("Parser error in GetSipSettings(). Could not find SIP list."); ERR("SIP provider names not set! Usage of SIP provider names not possible."); return; } size_t sipStart = 0; for(size_t i=0; i < 10; i++){ sipStart = msg.find("AuswahlDisplay(\"", sipStart +1); if (sipStart == std::string::npos) { // end of list reached break; } size_t msnStart = msg.rfind("", sipStart); if (msnStart == std::string::npos) { // something is wrong with the structure of the HTML page ERR("Parser error in GetSipSettings(). Could not find SIP provider name."); ERR("SIP provider names not set! Usage of SIP provider names not possible."); return; } msnStart += 15; size_t msnStop = msg.find("", msnStart); std::string msn = msg.substr(msnStart, msnStop - msnStart); size_t hostStart = msg.rfind("ProviderDisplay(\"",sipStart); if (hostStart == std::string::npos) { // something is wrong with the structure of the HTML page ERR("Parser error in GetSipSettings(). Could not find SIP provider name."); ERR("SIP provider names not set! Usage of SIP provider names not possible."); return; } hostStart += 17; size_t hostStop = msg.find("\"", hostStart); std::string hostName = msg.substr(hostStart, hostStop - hostStart); std::string sipName = hostName; // now translate hostname into real provider name according to internal translation table of fritzbox size_t tableStart = msg.find("function ProviderDisplay"); size_t tableStop = msg.find("}", tableStart); size_t tableHostStart = msg.find("case \"", tableStart); if (tableStart == std::string::npos || tableStop == std::string::npos || tableHostStart == std::string::npos) { // something is wrong with the structure of the HTML page ERR("Parser error in GetSipSettings(). Could not find SIP provider name."); ERR("SIP provider names not set! Usage of SIP provider names not possible."); return; } while (tableHostStart <= tableStop && tableHostStart != std::string::npos) { size_t tableHostStop = msg.find("\"", tableHostStart + 6); size_t tableNameStart = msg.find("return \"", tableHostStop); size_t tableNameStop = msg.find("\"", tableNameStart + 8); if (tableHostStart == std::string::npos || tableHostStop == std::string::npos || tableNameStart == std::string::npos || tableNameStop == std::string::npos) { // something is wrong with the structure of the HTML page ERR("Parser error in GetSipSettings(). Could not find SIP provider name."); ERR("SIP provider names not set! Usage of SIP provider names not possible."); return; } tableHostStart += 6; std::string tableHost = msg.substr(tableHostStart, tableHostStop - tableHostStart); tableNameStart += 8; std::string tableName = msg.substr(tableNameStart, tableNameStop - tableNameStart); if (hostName.find(tableHost) != std::string::npos) { // we found a match in the table sipName = tableName; break; } // search the next table line tableHostStart = msg.find("case \"", tableNameStop); } sipNames.push_back(sipName); sipMsns.push_back(msn); DBG("Found SIP" << i << " (" << hostName << ") provider name " << sipName << " / MSN " << (gConfig->logPersonalInfo() ? msn : HIDDEN)); } gConfig->setSipNames(sipNames); gConfig->setSipMsns(sipMsns); } std::string Tools::Tokenize(const std::string &buffer, const char delimiter, size_t pos) { size_t tokenStart = 0; for (size_t i=0; i 0) tokenStart++; size_t tokenStop = buffer.find(delimiter, tokenStart); if (tokenStop == std::string::npos) tokenStop = buffer.size(); std::string token = buffer.substr(tokenStart, tokenStop - tokenStart); return token; } } kfritz/libfritz++/Fonbook.h0000664000175000017500000002210312065572605013722 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FONBOOK_H #define FONBOOK_H #include #include namespace fritz { /** * General telephonebook entry. * This defines the class, to be used by every phone book implementation. */ class FonbookEntry { public: enum eType { TYPE_NONE, TYPE_HOME, TYPE_MOBILE, TYPE_WORK, TYPES_COUNT }; enum eElements { ELEM_NAME = 0, ELEM_TYPE = 1, ELEM_NUMBER = 2, ELEM_IMPORTANT, ELEM_QUICKDIAL, ELEM_VANITY, ELEM_PRIORITY, ELEMS_COUNT }; struct sNumber { std::string number; eType type; std::string quickdial; std::string vanity; int priority; }; static const size_t MAX_NUMBERS = 3; private: std::string name; bool important; sNumber numbers[MAX_NUMBERS]; //TODO: add explicit size of array public: /* * Constructs a new FonbookEntry object * @param name Full name of contact * @param important Whether contact is flagged as important */ explicit FonbookEntry(std::string name, bool important = false); /* * Copy constructor * @param the fonbook entry to be copied */ FonbookEntry(const FonbookEntry *fe) { *this = *fe; } /** * Adds new number to this contact * @param number The number to be added * @param type The number type * @param quickdial The quickdial extension * @param vanity The vanity extension * @param prority '1' marks the default number of this contact, otherwise 0 */ void AddNumber(size_t pos, std::string number, eType type = TYPE_NONE, std::string quickdial = "", std::string vanity = "", int priority = 0); std::string GetName() const { return name; } void SetName(std::string name) { this->name = name; } std::string GetNumber(size_t pos) const { return numbers[pos].number; } void SetNumber(std::string number,size_t pos) { numbers[pos].number = number; } eType GetType(size_t pos) const { return numbers[pos].type; } void SetType(eType type, size_t pos) { numbers[pos].type = type; } bool IsImportant() const { return important; } void SetImportant(bool important) { this->important = important; } size_t GetDefault() const; void SetDefault(size_t pos); std::string GetQuickdialFormatted( size_t pos = std::string::npos) const; std::string GetQuickdial(size_t pos = std::string::npos) const; void SetQuickdial(std::string quickdial, size_t pos = std::string::npos); std::string GetVanity(size_t pos = std::string::npos) const; std::string GetVanityFormatted(size_t pos = std::string::npos) const; void SetVanity(std::string vanity, size_t pos = std::string::npos); int GetPriority(size_t pos) const { return numbers[pos].priority; } void SetPrioriy(int priority, size_t pos) { numbers[pos].priority = priority; } bool operator<(const FonbookEntry & fe) const; /* * Get number of typed numbers (TYPE_NONE is ignored) * @return count of different numbers available */ size_t GetSize(); }; inline FonbookEntry::eType& operator++(FonbookEntry::eType& t) { return t = static_cast(static_cast(t) + 1); } inline FonbookEntry::eType operator++(FonbookEntry::eType& t, int) { FonbookEntry::eType tmp(t); ++t; return tmp; } /** * General telephonebook base class. * All specific telephonebooks have to inherit from this class. */ class Fonbook { private: /** * True, if this phonebook is ready to use. */ bool initialized; /** * True, if changes are pending that are not yet saved */ bool dirty; /** * Sets dirty member if applicable */ void SetDirty(); /** * The descriptive title of this phonebook. */ std::string title; /** * The technical id of this phonebook (should be a short letter code). */ std::string techId; /** * True, if this phonebook is writeable */ bool writeable; /** * Data structure for storing the phonebook. */ std::vector fonbookList; protected: /** * The constructor may only be used by cFonbookManager. * Subclasses must make their constructor private, too. */ Fonbook(std::string title, std::string techId, bool writeable = false); /** * Method to persist contents of the phone book (if writeable) */ virtual void Write() { } /** * True, if this phonebook has displayable entries. */ bool displayable; /** * */ std::string convertEntities(std::string s) const; public: struct sResolveResult { sResolveResult(std::string name, FonbookEntry::eType type = FonbookEntry::TYPE_NONE, bool successful = false) : name(name), type(type), successful(successful) {} std::string name; FonbookEntry::eType type; bool successful; }; virtual ~Fonbook() { } /** * Take action to fill phonebook with content. * Initialize() may be called more than once per session. * @return if initialization was successful */ virtual bool Initialize(void) { return true; } /** * Resolves the number given to the corresponding name. * @param number to resolve * @return resolved name and type or the number, if unsuccessful */ virtual sResolveResult ResolveToName(std::string number); /** * Returns a specific telephonebook entry. * @param id unique identifier of the requested entry * @return the entry with key id or NULL, if unsuccessful */ virtual const FonbookEntry *RetrieveFonbookEntry(size_t id) const; /** * Changes the Fonbook entry with the given id * @param id unique identifier to the entry to be changed * @param fe FonbookEntry with the new content * @return true, if successful */ virtual bool ChangeFonbookEntry(size_t id, FonbookEntry &fe); /** * Sets the default number for a Fonbook entry with the given id * @param id unique identifier to the entry to be changed * @param pos the new default number * @return true, if successful */ virtual bool SetDefault(size_t id, size_t pos); /** * Adds a new entry to the phonebook. * @param fe a new phonebook entry * @param position position at which fe is added (at the end of the list per default) */ virtual void AddFonbookEntry(FonbookEntry &fe, size_t position = std::string::npos); /** * Adds a new entry to the phonebook. * @param id unique id to the entry to be deleted * @return true, if deletion was successful */ virtual bool DeleteFonbookEntry(size_t id); /** * Clears all entries from phonebook. */ virtual void Clear() { SetDirty(); fonbookList.clear(); } /** * Save pending changes. * Can be called periodically to assert pending changes in a phone book are written. */ void Save(); /** * Returns if it is possible to display the entries of this phonebook. * @return true, if this phonebook has displayable entries. "Reverse lookup only" phonebooks must return false here. */ virtual bool isDisplayable() const { return displayable; } /** * Returns if this phonebook is ready to use. * @return true, if this phonebook is ready to use */ virtual bool isInitialized() const { return initialized; } /** * Returns if this phonebook is writeable, e.g. entries can be added or modified. * @return true, if this phonebook is writeable */ virtual bool isWriteable() const { return writeable; } /** * Returns if this phonebook has changes that are not yet written. * @return true, if changes are pending */ virtual bool isModified() const { return dirty; } /** * Sets the initialized-status. * @param isInititalized the value initialized is set to */ virtual void setInitialized(bool isInitialized); /** * Sets writeable to true */ virtual void setWriteable() { writeable = true; } /** * Returns the number of entries in the telephonebook. * @return the number of entries */ virtual size_t GetFonbookSize() const; /** * Reloads the telephonebook's content */ virtual void Reload() { } /** * Returns a string that should be displayed as title in the menu when the telephonebook is displayed. * @return the long title of this phonebook */ virtual std::string GetTitle() const { return title; } /** * Returns the technical id of this phonebook. This id has to be unique among all phonebooks and is used when storing * the plugin's setup. * @return the technical id */ virtual std::string GetTechId() const { return techId; } /** * Sorts the phonebook's entries by the given element and in given order. * @param the element used for sorting * @param true if sort order is ascending, false otherwise */ virtual void Sort(FonbookEntry::eElements element = FonbookEntry::ELEM_NAME, bool ascending = true); }; } #endif /*FONBOOK_H_*/ kfritz/libfritz++/CMakeModules/0000775000175000017500000000000012065570712014464 5ustar jojokfritz/libfritz++/CMakeModules/FindGcryptConfig.cmake0000664000175000017500000002260112065570712020666 0ustar jojo# - a gcrypt-config module for CMake # # Usage: # gcrypt_check( [REQUIRED] ) # checks if gcrypt is avialable # # When the 'REQUIRED' argument was set, macros will fail with an error # when gcrypt could not be found. # # It sets the following variables: # GCRYPT_CONFIG_FOUND ... true if libgcrypt-config works on the system # GCRYPT_CONFIG_EXECUTABLE ... pathname of the libgcrypt-config program # _FOUND ... set to 1 if libgcrypt exist # _LIBRARIES ... the libraries # _CFLAGS ... all required cflags # _ALGORITHMS ... the algorithms that this libgcrypt supports # _VERSION ... gcrypt's version # # Examples: # gcrypt_check (GCRYPT gcrypt) # Check if a version of gcrypt is available, issues a warning # if not. # # gcrypt_check (GCRYPT REQUIRED gcrypt) # Check if a version of gcrypt is available and fails # if not. # # gcrypt_check (GCRYPT gcrypt>=1.4) # requires at least version 1.4 of gcrypt and defines e.g. # GCRYPT_VERSION=1.4.4. Issues a warning if a lower version # is available only. # # gcrypt_check (GCRYPT REQUIRED gcrypt>=1.4.4) # requires at least version 1.4.4 of gcrypt and fails if # only gcrypt 1.4.3 or lower is available only. # # Copyright (C) 2010 Werner Dittmann # # Redistribution and use, with or without modification, are permitted # provided that the following conditions are met: # # 1. Redistributions must retain the above copyright notice, this # list of conditions and the following disclaimer. # 2. The name of the author may not be used to endorse or promote # products derived from this software without specific prior # written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # This is a much edited and simplified variant of the original UsePkgConfig.cmake # from Enrico Scholz # Copyright (C) 2006 Enrico Scholz # ### Common stuff #### set(GCR_CONFIG_VERSION 1) set(GCR_CONFIG_FOUND 0) find_program(GCR_CONFIG_EXECUTABLE NAMES libgcrypt-config --version DOC "libgcrypt-config executable") mark_as_advanced(GCR_CONFIG_EXECUTABLE) if(GCR_CONFIG_EXECUTABLE) set(GCR_CONFIG_FOUND 1) endif(GCR_CONFIG_EXECUTABLE) # Unsets the given variables macro(_gcrconfig_unset var) set(${var} "" CACHE INTERNAL "") endmacro(_gcrconfig_unset) macro(_gcrconfig_set var value) set(${var} ${value} CACHE INTERNAL "") endmacro(_gcrconfig_set) # Invokes libgcrypt-config, cleans up the result and sets variables macro(_gcrconfig_invoke _gcrlist _prefix _varname _regexp) set(_gcrconfig_invoke_result) execute_process( COMMAND ${GCR_CONFIG_EXECUTABLE} ${ARGN} OUTPUT_VARIABLE _gcrconfig_invoke_result RESULT_VARIABLE _gcrconfig_failed) if (_gcrconfig_failed) set(_gcrconfig_${_varname} "") _gcrconfig_unset(${_prefix}_${_varname}) else(_gcrconfig_failed) string(REGEX REPLACE "[\r\n]" " " _gcrconfig_invoke_result "${_gcrconfig_invoke_result}") string(REGEX REPLACE " +$" "" _gcrconfig_invoke_result "${_gcrconfig_invoke_result}") if (NOT ${_regexp} STREQUAL "") string(REGEX REPLACE "${_regexp}" " " _gcrconfig_invoke_result "${_gcrconfig_invoke_result}") endif(NOT ${_regexp} STREQUAL "") separate_arguments(_gcrconfig_invoke_result) #message(STATUS " ${_varname} ... ${_gcrconfig_invoke_result}") set(_gcrconfig_${_varname} ${_gcrconfig_invoke_result}) _gcrconfig_set(${_prefix}_${_varname} "${_gcrconfig_invoke_result}") endif(_gcrconfig_failed) endmacro(_gcrconfig_invoke) macro(_gcrconfig_invoke_dyn _gcrlist _prefix _varname cleanup_regexp) _gcrconfig_invoke("${_gcrlist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) endmacro(_gcrconfig_invoke_dyn) # Splits given arguments into options and a package list macro(_gcrconfig_parse_options _result _is_req) set(${_is_req} 0) foreach(_gcr ${ARGN}) if (_gcr STREQUAL "REQUIRED") set(${_is_req} 1) endif (_gcr STREQUAL "REQUIRED") endforeach(_gcr ${ARGN}) set(${_result} ${ARGN}) list(REMOVE_ITEM ${_result} "REQUIRED") endmacro(_gcrconfig_parse_options) ### macro(_gcr_check_modules_internal _is_required _is_silent _prefix) _gcrconfig_unset(${_prefix}_FOUND) _gcrconfig_unset(${_prefix}_VERSION) _gcrconfig_unset(${_prefix}_PREFIX) _gcrconfig_unset(${_prefix}_LIBDIR) _gcrconfig_unset(${_prefix}_LIBRARIES) _gcrconfig_unset(${_prefix}_CFLAGS) _gcrconfig_unset(${_prefix}_ALGORITHMS) # create a better addressable variable of the modules and calculate its size set(_gcr_check_modules_list ${ARGN}) list(LENGTH _gcr_check_modules_list _gcr_check_modules_cnt) if(GCR_CONFIG_EXECUTABLE) # give out status message telling checked module if (NOT ${_is_silent}) message(STATUS "checking for module '${_gcr_check_modules_list}'") endif(NOT ${_is_silent}) # iterate through module list and check whether they exist and match the required version foreach (_gcr_check_modules_gcr ${_gcr_check_modules_list}) # check whether version is given if (_gcr_check_modules_gcr MATCHES ".*(>=|=|<=).*") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _gcr_check_modules_gcr_name "${_gcr_check_modules_gcr}") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _gcr_check_modules_gcr_op "${_gcr_check_modules_gcr}") string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _gcr_check_modules_gcr_ver "${_gcr_check_modules_gcr}") else(_gcr_check_modules_gcr MATCHES ".*(>=|=|<=).*") set(_gcr_check_modules_gcr_name "${_gcr_check_modules_gcr}") set(_gcr_check_modules_gcr_op) set(_gcr_check_modules_gcr_ver) endif(_gcr_check_modules_gcr MATCHES ".*(>=|=|<=).*") set(_gcr_check_prefix "${_prefix}") _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" VERSION "" --version ) # _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" PREFIX "" --prefix ) _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" LIBRARIES "" --libs ) _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" CFLAGS "" --cflags ) _gcrconfig_invoke(${_gcr_check_modules_gcr_name} "${_gcr_check_prefix}" ALGORITHMS "" --algorithms ) message(STATUS " found ${_gcr_check_modules_gcr}, version ${_gcrconfig_VERSION}") # handle the operands set(_gcr_wrong_version 0) if (_gcr_check_modules_gcr_op STREQUAL ">=") if((_gcr_check_modules_gcr_ver VERSION_EQUAL _gcrconfig_VERSION) OR (_gcrconfig_VERSION VERSION_LESS _gcr_check_modules_gcr_ver )) message(STATUS " gcrypt wrong version: required: ${_gcr_check_modules_gcr_op}${_gcr_check_modules_gcr_ver}, found: ${_gcrconfig_VERSION}") set(_gcr_wrong_version 1) endif() endif(_gcr_check_modules_gcr_op STREQUAL ">=") if (_gcr_check_modules_gcr_op STREQUAL "=") if(_gcr_check_modules_gcr_ver VERSION_EQUAL _gcrconfig_VERSION) message(STATUS " gcrypt wrong version: required: ${_gcr_check_modules_gcr_op}${_gcr_check_modules_gcr_ver}, found: ${_gcrconfig_VERSION}") set(_gcr_wrong_version 1) endif() endif(_gcr_check_modules_gcr_op STREQUAL "=") if (_gcr_check_modules_gcr_op STREQUAL "<=") if((_gcr_check_modules_gcr_ver VERSION_EQUAL _gcrconfig_VERSION) OR (_gcrconfig_VERSION VERSION_GREATER _gcr_check_modules_gcr_ver)) message(STATUS " gcrypt wrong version: required: ${_gcr_check_modules_gcr_op}${_gcr_check_modules_gcr_ver}, found: ${_gcrconfig_VERSION}") set(_gcr_wrong_version 1) endif() endif(_gcr_check_modules_gcr_op STREQUAL "<=") if (${_is_required} AND _gcr_wrong_version) message(FATAL_ERROR "") endif() endforeach(_gcr_check_modules_gcr) _gcrconfig_set(${_prefix}_FOUND 1) else(GCR_CONFIG_EXECUTABLE) if (${_is_required}) message(FATAL_ERROR "libgcrypt-config tool not found") endif (${_is_required}) endif(GCR_CONFIG_EXECUTABLE) endmacro(_gcr_check_modules_internal) ### ### User visible macro starts here ### ### macro(gcrypt_check _prefix _module0) # check cached value if (NOT DEFINED __gcr_config_checked_${_prefix} OR __gcr_config_checked_${_prefix} LESS ${GCR_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) _gcrconfig_parse_options (_gcr_modules _gcr_is_required "${_module0}" ${ARGN}) _gcr_check_modules_internal("${_gcr_is_required}" 0 "${_prefix}" ${_gcr_modules}) _gcrconfig_set(__gcr_config_checked_${_prefix} ${GCR_CONFIG_VERSION}) endif(NOT DEFINED __gcr_config_checked_${_prefix} OR __gcr_config_checked_${_prefix} LESS ${GCR_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) endmacro(gcrypt_check) ### ### Local Variables: ### mode: cmake ### End: kfritz/libfritz++/Fonbooks.h0000664000175000017500000000211712065572605014110 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FONBOOKS_H #define FONBOOKS_H #include "Fonbook.h" namespace fritz{ class Fonbooks : public std::vector { public: Fonbooks(); virtual ~Fonbooks(); Fonbook *operator[](std::string key) const; Fonbook *operator[](size_t i) const; }; } #endif /*FONBOOKS_H_*/ kfritz/libfritz++/cc++/0000775000175000017500000000000012065570712012666 5ustar jojokfritz/libfritz++/cc++/mime.cpp0000664000175000017500000001065712065570712014332 0ustar jojo// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // 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. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include "mime.h" #ifdef CCXX_NAMESPACES namespace ost2 { using namespace std; using ost::setString; #endif MIMEMultipart::MIMEMultipart(const char *mt) { const char *cp = strchr(mt, '/'); if(cp) mt = ++cp; first = last = NULL; header[1] = NULL; header[0] = mtype; setString(boundry, sizeof(boundry), "xyzzy"); snprintf(mtype, sizeof(mtype), "Content-Type: multipart/%s, boundary=%s", mt, boundry); } MIMEMultipart::~MIMEMultipart() {} void MIMEMultipart::head(std::ostream *out) { char **list = header; while(**list) *out << *(list++) << "\r\n"; out->flush(); } void MIMEMultipart::body(std::ostream *out) { MIMEItemPart *item = first; while(item) { *out << "--" << boundry << "\r\n"; item->head(out); *out << "\r\n"; item->body(out); item = item->next; } *out << "--" << boundry << "--\r\n"; out->flush(); } MIMEItemPart::MIMEItemPart(MIMEMultipart *m, const char *ct) { if(m->last) { m->last->next = this; m->last = this; } else m->first = m->last = this; next = NULL; ctype = ct; } MIMEItemPart::~MIMEItemPart() {} MIMEMultipartForm::MIMEMultipartForm() : MIMEMultipart("form-data") {} MIMEMultipartForm::~MIMEMultipartForm() {} void MIMEItemPart::head(std::ostream *out) { if (ctype && strlen(ctype)) *out << "Content-Type: " << ctype << "\r" << endl; } MIMEFormData::MIMEFormData(MIMEMultipartForm *m, const char *n, const char *v) : MIMEItemPart(m, "") { name = n; content = v; filename = NULL; } MIMEFormData::MIMEFormData(MIMEMultipartForm *m, const char *n, const char *f, const char *t, const char *c) : MIMEItemPart(m, t) { name = n; filename = f; content = c; } MIMEFormData::~MIMEFormData() {} void MIMEFormData::head(std::ostream *out) { if (filename) { *out << "Content-Disposition: form-data; name=\"" << name << "\"; filename=\"" << filename << "\"\r\n"; } else { *out << "Content-Disposition: form-data; name=\"" << name << "\"\r\n"; } MIMEItemPart::head(out); } void MIMEFormData::body(std::ostream *out) { *out << content << "\r\n"; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ kfritz/libfritz++/cc++/readme.txt0000664000175000017500000000024012065570712014660 0ustar jojoThese are modified copies of libcommoncpp2-1.8.1 Bcause of bugs/restrictions of the original libcommoncpp2, these files are currently necessary for libfritz++.kfritz/libfritz++/cc++/url.h0000664000175000017500000003520012065570712013641 0ustar jojo// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // 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. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file url.h * @short URL streams abstraction. **/ #ifndef CCXX_URL_H_ #define CCXX_URL_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_SOCKET_H_ #include #endif #ifndef CCXX_MIME_H_ #include "mime.h" #endif #ifdef CCXX_NAMESPACES namespace ost2 { using ost::TCPStream; using ost::IPV4Host; #ifdef CCXX_IPV6 using ost::IPV6Host; #endif using ost::tpport_t; using ost::String; #endif /** * A URL processing version of TCPStream. * * @author David Sugar * @short C++ url processing stream class. */ class __EXPORT URLStream : public TCPStream { public: /** * Return error for url fetch */ typedef enum { errSuccess = 0, errUnreachable, errMissing, errDenied, errInvalid, errForbidden, errUnauthorized, errRelocated, errFailure, errTimeout, errInterface } Error; /** * Type of authentication */ typedef enum { authAnonymous = 0, authBasic } Authentication; /** * Encoding used in transfer */ typedef enum { encodingBinary = 0, encodingChunked } Encoding; /** * Type of fetch */ typedef enum { methodHttpGet, methodHttpPut, methodHttpPost, methodHttpPostMultipart, methodFtpGet, methodFtpPut, methodFileGet, methodFilePut } Method; /** * http protocol version */ typedef enum { protocolHttp1_0, protocolHttp1_1 } Protocol; private: const char *agent, *referer, *cookie, *pragma, *user, *password; const char *proxyUser, *proxyPasswd; const char *localif; IPV4Host proxyHost; #ifdef CCXX_IPV6 IPV6Host v6proxyHost; #endif tpport_t proxyPort; Method urlmethod; Encoding encoding; Protocol protocol; Authentication auth; Authentication proxyAuth; timeout_t timeout; bool persistent; bool follow; unsigned chunk; Error getHTTPHeaders(); URLStream(const URLStream& rhs); protected: ost::String m_host, m_address; ost::String contentType; /** * Send http header to server. * * @param url base to send header to * @param vars to post or use in get method * @param bufsize of stream buffering to use * @return success or class error */ Error sendHTTPHeader(const char *url, const char **vars, size_t bufsize, const char *form_body = NULL); /** * Called if stream buffer needs refilling. * * @return number of bytes refilled or error if < 0 */ int underflow(void); /** * Derived method for async or timed I/O function on url stream. * * @return number of bytes read or < 0 for error. * @param buffer to read stream data into. * @param len of bytes to read from stream. * @param timer to wait for data in milliseconds. */ virtual int aRead(char *buffer, size_t len, timeout_t timer); /** * Derived method for async or timed I/O function on url stream. * * @return number of bytes written or < 0 for error. * @param buffer to write stream data from. * @param len of bytes to write to stream. * @param timer to wait for data in milliseconds. */ virtual int aWrite(char *buffer, size_t len, timeout_t timer); /** * Derived method to receive and parse http "headers". * * @param header keyword. * @param value header keyword value. */ virtual void httpHeader(const char *header, const char *value); /** * A virtual to insert additional header info into the request. * * @return array of header attributes to add. */ virtual char **extraHeader(void); public: /** * Construct an instance of URL stream. * * @param family protocol to use. * @param timer for default timeout on I/O operations. */ URLStream(Family family = IPV4, timeout_t timer = 0); /** * Line parsing with conversion. * * @return URLStream object reference. * @param buffer to store. * @param len maximum buffer size. */ URLStream &getline(char *buffer, size_t len); /** * Get URL data from a named stream of a known buffer size. * * @return url error code. * @param url name of resource. * @param buffer size of buffer. */ Error get(const char *url, size_t buffer = 512); /** * Get URL data from a named stream of a known buffer size. * Requesting URL defined in previous calls of setAddress() and * setHost() functions. * * @return url error code. * @param buffer size of buffer. */ Error get(size_t buffer = 512); /** * Submit URL with vars passed as argument array. This submit * assumes "GET" method. Use "post" member to perform post. * * @return url error code. * @param url name of resource. * @param vars to set. * @param buffer size of buffer. */ Error submit(const char *url, const char **vars, size_t buffer = 512); /** * Post URL vars with post method. * * @return success or error code. * @param url name of resource being posted. * @param vars to set in post. * @param buffer size of buffer. */ Error post(const char *url, const char **vars, size_t buffer = 512); /** * Post URL with MIME multipart form. * * @return success or error code. * @param url name of resource being posted. * @param form multi-part resource. * @param buffer size to use. */ Error post(const char *url, MIMEMultipartForm &form, size_t buffer = 512); /** * Used to fetch header information for a resource. * * @return url error code. * @param url name of resource. * @param buffer size of buffer. */ Error head(const char *url, size_t buffer = 512); /** * Close the URL stream for a new connection. */ void close(); /** * Set the referer url. * * @param str referer string. */ void setReferer(const char *str); /** * Set the host for the url * * @param str host address. */ inline void setHost(const char *str) {m_host = str;}; /** * Set the address for the url * * @param str address in the URL. */ inline void setAddress(const char *str) {m_address = str;}; /** * Set the cookie to pass. * * @param str cookie string. */ inline void setCookie(const char *str) {cookie = str;}; /** * Set user id for the url. * * @param str user id. */ inline void setUser(const char *str) {user = str;}; /** * Set password for the url. * * @param str password. */ inline void setPassword(const char *str) {password = str;}; /** * Set authentication type for the url. * * @param a authentication. * @param str string. */ void setAuthentication(Authentication a, const char *str = NULL); /** * Set proxy user id for the url. * * @param str user id. */ inline void setProxyUser(const char *str) {proxyUser = str;}; /** * Set proxy password for the url. * * @param str password. */ inline void setProxyPassword(const char *str) {proxyPasswd = str;}; /** * Set proxy authentication type for the url. * * @param a authentication. * @param str string. */ void setProxyAuthentication(Authentication a, const char *str = NULL); /** * Set the pragmas. * * @param str pragma setting. */ inline void setPragma(const char *str) {pragma = str;}; /** * Set the proxy server used. * * @param host proxy host. * @param port proxy port. */ void setProxy(const char *host, tpport_t port); /** * Set the agent. * * @param str agent value. */ inline void setAgent(const char *str) {agent = str;}; /** * Get url method (and protocol) employed. * * @return url method in effect. */ inline Method getMethod(void) {return urlmethod;}; /** * Set socket timeout characteristics for processing URL * requests. Set to 0 for no default timeouts. * * @param to timeout to set. */ inline void setTimeout(timeout_t to) {timeout = to;}; /** * Specify url following. Set to false to disable following * of relocation requests. * * @param enable true to enable following. */ inline void setFollow(bool enable) {follow = enable;}; /** * Specify http protocol level being used. * * @param pro protocol level. */ inline void setProtocol(Protocol pro) {protocol = pro;}; /** * Specify local interface to use * * @param intf Local interface name */ inline void setLocalInterface(const char *intf) {localif=intf;} }; /** @relates URLStream * Decode an url parameter (ie "\%20" -> " ") * @param source string * @param dest destination buffer. If NULL source is used */ __EXPORT char* urlDecode(char *source, char *dest = NULL); /** @relates URLStream * Encode an url parameter (ie " " -> "+") * @param source string * @param dest destination buffer. Do not overlap with source * @param size destination buffer size. */ __EXPORT char* urlEncode(const char *source, char *dest, size_t size); /** @relates URLStream * Decode a string using base64 coding. * Destination size should be at least strlen(src)+1. * Destination will be a string, so is always terminated . * This function is deprecated, base64 can use binary source, not only string * use overloaded b64Decode. * @return string coded * @param src source buffer * @param dest destination buffer. If NULL src is used */ __EXPORT char* b64Decode(char *src, char *dest = NULL); /** @relates URLStream * Encode a string using base64 coding. * Destination size should be at least strlen(src)/4*3+1. * Destination is string terminated. * This function is deprecated, coded stream can contain terminator character * use overloaded b64Encode instead. * @return destination buffer * @param source source string * @param dest destination octet buffer * @param size destination buffer size */ __EXPORT char* b64Encode(const char *source, char *dest, size_t size); /** @relates URLStream * Encode a octet stream using base64 coding. * Destination size should be at least (srcsize+2)/3*4+1. * Destination will be a string, so is always terminated * (unless you pass dstsize == 0). * @return size of string written not counting terminator * @param src source buffer * @param srcsize source buffer size * @param dst destination buffer * @param dstsize destination buffer size */ __EXPORT size_t b64Encode(const unsigned char *src, size_t srcsize, char *dst, size_t dstsize); /** @relates URLStream * Decode a string using base64 coding. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return number of octets written into destination buffer * @param src source string * @param dst destination octet buffer * @param dstsize destination buffer size */ __EXPORT size_t b64Decode(const char *src, unsigned char *dst, size_t dstsize); /** @relates URLStream * Encode a STL string using base64 coding into a STL string * @return base 64 encoded string * @param src source string */ __EXPORT String b64Encode(const String& src); /** @relates URLStream * Decode a STL string using base64 coding into an STL String. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return decoded string * @param src source string */ __EXPORT String b64Decode(const String& src); /** @relates URLStream * Encode a octet stream using base64 coding into a STL string * @return base 64 encoded string * @param src source buffer * @param srcsize source buffer size */ __EXPORT String b64Encode(const unsigned char *src, size_t srcsize); /** @relates URLStream * Decode a string using base64 coding. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return number of octets written into destination buffer * @param src source string * @param dst destination octet buffer * @param dstsize destination buffer size */ __EXPORT size_t b64Decode(const String& src, unsigned char *dst, size_t dstsize); #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ kfritz/libfritz++/cc++/soap.cpp0000664000175000017500000000463312065570712014342 0ustar jojo// Copyright (C) 2011 Joachim Wilke // // 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. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include "soap.h" namespace ost2 { SOAPStream::SOAPStream(Family family, timeout_t timer): URLStream(family, timer) { contentType = "text/xml"; setAction(""); } void SOAPStream::setAction(const char *soapAction) { soapActionFieldName = "SoapAction"; this->soapAction = soapAction; header[0] = soapActionFieldName.c_str(); header[1] = this->soapAction; header[2] = NULL; } SOAPStream::~SOAPStream() { // TODO Auto-generated destructor stub } char **SOAPStream::extraHeader(){ return header; } } kfritz/libfritz++/cc++/mime.h0000664000175000017500000001501612065570712013771 0ustar jojo// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // 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. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file mime.h * @short MIME document abstractions. **/ #ifndef CCXX_MIME_H_ #define CCXX_MIME_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_SOCKET_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost2 { #endif class __EXPORT MIMEMultipart; class __EXPORT MIMEItemPart; /** * A container class for multi-part MIME document objects which can * be streamed to a std::ostream destination. * * @author David Sugar * @short container for streamable multi-part MIME documents. */ class __EXPORT MIMEMultipart { protected: friend class __EXPORT MIMEItemPart; char boundry[8]; char mtype[80]; char *header[16]; MIMEItemPart *first, *last; virtual ~MIMEMultipart(); public: /** * Contruct a multi-part document, and describe it's type. * * @param document (content) type. */ MIMEMultipart(const char *document); /** * Stream the headers of the multi-part document. The headers * of individual entities are streamed as part of the body. * * @param output to stream document header into. */ virtual void head(std::ostream *output); /** * Stream the "body" of the multi-part document. This involves * streaming the headers and body of each document part. * * @param output to stream document body into. */ virtual void body(std::ostream *output); /** * Get a string array of the headers to use. This is used to * assist URLStream::post. * * @return array of headers. */ char **getHeaders(void) {return header;}; }; /** * The Multipart form is a MIME multipart document specific for the * construction and delivery of form data to a web server through a * post method. * * @author David Sugar * @short deliver form results as multipart document. */ class __EXPORT MIMEMultipartForm : public MIMEMultipart { protected: virtual ~MIMEMultipartForm(); public: /** * Construct a form result. This is a MIMEMultipart of type * multipart/form-data. */ MIMEMultipartForm(); }; /** * This is used to attach an item part to a MIME multipart document * that is being streamed. The base item part class is used by all * derived items. * * @author David Sugar * @short item or part of a multi-part object. */ class __EXPORT MIMEItemPart { protected: friend class __EXPORT MIMEMultipart; MIMEMultipart *base; MIMEItemPart *next; const char *ctype; /** * Stream the header(s) for the current document part. * * @param output to stream header into. */ virtual void head(std::ostream *output); /** * Stream the content of this document part. * * @param output to stream document body into. */ virtual void body(std::ostream *output) = 0; /** * Construct and attach a document part to a multipart document. * * @param top multipart document to attach to. * @param ct Content-Type to use. */ MIMEItemPart(MIMEMultipart *top, const char *ct); virtual ~MIMEItemPart(); }; /** * This is a document part type for use in submitting multipart form * data to a web server. * * @author David Sugar * @short multipart document part for web form data field. */ class __EXPORT MIMEFormData : public MIMEItemPart { protected: const char *content; const char *name; const char *filename; virtual ~MIMEFormData(); public: /** * Stream header, Content-Disposition form-data. * * @param output stream to send header to. */ void head(std::ostream *output); /** * Stream content (value) of this form data field. * * @param output stream to send body to. */ void body(std::ostream *output); /** * Construct form data field part of multipart form. * * @param top multipart form this is part of * @param name of form data field * @param content of form data field */ MIMEFormData(MIMEMultipartForm *top, const char *name, const char *content); /** * Construct form data field part of multipart form. * * @param top multipart form this is part of * @param name of form data field * @param filename * @param type * @param content of form data field */ MIMEFormData(MIMEMultipartForm *top, const char *name, const char *filename, const char *type, const char *content); }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ kfritz/libfritz++/cc++/soap.h0000664000175000017500000000450012065570712014000 0ustar jojo// Copyright (C) 2011 Joachim Wilke // // 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. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #ifndef SOAPSTREAM_H_ #define SOAPSTREAM_H_ #include "url.h" namespace ost2 { class SOAPStream: public ost2::URLStream { public: SOAPStream(Family family = IPV4, timeout_t timer = 0); virtual ~SOAPStream(); void setAction(const char *soapAction); protected: virtual char **extraHeader(void); private: ost::String soapActionFieldName; ost::String soapAction; char *header[3]; }; } #endif /* SOAPSTREAM_H_ */ kfritz/libfritz++/cc++/url.cpp0000664000175000017500000005214712065570712014205 0ustar jojo// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // 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. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include "url.h" #include #include #include #include #include #include #ifdef WIN32 #include #endif #ifdef HAVE_SSTREAM #include #else #include #endif #include #ifndef WIN32 // cause problem on Solaris #if !defined(__sun) && !defined(__SUN__) #ifdef HAVE_NET_IF_H #include #endif #endif #include #endif #ifdef CCXX_NAMESPACES namespace ost2 { using namespace std; using ost::setString; #endif URLStream::URLStream(Family fam, timeout_t to) : TCPStream(fam) { persistent = false; proxyPort = 0; timeout = to; protocol = protocolHttp1_0; follow = true; proxyAuth = authAnonymous; encoding = encodingBinary; proxyUser = proxyPasswd = NULL; auth = authAnonymous; cookie = agent = pragma = referer = user = password = NULL; localif = NULL; setError(false); contentType = "application/x-www-form-urlencoded"; } int URLStream::aRead(char *buffer, size_t len, timeout_t timer) { return readData(buffer, len, 0, timer); } int URLStream::aWrite(char *buffer, size_t len, timeout_t timer) { return writeData(buffer, len, timer); } void URLStream::httpHeader(const char *header, const char *value) { } char **URLStream::extraHeader(void) { return NULL; } int URLStream::underflow(void) { ssize_t len = 0, rlen; char *buf; if(bufsize == 1) return TCPStream::underflow(); if(!gptr()) return EOF; if(gptr() < egptr()) return (unsigned char)*gptr(); rlen = (ssize_t)((gbuf + bufsize) - eback()); if(encoding == encodingChunked) { buf = (char *)eback(); *buf = '\n'; while(!chunk && (*buf == '\n' || *buf == '\r')) { *buf = 0; len = readLine(buf, rlen, timeout); } if(len) { if(!chunk) chunk = strtol(buf, NULL, 16); if(rlen > (int)chunk) rlen = chunk; } else rlen = -1; } if(rlen > 0) { if(Socket::state == STREAM) rlen = aRead((char *)eback(), rlen, timeout); else if(timeout) { if(Socket::isPending(pendingInput, timeout)) rlen = readData(eback(), rlen); else rlen = -1; } else rlen = readData(eback(), rlen); } if(encoding == encodingChunked && rlen > 0) chunk -= rlen; if(rlen < 1) { if(rlen < 0) clear(ios::failbit | rdstate()); return EOF; } setg(eback(), eback(), eback() + rlen); return (unsigned char)*gptr(); } void URLStream::setProxy(const char *host, tpport_t port) { switch(family) { #ifdef CCXX_IPV6 case IPV6: v6proxyHost = host; break; #endif case IPV4: proxyHost = host; break; default: proxyPort = 0; return; } proxyPort = port; } URLStream::Error URLStream::submit(const char *path, const char **vars, size_t buf) { Error status = errInvalid, saved; if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpGet; path = strchr(path + 5, '/'); status = sendHTTPHeader(path, vars, buf); } if((status == errInvalid || status == errTimeout)) { if(Socket::state != AVAILABLE) close(); return status; } else { saved = status; status = getHTTPHeaders(); if(status == errSuccess) return saved; else if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } } URLStream::Error URLStream::post(const char *path, MIMEMultipartForm &form, size_t buf) { Error status = errInvalid, saved; if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpPostMultipart; path = strchr(path + 5, '/'); std::stringstream ss; form.body(dynamic_cast(&ss)); status = sendHTTPHeader(path, (const char **)form.getHeaders(), buf, ss.str().c_str()); } if(status == errInvalid || status == errTimeout) { if(Socket::state != AVAILABLE) close(); return status; } saved = status; status = getHTTPHeaders(); if(status == errSuccess) { return saved; } if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } URLStream::Error URLStream::post(const char *path, const char **vars, size_t buf) { Error status = errInvalid, saved; if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpPost; path = strchr(path + 5, '/'); status = sendHTTPHeader(path, vars, buf); } if((status == errInvalid || status == errTimeout)) { if(Socket::state != AVAILABLE) close(); return status; } saved = status; status = getHTTPHeaders(); if(status == errSuccess) return saved; if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } URLStream::Error URLStream::head(const char *path, size_t buf) { Error status = errInvalid, saved; if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpGet; path = strchr(path + 5, '/'); status = sendHTTPHeader(path, NULL, buf); } if((status == errInvalid || status == errTimeout)) { if(Socket::state != AVAILABLE) close(); return status; } else { saved = status; status = getHTTPHeaders(); if(status == errSuccess) return saved; else if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } } URLStream &URLStream::getline(char *buffer, size_t size) { size_t len; *buffer = 0; // TODO: check, we mix use of streambuf with Socket::readLine... iostream::getline(buffer, (unsigned long)size); len = strlen(buffer); while(len) { if(buffer[len - 1] == '\r' || buffer[len - 1] == '\n') buffer[len - 1] = 0; else break; --len; } return *this; } URLStream::Error URLStream::get(size_t buffer) { String path = String("http://") + m_host; if ( m_address.operator[](0) != '/' ) path += "/"; path += m_address; return get(path.c_str(), buffer); } URLStream::Error URLStream::get(const char *urlpath, size_t buf) { const char *path = urlpath; Error status = errInvalid, saved; urlmethod = methodFileGet; if(Socket::state != AVAILABLE) close(); if(!strnicmp(path, "file:", 5)) { urlmethod = methodFileGet; path += 5; } else if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpGet; path = strchr(path + 5, '/'); } switch(urlmethod) { case methodHttpGet: status = sendHTTPHeader(path, NULL, buf); break; case methodFileGet: if(so != INVALID_SOCKET) ::close((int)so); so = ::open(path, O_RDWR); if(so == INVALID_SOCKET) so = ::open(path, O_RDONLY); // FIXME: open return the same handle type as socket call ?? if(so == INVALID_SOCKET) return errInvalid; Socket::state = STREAM; allocate(buf); return errSuccess; default: break; } if((status == errInvalid || status == errTimeout)) { if(Socket::state != AVAILABLE) close(); return status; } else { saved = status; status = getHTTPHeaders(); if(status == errSuccess) return saved; else if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } } URLStream::Error URLStream::getHTTPHeaders() { char buffer[512]; size_t buf = sizeof(buffer); Error status = errSuccess; char *cp, *ep; ssize_t len = 1; char nc = 0; chunk = ((unsigned)-1) / 2; encoding = encodingBinary; while(len > 0) { len = readLine(buffer, buf, timeout); if(len < 1) return errTimeout; // FIXME: for multiline syntax ?? if(buffer[0] == ' ' || buffer[0] == '\r' || buffer[0] == '\n') break; cp = strchr(buffer, ':'); if(!cp) continue; *(cp++) = 0; while(*cp == ' ' || *cp == '\t') ++cp; ep = strchr(cp, '\n'); if(!ep) ep = &nc; while(*ep == '\n' || *ep == '\r' || *ep == ' ') { *ep = 0; if((--ep) < cp) break; } if(!stricmp(buffer, "Transfer-Encoding")) { if(!stricmp(cp, "chunked")) { chunk = 0; encoding = encodingChunked; } } httpHeader(buffer, cp); } return status; } void URLStream::close(void) { if(Socket::state == AVAILABLE) return; endStream(); so = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(so != INVALID_SOCKET) Socket::state = AVAILABLE; } URLStream::Error URLStream::sendHTTPHeader(const char *url, const char **vars, size_t buf, const char *form_body) { // TODO: implement authentication char reloc[4096]; // "//" host ":" port == max 2 + 128 + 1 + 5 + 1(\0) = 137, rounded 140 char host[140]; // TODO: add support for //user:pass@host:port/ syntax #ifdef HAVE_SSTREAM ostringstream str; #else char buffer[4096]; strstream str(buffer, sizeof(buffer), ios::out); #endif char *ref, *cp, *ep; char *hp; const char *uri = "/"; int count = 0; size_t len = 0; tpport_t port = 80; const char **args = vars; const char *var; bool lasteq = true; struct servent *svc; retry: #ifdef HAVE_SSTREAM str.str(""); #else buffer[0] = 0; str.seekp(0); #endif setString(host, sizeof(host), url); reformat: hp = strchr(host, '/'); if(!hp) { host[0] = '/'; setString(host + 1, sizeof(host) - 1, url); goto reformat; } while(*hp == '/') ++hp; cp = strchr(hp, '/'); if (cp) *cp = 0; ep = strrchr(hp, ':'); if(ep) { *ep = 0; ++ep; if(isdigit(*ep)) port = atoi(ep); else { Socket::mutex.enter(); svc = getservbyname(ep, "tcp"); if(svc) port = ntohs(svc->s_port); Socket::mutex.leave(); } } if(!proxyPort) { const char* ep1 = url; while(*ep1 == '/') ++ep1; ep1 = strchr(ep1, '/'); if(ep1) uri = ep1; } switch(urlmethod) { case methodHttpGet: str << "GET "; if(proxyPort) { str << "http:" << url; if(!cp) str << '/'; } else str << uri; break; case methodHttpPost: case methodHttpPostMultipart: str << "POST "; if(proxyPort) { str << "http:" << url; if(!cp) str << '/'; } else str << uri; break; default: return errInvalid; } if(vars && urlmethod == methodHttpGet) { str << "?"; while(*vars) { if(count++ && lasteq) str << "&"; str << *vars; if(!lasteq) lasteq = true; else if(strchr(*vars, '=')) lasteq = true; else { lasteq = false; str << "="; } ++vars; } } switch(protocol) { case protocolHttp1_1: str << " HTTP/1.1" << "\r\n"; break; case protocolHttp1_0: str << " HTTP/1.0" << "\r\n"; break; } if ( m_host.empty() ) m_host = hp; str << "Host: " << hp << "\r\n"; if(agent) str << "User-Agent: " << agent << "\r\n"; if(cookie) str << "Cookie: " << cookie << "\r\n"; if(pragma) str << "Pragma: " << pragma << "\r\n"; if(referer) str << "Referer: " << referer << "\r\n"; switch(auth) { case authBasic: str << "Authorization: Basic "; snprintf(reloc, 64, "%s:%s", user, password); b64Encode(reloc, reloc + 64, 128); str << reloc + 64 << "\r\n"; case authAnonymous: break; } switch(proxyAuth) { case authBasic: str << "Proxy-Authorization: Basic "; snprintf(reloc, 64, "%s:%s", proxyUser, proxyPasswd); b64Encode(reloc, reloc + 64, 128); str << reloc + 64 << "\r\n"; str << "Proxy-Connection: close" << "\r\n"; case authAnonymous: break; } str << "Connection: close\r\n"; char **add = extraHeader(); if(add) { while(*add) { str << *(add++) << ": "; str << *(add++) << "\r\n"; } } if(vars) switch(urlmethod) { case methodHttpPost: while(*args) { var = *args; if(count++ || !strchr(var, '=')) len += strlen(var) + 1; else len = strlen(var); ++args; } count = 0; str << "Content-Type: " << contentType << "\r\n"; str << "Content-Length: " << (unsigned)len << "\r\n"; break; case methodHttpPostMultipart: str << "Content-Length: " << strlen(form_body) << "\r\n"; while(*args) str << *(args++) << "\r\n"; default: break; } str << "\r\n"; #ifdef HAVE_SSTREAM // sstream does not want ends #else str << ends; #endif if(Socket::state != AVAILABLE) close(); #ifndef WIN32 #ifdef SOICGIFINDEX if (localif != NULL) { struct ifreq ifr; switch(family) { #ifdef CCXX_IPV6 case IPV6: sockaddr_in6 source; int alen = sizeof(source); memset(&ifr, 0, sizeof(ifr)); setString(ifr.ifr_name, sizeof(ifr.ifr_name), localif); if (ioctl(so, SIOCGIFINDEX, &ifr) < 0) return errInterface; else { if (setsockopt(so, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) == -1) return errInterface; else if(getsockname(so, (struct sockaddr*)&source,(socklen_t *) &alen) == -1) return errInterface; else if (bind(so, (struct sockaddr*)&source, sizeof(source)) == -1) return errInterface; else source.sin6_port = 0; } break; #endif case IPV4: sockaddr_in source; int alen = sizeof(source); memset(&ifr, 0, sizeof(ifr)); setString(ifr.ifr_name, sizeof(ifr.ifr_name), localif); if (ioctl(so, SIOCGIFINDEX, &ifr) < 0) return errInterface; else { if (setsockopt(so, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) == -1) return errInterface; else if(getsockname(so, (struct sockaddr*)&source,(socklen_t *) &alen) == -1) return errInterface; else if (bind(so, (struct sockaddr*)&source, sizeof(source)) == -1) return errInterface; else source.sin_port = 0; } } } #endif #endif if(proxyPort) { switch(family) { #ifdef CCXX_IPV6 case IPV6: connect(v6proxyHost, proxyPort, (unsigned)buf); break; #endif case IPV4: connect(proxyHost, proxyPort, (unsigned)buf); break; } } else { switch(family) { #ifdef CCXX_IPV6 case IPV6: connect(IPV6Host(hp), port, (unsigned)buf); break; #endif case IPV4: connect(IPV4Host(hp), port, (unsigned)buf); } } if(!isConnected()) return errUnreachable; // FIXME: send (or write) can send less than len bytes // use stream funcion ?? #ifdef HAVE_SSTREAM writeData(str.str().c_str(), _IOLEN64 str.str().length()); #else writeData(str.str().c_str(), _IOLEN64 str.str().length()); #endif if(urlmethod == methodHttpPost && vars) { #ifdef HAVE_SSTREAM str.str() = ""; #else str.seekp(0); #endif bool sep = false; while(*vars) { if(sep) writeData("&", 1); else sep = true; var = *vars; if(!strchr(var, '=')) { snprintf(reloc, sizeof(reloc), "%s=%s", var, *(++vars)); writeData(reloc, strlen(reloc)); } else writeData(var, strlen(var)); ++vars; } } if(urlmethod == methodHttpPostMultipart && form_body) { writeData(form_body, strlen(form_body)); } cont: #ifdef HAVE_SSTREAM char buffer[4096]; #else // nothing here #endif len = readLine(buffer, sizeof(buffer) - 1, timeout); if(len < 1) return errTimeout; if(strnicmp(buffer, "HTTP/", 5)) return errInvalid; ref = strchr(buffer, ' '); while(*ref == ' ') ++ref; switch(atoi(ref)) { default: return errInvalid; case 100: goto cont; case 200: return errSuccess; case 401: return errUnauthorized; case 403: return errForbidden; case 404: return errMissing; case 405: return errDenied; case 500: case 501: case 502: case 503: case 504: case 505: return errFailure; case 300: case 301: case 302: break; } if(!follow) return errRelocated; for(;;) { len = readLine(reloc, sizeof(reloc), timeout); if(len < 1) return errTimeout; if(!strnicmp(reloc, "Location: ", 10)) break; } if(!strnicmp(reloc + 10, "http:", 5)) { url = strchr(reloc + 15, '/'); ep = (char *)(url + strlen(url) - 1); while(*ep == '\r' || *ep == '\n') *(ep--) = 0; } else url = reloc + 10; close(); goto retry; } void URLStream::setAuthentication(Authentication a, const char *value) { auth = a; if (auth != authAnonymous) { if(!user) user = "anonymous"; if(!password) password = ""; } } void URLStream::setProxyAuthentication(Authentication a, const char *value) { proxyAuth = a; if (proxyAuth != authAnonymous) { if(!proxyUser) proxyUser = "anonymous"; if(!proxyPasswd) proxyPasswd = ""; } } void URLStream::setReferer(const char *str) { if(!str) return; referer = str; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ kfritz/libfritz++/cc++/urlstring.cpp0000664000175000017500000002123012065570712015421 0ustar jojo// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // 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. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #include #include #include #ifdef WIN32 #include #endif #include #ifdef CCXX_NAMESPACES namespace ost2 { using namespace std; #endif static const unsigned char alphabet[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char* b64Encode(const char *source, char *dest, size_t limit) { b64Encode((const unsigned char*)source,strlen(source), dest,limit); return dest; } char* b64Decode(char *source, char *dest) { size_t srcsize = strlen(source); char* dst = dest?dest:source; size_t dstsize = b64Decode(source,(unsigned char*)dst,srcsize+1); dst[dstsize] = 0; return dst; } size_t b64Encode(const unsigned char *src, size_t srcsize, char *dst, size_t dstsize) { if (!dstsize) return 0; char* pdst = dst; unsigned bits; while(srcsize >= 3 && dstsize > 4) { bits = (((unsigned)src[0])<<16) | (((unsigned)src[1])<<8) | ((unsigned)src[2]); src += 3; srcsize -= 3; *(pdst++) = alphabet[bits >> 18]; *(pdst++) = alphabet[(bits >> 12) & 0x3f]; *(pdst++) = alphabet[(bits >> 6) & 0x3f]; *(pdst++) = alphabet[bits & 0x3f]; dstsize -= 4; } if (srcsize && dstsize > 4) { bits = ((unsigned)src[0])<<16; *(pdst++) = alphabet[bits >> 18]; if (srcsize == 1) { *(pdst++) = alphabet[(bits >> 12) & 0x3f]; *(pdst++) = '='; } else { bits |= ((unsigned)src[1])<<8; *(pdst++) = alphabet[(bits >> 12) & 0x3f]; *(pdst++) = alphabet[(bits >> 6) & 0x3f]; } *(pdst++) = '='; } *pdst = 0; return pdst-dst; } size_t b64Decode(const char *src, unsigned char *dst, size_t dstsize) { char decoder[256]; int i, bits, c; unsigned char *pdst = dst; for (i = 0; i < 256; ++i) decoder[i] = 64; for (i = 0; i < 64 ; ++i) decoder[alphabet[i]] = i; bits = 1; while(*src) { c = (unsigned char)(*(src++)); if (c == '=') { if (bits & 0x40000) { if (dstsize < 2) break; *(pdst++) = (bits >> 10); *(pdst++) = (bits >> 2) & 0xff; break; } if (bits & 0x1000 && dstsize) *(pdst++) = (bits >> 4); break; } // skip invalid chars if (decoder[c] == 64) continue; bits = (bits << 6) + decoder[c]; if (bits & 0x1000000) { if (dstsize < 3) break; *(pdst++) = (bits >> 16); *(pdst++) = (bits >> 8) & 0xff; *(pdst++) = (bits & 0xff); bits = 1; dstsize -= 3; } } return pdst-dst; } char* urlDecode(char *source, char *dest) { char *ret; char hex[3]; if(!dest) dest = source; else *dest = 0; ret = dest; if(!source) return dest; while(*source) { switch(*source) { case '+': *(dest++) = ' '; break; case '%': // NOTE: wrong input can finish with "...%" giving // buffer overflow, cut string here if(source[1]) { hex[0] = source[1]; ++source; if(source[1]) { hex[1] = source[1]; ++source; } else hex[1] = 0; } else hex[0] = hex[1] = 0; hex[2] = 0; *(dest++) = (char)strtol(hex, NULL, 16); break; default: *(dest++) = *source; } ++source; } *dest = 0; return ret; } char* urlEncode(const char *source, char *dest, size_t max) { static const char *hex = "0123456789abcdef"; size_t len = 0; unsigned char ch; char *ret = dest; *dest = 0; if(!source) return dest; while(len < max - 4 && *source) { ch = (unsigned char)*source; if(*source == ' ') *(dest++) = '+'; else if(isalnum(*source) || strchr("/.-:;,", *source)) *(dest++) = *source; else { *(dest++) = '%'; // char in C++ can be more than 8bit *(dest++) = hex[(ch >> 4)&0xF]; *(dest++) = hex[ch % 16]; } ++source; } *dest = 0; return ret; } #if defined(DYNAMIC_LOCAL_ARRAYS) /** @relates URLStream * Encode a STL string using base64 coding into a STL string * @return base 64 encoded string * @param src source string */ String b64Encode(const String& src) { size_t limit = (src.length()+2)/3*4+1; // size + null must be included char buffer[limit]; unsigned size = b64Encode((const unsigned char *)src.c_str(), src.length(), buffer, limit); buffer[size] = '\0'; return String(buffer); } /** @relates URLStream * Decode a STL string using base64 coding into an STL String. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return decoded string * @param src source string */ String b64Decode(const String& src) { size_t limit = src.length()/4*3; unsigned char buffer[limit+1]; unsigned size = b64Decode(src.c_str(), buffer, limit); buffer[size] = '\0'; return String((char *)buffer); } /** @relates URLStream * Encode a octet stream using base64 coding into a STL string * @return base 64 encoded string * @param src source buffer * @param srcsize source buffer size */ String b64Encode(const unsigned char *src, size_t srcsize) { size_t limit = (srcsize+2)/3*4+1; char buffer[limit]; unsigned size = b64Encode(src, srcsize, buffer, limit); buffer[size] = '\0'; return String(buffer); } /** @relates URLStream * Decode an STL string encoded using base64. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return number of octets written into destination buffer * @param src source string * @param dst destination octet buffer * @param dstsize destination buffer size */ size_t b64Decode(const String& src, unsigned char *dst, size_t dstsize) { return b64Decode(src.c_str(), dst, dstsize); } #endif #ifdef CCXX_NAMESPACES } #endif kfritz/libfritz++/OertlichesFonbook.h0000664000175000017500000000216212065572605015747 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef OERTLICHESFONBOOK_H #define OERTLICHESFONBOOK_H #include "LookupFonbook.h" namespace fritz { class OertlichesFonbook : public LookupFonbook { friend class FonbookManager; private: OertlichesFonbook(); public: virtual sResolveResult Lookup(std::string number) const; }; } #endif /*OERTLICHESFONBOOK_H_*/ kfritz/libfritz++/SoapClient.cpp0000664000175000017500000000250212065572605014722 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "SoapClient.h" namespace fritz { SoapClient::SoapClient(std::string &host, int port): HttpClient(host, port, new ost2::SOAPStream()) { soapStream = static_cast(stream); } SoapClient::~SoapClient() { } std::string SoapClient::Post(const std::ostream &url, const std::ostream &action, const std::ostream &postdata) { const std::stringstream &_action = static_cast(action); soapStream->setAction(_action.str().c_str()); return HttpClient::Post(url, postdata); } } kfritz/libfritz++/Config.h0000664000175000017500000002035512065572605013541 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef CONFIG_H #define CONFIG_H #include #include #include #include #include "FritzClient.h" #define NAMESPACE "libfritz++" #define LOCATOR "[" << NAMESPACE << "/" << \ std::string(__FILE__, std::string(__FILE__).rfind('/') == std::string::npos ? \ 0 : std::string(__FILE__).rfind('/')+1, std::string::npos ) \ << ":" << __LINE__ << "] " #define DBG(x) {fritz::syslogMutex->enterMutex(); *::fritz::dsyslog << LOCATOR << x << std::endl; fritz::syslogMutex->leaveMutex();} #define INF(x) {fritz::syslogMutex->enterMutex(); *::fritz::isyslog << LOCATOR << x << std::endl; fritz::syslogMutex->leaveMutex();} #define ERR(x) {fritz::syslogMutex->enterMutex(); *::fritz::esyslog << LOCATOR << x << std::endl; fritz::syslogMutex->leaveMutex();} #define HIDDEN "" #define RETRY_DELAY 60 namespace fritz { /** * Global config class for libfritz++. * This class maintains all configuration information needed by classes part of libfritz++. * It is instantiated once automatically, a pointer gConfig is globally available. */ class Config { public: enum eLoginType { UNKNOWN, PASSWORD, SID, LUA }; private: struct sConfig { std::string configDir; // path to libraries' config files (e.g., local phone book) std::string lang; // webinterface language std::string url; // fritz!box url int uiPort; // the port of the fritz box web interface int upnpPort; // the port of the UPNP server of the fritz box int listenerPort; // the port of the fritz box call monitor std::string password; // fritz!box web interface password time_t lastRequestTime; // with eLoginType::SID: time of last request sent to fritz box eLoginType loginType; // type of login procedure std::string sid; // SID to access boxes with firmware >= xx.04.74 std::string countryCode; // fritz!box country-code std::string regionCode; // fritz!box region-code std::vector sipNames; // the SIP provider names std::vector sipMsns; // the SIP provider msn numbers std::vector msn; // msn's we are interesed in std::vector selectedFonbookIDs; // active phone books std::string activeFonbook; // currently selected Fonbook bool logPersonalInfo; // log sensitive information like passwords, phone numbers, ... } mConfig; Config( std::string url, std::string password ); public: /** * Sets up the libfritz++ library. * This has to be the first call to libfritz++. * @param the hostname of the Fritz!Box device, defaults to fritz.box * @param the password of the Fritz!Box device, defaults to an empty one * @param allows personal information to be logged */ void static Setup( std::string hostname="fritz.box", std::string password="", bool logPersonalInfo = false ); /** * Sets arbitrary ports for connections to the Fritz!Box's listener and webinterface. * @param the port to connect to the listener * @param the port to connect to the webinterface * @param the port to connect to the UPNP server */ void static SetupPorts( int listener, int ui, int upnp ); /** * Establishes MSN filtering. * An MsnFilter enables the library to only notify the application on * events which occur on one of the MSNs specified. A call to this method is only * needed if filtering is wanted. Default is no filtering. * @param the list of MSNs to filter on */ void static SetupMsnFilter( std::vector vMsn ); /** * Modifies logging channels. * As default, logging of libfritz++ actions is performed using default c++ * cout, cerr and clog objects. This method enables the application to redirect * logging to arbitrary ostream objects. * @param the ostream for debbuging messages * @param the ostream for information messages * @param the ostream for error messages */ void static SetupLogging( std::ostream *dsyslog, std::ostream *isyslog, std::ostream *esyslog ); /** * Sets up a directory for arbitrary data storage. * This is currently used by local fonbook to persist the fonbook entries to a file. * @param full path to the writable directory */ void static SetupConfigDir( std::string dir); /** * Initiates the libfritz++ library. * @param indicates, whether auto-detection of location settings was successful * @param Sets the default value for countryCode. If locationSettingsDetected == true, this returns the detected countryCode. * @param Sets the default value for regionCode. If locationSettingsDetected == true, this returns the detected regionCode. */ bool static Init( bool *locationSettingsDetected = NULL, std::string *countryCode = NULL, std::string *regionCode = NULL ); /** * Closes all pending connections and objects held by libfritz++. * Stores unsaved data. */ bool static Shutdown(); std::string &getConfigDir( ) { return mConfig.configDir; } std::string &getLang( ) { return mConfig.lang; } void setLang( std::string l ) { mConfig.lang = l; } std::string &getUrl( ) { return mConfig.url; } int getUiPort( ) { return mConfig.uiPort; } int getListenerPort( ) { return mConfig.listenerPort; } int getUpnpPort( ) { return mConfig.upnpPort; } std::string &getPassword( ) { return mConfig.password; } eLoginType getLoginType( ) { return mConfig.loginType; } void setLoginType(eLoginType type) { mConfig.loginType = type; } time_t getLastRequestTime() { return mConfig.lastRequestTime; } void updateLastRequestTime() { mConfig.lastRequestTime = time(NULL); } std::string &getSid( ) { return mConfig.sid; } void setSid(std::string sid) { mConfig.sid = sid; } std::string &getCountryCode( ) { return mConfig.countryCode; } void setCountryCode( std::string cc ) { mConfig.countryCode = cc; } std::string &getRegionCode( ) { return mConfig.regionCode; } void setRegionCode( std::string rc ) { mConfig.regionCode = rc; } std::vector &getSipNames( ) { return mConfig.sipNames; } void setSipNames( std::vector names) { mConfig.sipNames = names; } std::vector &getSipMsns( ) { return mConfig.sipMsns; } void setSipMsns( std::vector msns) { mConfig.sipMsns = msns; } std::vector getMsnFilter( ) { return mConfig.msn; } std::vector getFonbookIDs( ) { return mConfig.selectedFonbookIDs; } void setFonbookIDs(std::vector v) { mConfig.selectedFonbookIDs = v; } std::string &getActiveFonbook( ) { return mConfig.activeFonbook; } void setActiveFonbook( std::string f ) { mConfig.activeFonbook = f; } bool logPersonalInfo( ) { return mConfig.logPersonalInfo; }; virtual ~Config(); FritzClientFactory *fritzClientFactory; }; extern Config* gConfig; extern ost::Mutex *syslogMutex; extern std::ostream *dsyslog; extern std::ostream *isyslog; extern std::ostream *esyslog; } #endif /* CONFIG_H_ */ kfritz/libfritz++/SoapClient.h0000664000175000017500000000235512065572605014375 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SOAPCLIENT_H #define SOAPCLIENT_H #include "cc++/soap.h" #include "HttpClient.h" namespace fritz { class SoapClient : protected HttpClient { private: ost2::SOAPStream *soapStream; std::string soapAction; public: explicit SoapClient(std::string &host, int port = 80); virtual ~SoapClient(); std::string Post(const std::ostream &url, const std::ostream &action, const std::ostream &postdata); }; } #endif /* SOAPCLIENT_H_ */ kfritz/libfritz++/FritzClient.cpp0000664000175000017500000004404512067103221015110 0ustar jojo/* * libfritz++ * * Copyright (C) 2007-2012 Joachim Wilke * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "FritzClient.h" #include #include #include #include #include "Config.h" #include "Tools.h" #define RETRY_BEGIN \ ost::Thread::setException(ost::Thread::throwException); \ unsigned int retry_delay = RETRY_DELAY / 2; \ bool dataRead = false; \ do { \ try { \ validPassword = Login(); \ retry_delay = retry_delay > 1800 ? 3600 : retry_delay * 2; #define RETRY_END \ dataRead = true; \ } catch (ost::SockException &se) { \ ERR("Exception in connection to " << gConfig->getUrl() << " - " << se.what()); \ ERR("waiting " << retry_delay << " seconds before retrying"); \ sleep(retry_delay); /* delay a possible retry */ \ } \ } while (!dataRead); namespace fritz { ost::Mutex* FritzClient::mutex = new ost::Mutex(); FritzClient::FritzClient() { validPassword = false; mutex->enterMutex(); // init libgcrypt gcry_check_version (NULL); // disable secure memory gcry_control (GCRYCTL_DISABLE_SECMEM, 0); gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); // init HttpClient httpClient = new HttpClient(gConfig->getUrl(), gConfig->getUiPort()); soapClient = new SoapClient(gConfig->getUrl(), gConfig->getUpnpPort()); } FritzClient::~FritzClient() { delete httpClient; mutex->leaveMutex(); } std::string FritzClient::CalculateLoginResponse(std::string challenge) { std::string challengePwd = challenge + '-' + gConfig->getPassword(); // the box needs an md5 sum of the string "challenge-password" // to make things worse, it needs this in UTF-16LE character set // last but not least, for "compatibility" reasons (*LOL*) we have to replace // every char > "0xFF 0x00" with "0x2e 0x00" CharSetConv conv(NULL, "UTF-16LE"); char challengePwdConv[challengePwd.length()*2]; memcpy(challengePwdConv, conv.Convert(challengePwd.c_str()), challengePwd.length()*2); for (size_t pos=1; pos < challengePwd.length()*2; pos+= 2) if (challengePwdConv[pos] != 0x00) { challengePwdConv[pos] = 0x00; challengePwdConv[pos-1] = 0x2e; } unsigned char hash[16]; gcry_md_hash_buffer(GCRY_MD_MD5, hash, (const char*)challengePwdConv, challengePwd.length()*2); std::stringstream response; response << challenge << '-'; for (size_t pos=0; pos < 16; pos++) response << std::hex << std::setfill('0') << std::setw(2) << (unsigned int)hash[pos]; return response.str(); } std::string FritzClient::UrlEncode(std::string &s_input) { std::string result; std::string s; std::string hex = "0123456789abcdef"; CharSetConv *conv = new CharSetConv(CharSetConv::SystemCharacterTable(), "ISO-8859-15"); s = conv->Convert(s_input.c_str()); delete(conv); for (unsigned int i=0; i> 4]; result += hex[(unsigned char) s[i] & 0x0f]; } } // TODO: With introduction of libccgnu2, this implementation could be replaced by // char result[4*s_input.length()]; // ost::urlEncode(s_input.c_str(), result, sizeof(result)); return result; } bool FritzClient::Login() { // when using SIDs, a new login is only needed if the last request was more than 5 minutes ago if ((gConfig->getLoginType() == Config::SID || gConfig->getLoginType() == Config::LUA) && (time(NULL) - gConfig->getLastRequestTime() < 300)) { return true; } // detect type of login once std::string sXml; // sXml is used twice! if (gConfig->getLoginType() == Config::UNKNOWN || gConfig->getLoginType() == Config::SID || gConfig->getLoginType() == Config::LUA) { // detect if this Fritz!Box uses SIDs DBG("requesting login_sid.lua from Fritz!Box."); // might return 404 with older fw-versions, our httpClient throws a SockeException for this, catched here try { sXml = httpClient->Get(std::stringstream().flush() << "/login_sid.lua?sid=" << gConfig->getSid()); } catch (ost::SockException &se) {} if (sXml.find("setLoginType(Config::LUA); else { DBG("requesting login_sid.xml from Fritz!Box."); sXml = httpClient->Get(std::stringstream().flush() << "/cgi-bin/webcm?getpage=../html/login_sid.xml"); if (sXml.find("") != std::string::npos) gConfig->setLoginType(Config::SID); else gConfig->setLoginType(Config::PASSWORD); } } if (gConfig->getLoginType() == Config::SID || gConfig->getLoginType() == Config::LUA) { std::stringstream loginPath; // std::stringstream postdataLogout; if (gConfig->getLoginType() == Config::LUA) { loginPath << "/login_sid.lua"; // postdataLogout << "sid=" << gConfig->getSid() << "&logout=abc"; } else { loginPath << "/cgi-bin/webcm"; // postdataLogout << "sid=" << gConfig->getSid() << "&security:command/logout=abc"; } // DBG("logging into fritz box using SIDs."); // if (gConfig->getSid().length() > 0) { // // logout, drop old SID (if FB has not already dropped this SID because of a timeout) // DBG("dropping old SID"); // std::string sDummy; // sDummy = httpClient->Post(loginPath, postdataLogout); // } // check if no password is needed (SID is directly available) size_t sidStart = sXml.find(""); if (sidStart == std::string::npos) { ERR("Error - Expected field not found in login_sid.xml or login_sid.lua."); return false; } sidStart += 5; std::string sid = sXml.substr(sidStart, 16); if (sid.compare("0000000000000000") != 0) { // save SID DBG("SID is still valid - all ok."); gConfig->setSid(sid); gConfig->updateLastRequestTime(); return true; } else { DBG("We need to log in."); // generate response out of challenge and password size_t challengeStart = sXml.find(""); if (challengeStart == std::string::npos) { ERR("Error - Expected not found in login_sid.xml or login_sid.lua."); return false; } challengeStart += 11; size_t challengeStop = sXml.find("<", challengeStart); std::string challenge = sXml.substr(challengeStart, challengeStop - challengeStart); std::string response = CalculateLoginResponse(challenge); // send response to box std::string sMsg; std::stringstream postdata; if (gConfig->getLoginType() == Config::SID) postdata << "login:command/response=" << response << "&getpage=../html/de/menus/menu2.html"; else postdata << "username=&response=" << response; DBG("Sending login request..."); sMsg = httpClient->Post(loginPath, postdata); size_t sidStart, sidStop; if (gConfig->getLoginType() == Config::SID) { sidStart = sMsg.find("name=\"sid\""); if (sidStart == std::string::npos) { ERR("Error - Expected sid field not found."); return false; } sidStart = sMsg.find("value=\"", sidStart + 10) + 7; sidStop = sMsg.find("\"", sidStart); } else { sidStart = sMsg.find(""); if (sidStart == std::string::npos) { ERR("Error - Expected sid field not found."); return false; } sidStart += 5; sidStop = sMsg.find(""); } // save SID gConfig->setSid(sMsg.substr(sidStart, sidStop-sidStart)); if (gConfig->getSid().compare("0000000000000000") != 0) { DBG("login successful."); gConfig->updateLastRequestTime(); return true; } else { ERR("login failed, check your password settings!."); return false; } } } if (gConfig->getLoginType() == Config::PASSWORD) { DBG("logging into fritz box using old scheme without SIDs."); // no password, no login if ( gConfig->getPassword().length() == 0) return true; //TODO: check if box really doesn't need a password std::string sMsg; sMsg = httpClient->Post(std::stringstream().flush() << "/cgi-bin/webcm", std::stringstream().flush() << "login:command/password=" << UrlEncode(gConfig->getPassword())); // determine if login was successful if (sMsg.find("class=\"errorMessage\"") != std::string::npos) { ERR("login failed, check your password settings."); return false; } DBG("login successful."); return true; } return false; } std::string FritzClient::GetLang() { if ( gConfig && gConfig->getLang().size() == 0) { std::vector langs; langs.push_back("en"); langs.push_back("de"); langs.push_back("fr"); for (unsigned int p=0; pGet(std::stringstream().flush() << "/cgi-bin/webcm?getpage=../html/" << langs[p] << "/menus/menu2.html" << (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid()); if (sMsg.find("") != std::string::npos) { gConfig->setLang(langs[p]); DBG("interface language is " << gConfig->getLang().c_str()); return gConfig->getLang(); } } DBG("error parsing interface language, assuming 'de'"); gConfig->setLang("de"); } return gConfig->getLang(); } bool FritzClient::InitCall(std::string &number) { std::string msg; if (number.length() == 0) return false; if (!Login()) return false; try { INF("sending call init request " << (gConfig->logPersonalInfo() ? number.c_str() : HIDDEN)); msg = httpClient->Post(std::stringstream().flush() << "/cgi-bin/webcm", std::stringstream().flush() << "getpage=../html/" << GetLang() << "/menus/menu2.html&var%3Apagename=fonbuch&var%3Amenu=home&telcfg%3Acommand/Dial=" << number << (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid()); INF("call initiated."); } catch (ost::SockException &se) { ERR("Exception - " << se.what()); return false; } return true; } std::string FritzClient::RequestLocationSettings() { std::string msg; RETRY_BEGIN { if (gConfig->getSid().size()) { DBG("Looking up Phone Settings (using lua)..."); try { msg = httpClient->Get(std::stringstream().flush() << "/fon_num/sip_option.lua?sid=" << gConfig->getSid()); } catch (ost::SockException &se) {} if (msg.find("") != std::string::npos) return msg; DBG("failed."); } DBG("Looking up Phone Settings (using webcm)..."); msg = httpClient->Get(std::stringstream().flush() << "/cgi-bin/webcm?getpage=../html/" << GetLang() << "/menus/menu2.html&var%3Alang=" << GetLang() << "&var%3Apagename=sipoptionen&var%3Amenu=fon" << (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid()); } RETRY_END return msg; } std::string FritzClient::RequestSipSettings() { std::string msg; RETRY_BEGIN { if (gConfig->getSid().size()) { DBG("Looking up SIP Settings (using lua)..."); try { msg = httpClient->Get(std::stringstream().flush() << "/fon_num/fon_num_list.lua?sid=" << gConfig->getSid()); } catch (ost::SockException &se) {} if (msg.find("") != std::string::npos) return msg; DBG("failed."); } DBG("Looking up SIP Settings (using webcm)..."); msg = httpClient->Get(std::stringstream().flush() << "/cgi-bin/webcm?getpage=../html/" << GetLang() << "/menus/menu2.html&var%3Alang=" << GetLang() << "&var%3Apagename=siplist&var%3Amenu=fon" << (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid()); } RETRY_END return msg; } std::string FritzClient::RequestCallList () { std::string msg = ""; std::string csv = ""; RETRY_BEGIN { // now, process call list DBG("sending callList update request."); // force an update of the fritz!box csv list and wait until all data is received msg = httpClient->Get(std::stringstream().flush() << "/cgi-bin/webcm?getpage=../html/" << GetLang() << "/menus/menu2.html&var:lang=" << GetLang() << "&var:pagename=foncalls&var:menu=fon" << (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid()); // new method to request call list (FW >= xx.05.50?) try { DBG("sending callList request (using lua)..."); csv = httpClient->Get(std::stringstream().flush() << "/fon_num/foncalls_list.lua?" << "csv=&sid=" << gConfig->getSid()); if (csv.find("Typ;Datum;Name;") != std::string::npos) { // we assume utf8 as encoding // the FB sends encoding in the response, however we do not parse it, yet CharSetConv *conv = new CharSetConv("utf8", CharSetConv::SystemCharacterTable()); const char *csv_converted = conv->Convert(csv.c_str()); csv = csv_converted; delete(conv); return csv; } } catch (ost::SockException e) {} // old method, parsing url to csv from page above // get the URL of the CSV-File-Export unsigned int urlPos = msg.find(".csv"); unsigned int urlStop = msg.find('"', urlPos); unsigned int urlStart = msg.rfind('"', urlPos) + 1; std::string csvUrl = msg.substr(urlStart, urlStop-urlStart); // retrieve csv list DBG("sending callList request (using webcm)..."); csv = httpClient->Get(std::stringstream().flush() << "/cgi-bin/webcm?getpage=" << csvUrl << (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid()); // convert answer to current SystemCodeSet (we assume, Fritz!Box sends its answer in latin15) CharSetConv *conv = new CharSetConv("ISO-8859-15", CharSetConv::SystemCharacterTable()); const char *csv_converted = conv->Convert(csv.c_str()); csv = csv_converted; delete(conv); } RETRY_END return csv; } std::string FritzClient::RequestFonbook () { std::string msg; // new method, returns an XML RETRY_BEGIN { if (gConfig->getSid().length()) { ost2::MIMEMultipartForm *mmpf = new ost2::MIMEMultipartForm(); new ost2::MIMEFormData( mmpf, "sid", gConfig->getSid().c_str()); new ost2::MIMEFormData( mmpf, "PhonebookId", "0"); new ost2::MIMEFormData( mmpf, "PhonebookExportName", "Telefonbuch"); new ost2::MIMEFormData( mmpf, "PhonebookExport", ""); DBG("sending fonbook XML request."); try { msg = httpClient->PostMIME(std::stringstream().flush() << "/cgi-bin/firmwarecfg", *mmpf); } catch (ost::SockException &se) {} if (msg.find("") != std::string::npos) { return msg; } } // use old fashioned website (for old FW versions) DBG("sending fonbook HTML request."); msg = httpClient->Get(std::stringstream().flush() << "/cgi-bin/webcm?getpage=../html/" << GetLang() << "/menus/menu2.html" << "&var:lang=" << GetLang() << "&var:pagename=fonbuch&var:menu=fon" << (gConfig->getSid().size() ? "&sid=" : "") << gConfig->getSid()); } RETRY_END return msg; } void FritzClient::WriteFonbook(std::string xmlData) { std::string msg; DBG("Saving XML Fonbook to FB..."); RETRY_BEGIN { ost2::MIMEMultipartForm *mmpf = new ost2::MIMEMultipartForm(); new ost2::MIMEFormData( mmpf, "sid", gConfig->getSid().c_str()); new ost2::MIMEFormData( mmpf, "PhonebookId", "0"); new ost2::MIMEFormData( mmpf, "PhonebookImportFile", "FRITZ.Box_Telefonbuch_01.01.10_0000.xml", "text/xml", xmlData.c_str()); msg = httpClient->PostMIME(std::stringstream().flush() << "/cgi-bin/firmwarecfg", *mmpf); } RETRY_END } bool FritzClient::reconnectISP() { std::string msg; DBG("Sending reconnect request to FB."); try { msg = soapClient->Post( std::stringstream().flush() << "/upnp/control/WANIPConn1", std::stringstream().flush() << "urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination", std::stringstream().flush() << "" "" "" "" "" ""); } catch (ost::SockException &se) { ERR("Exception in connection to " << gConfig->getUrl() << " - " << se.what()); return false; } if (msg.find("ForceTerminationResponse") == std::string::npos) return false; else return true; } std::string FritzClient::getCurrentIP() { std::string msg; DBG("Sending reconnect request to FB."); try { msg = soapClient->Post( std::stringstream().flush() << "/upnp/control/WANIPConn1", std::stringstream().flush() << "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress", std::stringstream().flush() << "" "" "" "" "" ""); } catch (ost::SockException &se) { ERR("Exception in connection to " << gConfig->getUrl() << " - " << se.what()); return ""; } DBG("Parsing reply..."); std::string::size_type start = msg.find(""); std::string::size_type stop = msg.find(""); if (start != std::string::npos && stop != std::string::npos) { std::string ip = msg.substr(start + 22, stop - start - 22); DBG("Current ip is: " << ip); return ip; } else { ERR("Error parsing response in getCurrentIP()."); } return ""; } //TODO: update lastRequestTime with any request } kfritz/libfritz++/CMakeLists.txt0000664000175000017500000000366312065570712014723 0ustar jojo# --- general setup ----------------------------------------------------------- cmake_minimum_required(VERSION 2.6) project (libfritz++) #set(CMAKE_VERBOSE_MAKEFILE true) # <-- enable for debugging #set(CMAKE_BUILD_TYPE "Debug") # <-- enable for debugging set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${libfritz++_SOURCE_DIR}/CMakeModules") find_package(PkgConfig REQUIRED) find_package(Threads REQUIRED) # --- libgcrypt includes ------------------------------------------------------ include("FindGcryptConfig") gcrypt_check(GCRYPT REQUIRED gcrypt) # --- gnu common cpp library -------------------------------------------------- pkg_check_modules(CC++ REQUIRED libccgnu2 libccext2) include_directories(${CC++_INCLUDE_DIRS}) link_directories(${CC++_LIBRARY_DIRS}) # --- compile and link -------------------------------------------------------- include_directories(${libfritz++_SOURCE_DIR}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCRYPT_CFLAGS} ${CC++_CFLAGS_OTHER}") set(SRCS cc++/url.cpp cc++/urlstring.cpp cc++/mime.cpp cc++/soap.cpp CallList.cpp Config.cpp Fonbooks.cpp Fonbook.cpp FonbookManager.cpp FritzClient.cpp FritzFonbook.cpp HttpClient.cpp Listener.cpp LocalFonbook.cpp LookupFonbook.cpp Nummerzoeker.cpp OertlichesFonbook.cpp SoapClient.cpp TcpClient.cpp TelLocalChFonbook.cpp Tools.cpp XmlFonbook.cpp) add_library(fritz++ STATIC ${SRCS}) # --- tests ------------------------------------------------------------------- if (EXISTS ${libfritz++_SOURCE_DIR}/test) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-undef -DSOURCE_DIR=\\\"${libfritz++_SOURCE_DIR}\\\"") include_directories(${libfritz++_SOURCE_DIR}/test) AUX_SOURCE_DIRECTORY(test LIBTESTFILES) add_executable(libfritztest ${LIBTESTFILES} test/gtest/gtest-all.cc test/gtest/gtest_main.cc) target_link_libraries(libfritztest fritz++ ${GCRYPT_LIBRARIES} ${CC++_LDFLAGS}) endif (EXISTS ${libfritz++_SOURCE_DIR}/test) kfritz/CMakeLists.txt0000664000175000017500000001254612065570711012747 0ustar jojo# --- general setup ----------------------------------------------------------- cmake_minimum_required(VERSION 2.6) project (KFRITZ) #set(CMAKE_VERBOSE_MAKEFILE true) # <-- enable for debugging #set(CMAKE_BUILD_TYPE "Debug") # <-- enable for debugging set (KDE4_BUILD_TESTS ON) set (CMAKE_SKIP_RPATH TRUE) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${KFRITZ_SOURCE_DIR}/CMakeModules") find_package(PkgConfig REQUIRED) # --- kde includes ------------------------------------------------------------ find_package(KDE4 REQUIRED) include (KDE4Defaults) include_directories(${KDE4_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) # --- libgcrypt includes ------------------------------------------------------ include("FindGcryptConfig") gcrypt_check(GCRYPT REQUIRED gcrypt) # --- gnu common cpp library -------------------------------------------------- pkg_check_modules(CC++ REQUIRED libccgnu2 libccext2) include_directories(${CC++_INCLUDE_DIRS}) link_directories(${CC++_LIBRARY_DIRS}) # --- support for libindicate ------------------------------------------------- pkg_check_modules(INDICATEQT indicate-qt>=0.2.2) macro_log_feature(INDICATEQT_FOUND "indicate-qt" "QT bindings for libindicate" "https://launchpad.net/libindicate-qt" FALSE "0.2.2" "Required for indicator support.") if (INDICATEQT_FOUND) include_directories(${INDICATEQT_INCLUDE_DIRS}) link_directories(${INDICATEQT_LIBRARY_DIRS}) endif (INDICATEQT_FOUND) # --- include local libs ------------------------------------------------------ subdirs(libfritz++) INCLUDE_DIRECTORIES(libfritz++) # --- include icons ----------------------------------------------------------- subdirs(icons) # --- i18n -------------------------------------------------------------------- find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt) if(GETTEXT_MSGFMT_EXECUTABLE) set(catalogname kfritz) add_custom_target(translations ALL) file(GLOB PO_FILES po/*.po) foreach(_poFile ${PO_FILES}) get_filename_component(_poFileName ${_poFile} NAME) string(REGEX REPLACE "^${catalogname}_?" "" _langCode ${_poFileName} ) string(REGEX REPLACE "\\.po$" "" _langCode ${_langCode} ) if( _langCode ) get_filename_component(_lang ${_poFile} NAME_WE) set(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) add_custom_command(TARGET translations COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile} DEPENDS ${_poFile}) install(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo) endif( _langCode ) endforeach(_poFile ${PO_FILES}) endif(GETTEXT_MSGFMT_EXECUTABLE) # --- compile and link -------------------------------------------------------- set(kfritzbox_SRCS ContainerWidget.cpp DialDialog.cpp KFritz.cpp KFritzWindow.cpp KFonbookModel.cpp KSettingsFonbooks.cpp KSettingsFritzBox.cpp KSettingsMisc.cpp KFritzModel.cpp KFritzDbusService.cpp KCalllistModel.cpp KCalllistProxyModel.cpp LibFritzInit.cpp Log.cpp LogDialog.cpp MimeFonbookEntry.cpp QAdaptTreeView.cpp) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS} ${GCRYPT_CFLAGS} ${CC++_CFLAGS_OTHER}") set(CMAKE_CXX_FLAGS_DEBUG "-g -ggdb -O0 -Wall -D_GLIBCXX_DEBUG") qt4_add_dbus_adaptor(kfritzbox_SRCS org.kde.KFritz.xml KFritzDbusService.h KFritzDbusService KFritzDbusServiceAdaptor KFritzDbusServiceAdaptor) kde4_add_kcfg_files(kfritzbox_SRCS GENERATE_MOC KSettings.kcfgc) kde4_add_ui_files(kfritzbox_SRCS KSettingsFritzBox.ui KSettingsFonbooks.ui KSettingsMisc.ui DialDialog.ui) configure_file(pkg-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/pkg-config.h) kde4_add_library(kfritzstatic STATIC ${kfritzbox_SRCS}) kde4_add_executable(kfritz main.cpp) target_link_libraries(kfritz kfritzstatic fritz++ ${KDE4_KDEUI_LIBS} ${KDE4_KNOTIFYCONFIG_LIBRARY} ${GCRYPT_LIBRARIES} ${CC++_LDFLAGS}) if (INDICATEQT_FOUND) target_link_libraries(kfritz ${INDICATEQT_LIBRARIES}) endif (INDICATEQT_FOUND) # --- tests ------------------------------------------------------------------- if (EXISTS ${KFRITZ_SOURCE_DIR}/test) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-undef") include_directories(test) AUX_SOURCE_DIRECTORY(test TESTFILES) kde4_add_unit_test(kfritztest ${TESTFILES} test/gtest/gtest-all.cc test/gtest/gtest_main.cc) target_link_libraries(kfritztest kfritzstatic fritz++ ${KDE4_KDEUI_LIBS} ${KDE4_KNOTIFYCONFIG_LIBRARY} ${GCRYPT_LIBRARIES} ${CC++_LDFLAGS}) if (INDICATEQT_FOUND) target_link_libraries(kfritztest ${INDICATEQT_LIBRARIES}) endif (INDICATEQT_FOUND) endif (EXISTS ${KFRITZ_SOURCE_DIR}/test) # --- installs ---------------------------------------------------------------- install(TARGETS kfritz ${INSTALL_TARGETS_DEFAULT_ARGS}) # TODO: kfritz.notifyrc is installed in /usr/local/share/apps/kfritz/ -> does not work (use /usr/share/kde4/apps/kfritz/ instead) install(FILES kfritz.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kfritz) install(FILES kfritzui.rc DESTINATION ${DATA_INSTALL_DIR}/kfritz) install(FILES kfritz.kcfg DESTINATION ${KCFG_INSTALL_DIR}) install(FILES kfritz.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})