-rw-r--r-- | library/backend/categories.cpp | 319 | ||||
-rw-r--r-- | library/backend/contact.cpp | 526 | ||||
-rw-r--r-- | library/backend/contact.h | 102 | ||||
-rw-r--r-- | library/backend/event.cpp | 501 | ||||
-rw-r--r-- | library/backend/event.h | 173 | ||||
-rw-r--r-- | library/backend/palmtoprecord.cpp | 42 | ||||
-rw-r--r-- | library/backend/palmtoprecord.h | 33 | ||||
-rw-r--r-- | library/backend/palmtopuidgen.h | 26 | ||||
-rw-r--r-- | library/backend/qfiledirect_p.h | 20 | ||||
-rw-r--r-- | library/backend/qpcglobal.h | 9 | ||||
-rw-r--r-- | library/backend/recordfields.h | 24 | ||||
-rw-r--r-- | library/backend/stringutil.cpp | 415 | ||||
-rw-r--r-- | library/backend/stringutil.h | 57 | ||||
-rw-r--r-- | library/backend/task.cpp | 167 | ||||
-rw-r--r-- | library/backend/task.h | 21 | ||||
-rw-r--r-- | library/backend/timeconversion.cpp | 237 | ||||
-rw-r--r-- | library/backend/timeconversion.h | 45 | ||||
-rw-r--r-- | library/backend/vcc.y | 103 | ||||
-rw-r--r-- | library/backend/vcc_yacc.cpp | 167 | ||||
-rw-r--r-- | library/backend/vobject.cpp | 104 | ||||
-rw-r--r-- | library/backend/vobject_p.h | 4 |
21 files changed, 2048 insertions, 1047 deletions
diff --git a/library/backend/categories.cpp b/library/backend/categories.cpp index 6e011c4..e37b3b9 100644 --- a/library/backend/categories.cpp +++ b/library/backend/categories.cpp @@ -1,16 +1,15 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included -** in the packaging of this file. +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. ** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING -** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A -** PARTICULAR PURPOSE. +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** @@ -18,11 +17,11 @@ ** not clear to you. ** **********************************************************************/ -#include "categories.h" +#include <qtopia/categories.h> +#include <qtopia/stringutil.h> #include <qfile.h> #include <qcstring.h> #include <qtextstream.h> -#include "stringutil.h" using namespace Qtopia; @@ -38,6 +37,24 @@ UidGen CategoryGroup::sUidGen( UidGen::PalmtopCenter ); UidGen CategoryGroup::sUidGen( UidGen::Qtopia ); #endif +/*! \class CategoryGroup categories.h + \brief Helper class that is used by Categories + + CategoryGroup is a group of categories that is associated with an + application or global set. Mainly it defines a map of ids to + category labels and category labels to ids. Lookups can be done with + labels or unique idenifiers. + + \ingroup qtopiaemb + \ingroup qtopiadesktop + \warning Categories API will likely change between Qtopia 1.5 and Qtopia 3 + \sa Categories::appGroupMap(), Categories::globalGroup() + */ + +/*! Add \a label and return the UID. If failure, then 0 is returned. Note + that All and Unfiled are reserved labels. + \internal +*/ int CategoryGroup::add( const QString &label ) { if ( label == QObject::tr("All") || label == QObject::tr("Unfiled") ) @@ -58,6 +75,8 @@ void CategoryGroup::insert( int uid, const QString &label ) mLabelIdMap[label] = uid; } +/*! \internal + */ bool CategoryGroup::add( int uid, const QString &label ) { if ( label == QObject::tr("All") || label == QObject::tr("Unfiled") ) @@ -73,6 +92,9 @@ bool CategoryGroup::add( int uid, const QString &label ) return TRUE; } +/*! Returns TRUE if \a label was removed from the group, FALSE if not. + \internal + */ bool CategoryGroup::remove( const QString &label ) { QMap<QString,int>::Iterator findIt = mLabelIdMap.find( label ); @@ -85,6 +107,9 @@ bool CategoryGroup::remove( const QString &label ) return TRUE; } +/*! Returns TRUE if \a uid was removed from the group, FALSE if not. + \internal + */ bool CategoryGroup::remove( int uid ) { QMap<int,QString>::Iterator idIt = mIdLabelMap.find( uid ); @@ -97,6 +122,8 @@ bool CategoryGroup::remove( int uid ) return TRUE; } +/*! \internal + */ bool CategoryGroup::rename( int uid, const QString &newLabel ) { if ( newLabel == QObject::tr("All") || newLabel == QObject::tr("Unfiled") ) @@ -113,23 +140,27 @@ bool CategoryGroup::rename( int uid, const QString &newLabel ) return TRUE; } +/*! \internal + */ bool CategoryGroup::rename( const QString &oldLabel, const QString &newLabel ) { return rename( id(oldLabel), newLabel ); } +/*! Returns TRUE if \a uid is stored in this group, FALSE if not. */ bool CategoryGroup::contains(int uid) const { return ( mIdLabelMap.find( uid ) != mIdLabelMap.end() ); } +/*! Returns TRUE if \a label is stored in this group, FALSE if not. */ bool CategoryGroup::contains(const QString &label) const { return ( mLabelIdMap.find( label ) != mLabelIdMap.end() ); } -/** Returns label associated with the uid or QString::null if - * not found +/*! Returns label associated with the \a uid or QString::null if + not found */ const QString &CategoryGroup::label(int uid) const { @@ -139,7 +170,7 @@ const QString &CategoryGroup::label(int uid) const return *idIt; } -/** Returns the uid associated with label or 0 if not found */ +/*! Returns the uid associated with \a label or 0 if not found */ int CategoryGroup::id(const QString &label) const { QMap<QString,int>::ConstIterator labelIt = mLabelIdMap.find( label ); @@ -148,6 +179,7 @@ int CategoryGroup::id(const QString &label) const return *labelIt; } +/*! Returns a list of all labels stored in this group. */ QStringList CategoryGroup::labels() const { QStringList labels; @@ -159,6 +191,7 @@ QStringList CategoryGroup::labels() const return labels; } +/*! Returns a list of all labels associated with the \a catids */ QStringList CategoryGroup::labels(const QArray<int> &catids ) const { QStringList labels; @@ -177,8 +210,48 @@ QStringList CategoryGroup::labels(const QArray<int> &catids ) const * **********************************************************/ -/** Add the category name as long as it doesn't already exist locally - * or globally. Return TRUE if added, FALSE if conflicts. +/*! + \class Categories categories.h + \brief The Categories class is a database that groups categories and maps ids to names. + + The Categories class is the low level Categories accessor class. To + add a category menu and filter for your application, see CategoryMenu. + + The Categories class allows the developer to add, remove, and rename + categories. Categories can be created for an individual application + such as Todo List or to be used for all applications. Categories + that can be used by all applications are called global + categories. Each PalmtopRecord subclass stores categories as an + QArray<int> using PalmtopRecord::setCategories() and + PalmtopRecord::categories(). This allows each record to be assigned + to multiple categories. This also allows the user to rename a + category and for it to update automatically in all records. + + This class provides several methods to convert between a category id + and it's associated string such as id(), ids(), label() and labels(). A + helper class called CategoryGroup is used to access categories of a + single application group, such as Todo List. Global categories can + also be accessed via CategoryGroup objects. See appGroupMap() and + globalGroup() for the appropriate accessor methods. + + Categories are stored in an xml file in the Settings directory + (Categories.xml). A global function called categoryFileName() will + return to appropriate QString file location to be passed to load() + and save() for the master categories database. + + \ingroup qtopiaemb + \ingroup qtopiadesktop + \warning Categories API will likely change between Qtopia 1.5 and Qtopia 3 + \sa CategoryGroup, CategoryMenu +*/ + + +/*! + Add the category name as long as it doesn't already exist locally or + globally. The \a uid is assigned to the category if successfully + added. Return \a uid if added, 0 if conflicts (error). + + \internal */ int Categories::addCategory( const QString &appname, const QString &catname, @@ -204,6 +277,11 @@ int Categories::addCategory( const QString &appname, return uid; } +/*! + Add the category name as long as it doesn't already exist locally or + globally. Return UID if added, 0 if conflicts (error). +*/ + int Categories::addCategory( const QString &appname, const QString &catname ) { @@ -229,6 +307,9 @@ int Categories::addCategory( const QString &appname, return uid; } +/*! + \internal +*/ int Categories::addGlobalCategory( const QString &catname, int uid ) { mGlobalCats.add( uid, catname ); @@ -236,6 +317,12 @@ int Categories::addGlobalCategory( const QString &catname, int uid ) return uid; } +/*! + Add the global category \a catname while checking that it doesn't + already exist globally. Return UID if added, 0 if conflicts. + + \sa addCategory() + */ int Categories::addGlobalCategory( const QString &catname ) { int uid = mGlobalCats.add( catname ); @@ -245,9 +332,11 @@ int Categories::addGlobalCategory( const QString &catname ) return uid; } -/** Removes the category from the application; if it is not found - * in the application, then it attempts to remove it from - * the global list +/*! + + Removes the \a catname from the application group. If it is not + found in the application group and \a checkGlobal is TRUE, then it + attempts to remove it from the global list */ bool Categories::removeCategory( const QString &appname, const QString &catname, @@ -268,6 +357,11 @@ bool Categories::removeCategory( const QString &appname, return removeGlobalCategory( catname ); } + +/*! + Removes the \a uid from the application group \a appname. Returns TRUE + if success, FALSE if not found. +*/ bool Categories::removeCategory( const QString &appname, int uid ) { QMap< QString, CategoryGroup >::Iterator @@ -282,6 +376,10 @@ bool Categories::removeCategory( const QString &appname, int uid ) return FALSE; } +/*! + Removes the global category \a catname. Returns TRUE + if success, FALSE if not found. +*/ bool Categories::removeGlobalCategory( const QString &catname ) { int uid = mGlobalCats.id( catname ); @@ -292,7 +390,10 @@ bool Categories::removeGlobalCategory( const QString &catname ) return FALSE; } - +/*! + Removes the global category \a uid. Returns TRUE + if success, FALSE if not found. +*/ bool Categories::removeGlobalCategory( int uid ) { if ( mGlobalCats.remove( uid ) ) { @@ -302,9 +403,10 @@ bool Categories::removeGlobalCategory( int uid ) return FALSE; } -/** Returns the sorted list of all categories that are associated with - * the app. If includeGlobal parameter is TRUE then the returned - * categories will include the global category items. +/*! + Returns the sorted list of all categories that are associated with + the \a app. If \a includeGlobal is TRUE then the returned + categories will include the global category items. */ QStringList Categories::labels( const QString &app, bool includeGlobal, @@ -316,7 +418,7 @@ QStringList Categories::labels( const QString &app, if ( appIt != mAppCats.end() ) cats += (*appIt).labels(); - else qDebug("Categories::labels didn't find app %s", app.latin1() ); + //else qDebug("Categories::labels didn't find app %s", app.latin1() ); if ( includeGlobal ) cats += mGlobalCats.labels(); @@ -338,6 +440,9 @@ QStringList Categories::labels( const QString &app, return cats; } +/*! + Returns the label associated with the id +*/ QString Categories::label( const QString &app, int id ) const { if ( mGlobalCats.contains( id ) ) @@ -349,10 +454,16 @@ QString Categories::label( const QString &app, int id ) const return (*appIt).label( id ); } -/** Returns a single string associated with the cat ids for display in - * a combobox or any area that requires one string. If catids are empty - * then "Unfiled" will be returned. If multiple categories are assigned - * the first cat id is shown with " (multi)" appended to the string. +/*! + Returns a single string associated with \a catids for display in a + combobox or any area that requires one string. If \a catids are empty + then "Unfiled" will be returned. If multiple categories are + assigned then the behavior depends on the DisplaySingle type. + + If \a display is set to ShowMulti then " (multi)" appended to the + first string. If \a display is set to ShowAll, then a space + seperated string is returned with all categories. If ShowFirst is + set, the just the first string is returned. */ QString Categories::displaySingle( const QString &app, const QArray<int> &catids, @@ -380,6 +491,11 @@ QString Categories::displaySingle( const QString &app, return r; } +/*! + + Returns all ids associated with the application CategoryGroup \a app + and the passed in \a labels in that group. +*/ QArray<int> Categories::ids( const QString &app, const QStringList &labels) const { QArray<int> results; @@ -397,6 +513,11 @@ QArray<int> Categories::ids( const QString &app, const QStringList &labels) cons return results; } +/*! + Returns the id associated with the app. If the id is not found in the + application CategoryGroup, then it searches the global CategoryGroup. + If it is not found it either, 0 is returned. +*/ int Categories::id( const QString &app, const QString &cat ) const { if ( cat == tr("Unfiled") || cat.contains( tr(" (multi.)") ) ) @@ -408,8 +529,13 @@ int Categories::id( const QString &app, const QString &cat ) const } -/** Return TRUE if renaming succeeded; FALSE if app name not found, - * or if there was a name conflict +/*! + Return TRUE if renaming succeeded; FALSE if \a appname or \a oldName + is not found, or if \a newName conflicts with an existing category + in the CategoryGroup. + + It will first search the CategoryGroup associated with \a appname + and if not found it will try to replace in global CategoryGroup. */ bool Categories::renameCategory( const QString &appname, const QString &oldName, @@ -429,6 +555,12 @@ bool Categories::renameCategory( const QString &appname, return renameGlobalCategory( oldName, newName ); } +/*! + Return TRUE if renaming succeeded; FALSE if \a appname or \a oldName + is not found, or if \a newName conflicts with an existing category + in the CategoryGroup. This function will only rename categories found + in the global CategoryGroup. + */ bool Categories::renameGlobalCategory( const QString &oldName, const QString &newName ) { @@ -440,6 +572,10 @@ bool Categories::renameGlobalCategory( const QString &oldName, return FALSE; } +/*! + Changes the grouping of a category. If a category was global and \a global + is set to TRUE, then the \a catname will be moved to the \a appname group. +*/ void Categories::setGlobal( const QString &appname, const QString &catname, bool global ) @@ -458,13 +594,18 @@ void Categories::setGlobal( const QString &appname, addGlobalCategory( catname ); } +/*! + Returns TRUE if the \a catname is in the global CategoryGroup, FALSE if not. +*/ bool Categories::isGlobal( const QString &catname ) const { return mGlobalCats.contains( catname ); } -/** Returns true if the catname is associated with any application +/*! + Returns true if the \a catname is associated with any CategoryGroup, + including global. */ bool Categories::exists( const QString &catname ) const { @@ -478,6 +619,10 @@ bool Categories::exists( const QString &catname ) const return FALSE; } +/*! + Returns TRUE if the \a catname is associated with the \a appname + CategoryGroup, FALSE if not found. + */ bool Categories::exists( const QString &appname, const QString &catname) const { @@ -490,7 +635,12 @@ bool Categories::exists( const QString &appname, return (*appIt).contains( catname ); } +/*! + Saves the Categories database to the \a fname. See categoryFileName() + for the default file name string used for the shared category database. + Returns FALSE if there is error writing the file or TRUE on success. + */ bool Categories::save( const QString &fname ) const { QString strNewFile = fname + ".new"; @@ -534,6 +684,9 @@ bool Categories::save( const QString &fname ) const } f.close(); +#ifdef Q_OS_WIN32 + QFile::remove( fname ); +#endif if ( ::rename( strNewFile.latin1(), fname.latin1() ) < 0 ) { qWarning( "problem renaming file %s to %s", strNewFile.latin1(), fname.latin1()); @@ -544,6 +697,12 @@ bool Categories::save( const QString &fname ) const return TRUE; } +/*! + Loads the Categories database using \a fname. See categoryFileName() + for the default file name string used for the shared category database. + + Returns FALSE if there is error reading the file or TRUE on success. + */ bool Categories::load( const QString &fname ) { QFile file( fname ); @@ -619,12 +778,19 @@ bool Categories::load( const QString &fname ) return TRUE; } +/*! + Clear the categories in memory. Equivelent to creating an empty Categories + object. +*/ void Categories::clear() { mGlobalCats.clear(); mAppCats.clear(); } +/*! + Dump the contents to standard out. Used for debugging only. +*/ void Categories::dump() const { qDebug("\tglobal categories = %s", mGlobalCats.labels().join(", ").latin1() ); @@ -675,3 +841,96 @@ void CheckedListView::setChecked( const QStringList &checked ) else i->setOn( FALSE ); } + +/*! \fn Categories &Categories::operator= ( const Categories &c ) + + Performs deep copy. + */ + + +/*! \fn QStringList Categories::labels( const QString & app, const QArray<int> &catids ) const + + Returns list of labels associated with the application and catids +*/ + +/*! \fn QStringList Categories::globalCategories() const + + Returns list of all global category labels +*/ + +/*! \fn const QMap<QString, CategoryGroup> &Categories::appGroupMap() const + + Returns a map of application names to CategoryGroup. The CategoryGroup + class defines a map of ids to category labels and category labels to ids. +*/ + +/*! \fn const CategoryGroup &Categories::globalGroup() const + + Returns the global CategoryGroup. The CategoryGroup + class defines a map of ids to category labels and category labels to ids. +*/ + +/*! \fn void Categories::categoryAdded( const Categories &cats, const QString &appname, int uid) + + Emitted if a category is added. + + \a cats is a const reference to this object + \a appname is the CategoryGroup application name that the category was added to or QString::null if it was global + \a uid is the unique identifier associated with the added category +*/ + +/*! \fn void Categories::categoryRemoved( const Categories &cats, const QString &appname, + int uid) + + Emitted if removed category is removed. + + \a cats is a const reference to this object + \a appname is the CategoryGroup application name that the category was removed from or QString::null if it was the global CategoryGroup + \a uid is the unique identifier associated with the removed category +*/ + + +/*! \fn void Categories::categoryRenamed( const Categories &cats, const QString &appname, + int uid) + + Emitted if \a uid in the \a appname CategoryGroup is renamed in \a cats + object. + + \a cats is a const reference to this object + \a appname is the CategoryGroup application name that the category was renamed in or QString::null if it was the global CategoryGroup + \a uid is the unique identifier associated with the renamed category +*/ + +/*! \fn Categories::Categories( QObject *parent=0, const char *name = 0 ) + + Constructor for an empty Categories object. +*/ + +/*! \fn Categories::Categories( const Categories ©From ) + + Deep copy constructor +*/ + +/*! \fn Categories::~Categories() + + Empty destructor. Call save() before destruction if there are changes + that need to be saved. +*/ + +/*! \fn CategoryGroup::clear() + \internal +*/ + +/*! \fn const QMap<int, QString> &CategoryGroup::idMap() const + + Returns a const reference to the id to label QMap +*/ + +/*! \fn CategoryGroup::CategoryGroup() + \internal +*/ + +/*! \fn CategoryGroup::CategoryGroup(const CategoryGroup &c) + \internal +*/ + diff --git a/library/backend/contact.cpp b/library/backend/contact.cpp index b10b19a..3f4934a 100644 --- a/library/backend/contact.cpp +++ b/library/backend/contact.cpp @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2001 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software @@ -34,13 +34,32 @@ #include <stdio.h> +/*! + \class Contact contact.h + \brief The Contact class holds the data of an address book entry. + + This data includes information the name of the person, contact + information, and business information such as deparment and job title. + + \ingroup qtopiaemb + \ingroup qtopiadesktop +*/ + Qtopia::UidGen Contact::sUidGen( Qtopia::UidGen::Qtopia ); +/*! + Creates a new, empty contact. +*/ Contact::Contact() : Record(), mMap(), d( 0 ) { } +/*! + \internal + Creates a new contact. The properties of the contact are + set from \a fromMap. +*/ Contact::Contact( const QMap<int, QString> &fromMap ) : Record(), mMap( fromMap ), d( 0 ) { @@ -48,25 +67,384 @@ Contact::Contact( const QMap<int, QString> &fromMap ) : if ( !cats.isEmpty() ) setCategories( idsFromString( cats ) ); QString uidStr = find( Qtopia::AddressUid ); + if ( uidStr.isEmpty() ) setUid( uidGen().generate() ); else setUid( uidStr.toInt() ); + + if ( !uidStr.isEmpty() ) + setUid( uidStr.toInt() ); } +/*! + Destroys a contact. +*/ Contact::~Contact() { } +/*! \fn void Contact::setTitle( const QString &str ) + Sets the title of the contact to \a str. +*/ + +/*! \fn void Contact::setFirstName( const QString &str ) + Sets the first name of the contact to \a str. +*/ + +/*! \fn void Contact::setMiddleName( const QString &str ) + Sets the middle name of the contact to \a str. +*/ + +/*! \fn void Contact::setLastName( const QString &str ) + Sets the last name of the contact to \a str. +*/ + +/*! \fn void Contact::setSuffix( const QString &str ) + Sets the suffix of the contact to \a str. +*/ + +/*! \fn void Contact::setFileAs( const QString &str ) + Sets the contact to filed as \a str. +*/ + +/*! \fn void Contact::setDefaultEmail( const QString &str ) + Sets the default email of the contact to \a str. +*/ + +/*! \fn void Contact::setHomeStreet( const QString &str ) + Sets the home street address of the contact to \a str. +*/ + +/*! \fn void Contact::setHomeCity( const QString &str ) + Sets the home city of the contact to \a str. +*/ + +/*! \fn void Contact::setHomeState( const QString &str ) + Sets the home state of the contact to \a str. +*/ + +/*! \fn void Contact::setHomeZip( const QString &str ) + Sets the home zip code of the contact to \a str. +*/ + +/*! \fn void Contact::setHomeCountry( const QString &str ) + Sets the home country of the contact to \a str. +*/ + +/*! \fn void Contact::setHomePhone( const QString &str ) + Sets the home phone number of the contact to \a str. +*/ + +/*! \fn void Contact::setHomeFax( const QString &str ) + Sets the home fax number of the contact to \a str. +*/ + +/*! \fn void Contact::setHomeMobile( const QString &str ) + Sets the home mobile phone number of the contact to \a str. +*/ + +/*! \fn void Contact::setHomeWebpage( const QString &str ) + Sets the home webpage of the contact to \a str. +*/ + +/*! \fn void Contact::setCompany( const QString &str ) + Sets the company for contact to \a str. +*/ + +/*! \fn void Contact::setJobTitle( const QString &str ) + Sets the job title of the contact to \a str. +*/ + +/*! \fn void Contact::setDepartment( const QString &str ) + Sets the department for contact to \a str. +*/ + +/*! \fn void Contact::setOffice( const QString &str ) + Sets the office for contact to \a str. +*/ + +/*! \fn void Contact::setBusinessStreet( const QString &str ) + Sets the business street address of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessCity( const QString &str ) + Sets the business city of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessState( const QString &str ) + Sets the business state of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessZip( const QString &str ) + Sets the business zip code of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessCountry( const QString &str ) + Sets the business country of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessPhone( const QString &str ) + Sets the business phone number of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessFax( const QString &str ) + Sets the business fax number of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessMobile( const QString &str ) + Sets the business mobile phone number of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessPager( const QString &str ) + Sets the business pager number of the contact to \a str. +*/ + +/*! \fn void Contact::setBusinessWebpage( const QString &str ) + Sets the business webpage of the contact to \a str. +*/ + +/*! \fn void Contact::setProfession( const QString &str ) + Sets the profession of the contact to \a str. +*/ + +/*! \fn void Contact::setAssistant( const QString &str ) + Sets the assistant of the contact to \a str. +*/ + +/*! \fn void Contact::setManager( const QString &str ) + Sets the manager of the contact to \a str. +*/ + +/*! \fn void Contact::setSpouse( const QString &str ) + Sets the spouse of the contact to \a str. +*/ + +/*! \fn void Contact::setGender( const QString &str ) + Sets the gender of the contact to \a str. +*/ + +/*! \fn void Contact::setBirthday( const QString &str ) + Sets the birthday for the contact to \a str. +*/ + +/*! \fn void Contact::setAnniversary( const QString &str ) + Sets the anniversary of the contact to \a str. +*/ + +/*! \fn void Contact::setNickname( const QString &str ) + Sets the nickname of the contact to \a str. +*/ + +/*! \fn void Contact::setNotes( const QString &str ) + Sets the notes about the contact to \a str. +*/ + +/*! \fn QString Contact::title() const + Returns the title of the contact. +*/ + +/*! \fn QString Contact::firstName() const + Returns the first name of the contact. +*/ + +/*! \fn QString Contact::middleName() const + Returns the middle name of the contact. +*/ + +/*! \fn QString Contact::lastName() const + Returns the last name of the contact. +*/ + +/*! \fn QString Contact::suffix() const + Returns the suffix of the contact. +*/ + +/*! \fn QString Contact::fileAs() const + Returns the string the contact is filed as. +*/ + +/*! \fn QString Contact::defaultEmail() const + Returns the default email address of the contact. +*/ + +/*! \fn QString Contact::emails() const + Returns the list of email address for a contact separated by ';'s in a single + string. +*/ + +/*! \fn QString Contact::homeStreet() const + Returns the home street address of the contact. +*/ + +/*! \fn QString Contact::homeCity() const + Returns the home city of the contact. +*/ + +/*! \fn QString Contact::homeState() const + Returns the home state of the contact. +*/ + +/*! \fn QString Contact::homeZip() const + Returns the home zip of the contact. +*/ + +/*! \fn QString Contact::homeCountry() const + Returns the home country of the contact. +*/ + +/*! \fn QString Contact::homePhone() const + Returns the home phone number of the contact. +*/ + +/*! \fn QString Contact::homeFax() const + Returns the home fax number of the contact. +*/ + +/*! \fn QString Contact::homeMobile() const + Returns the home mobile number of the contact. +*/ + +/*! \fn QString Contact::homeWebpage() const + Returns the home webpage of the contact. +*/ + +/*! \fn QString Contact::company() const + Returns the company for the contact. +*/ + +/*! \fn QString Contact::department() const + Returns the department for the contact. +*/ + +/*! \fn QString Contact::office() const + Returns the office for the contact. +*/ + +/*! \fn QString Contact::jobTitle() const + Returns the job title of the contact. +*/ + +/*! \fn QString Contact::profession() const + Returns the profession of the contact. +*/ + +/*! \fn QString Contact::assistant() const + Returns the assistant of the contact. +*/ + +/*! \fn QString Contact::manager() const + Returns the manager of the contact. +*/ + +/*! \fn QString Contact::businessStreet() const + Returns the business street address of the contact. +*/ + +/*! \fn QString Contact::businessCity() const + Returns the business city of the contact. +*/ + +/*! \fn QString Contact::businessState() const + Returns the business state of the contact. +*/ + +/*! \fn QString Contact::businessZip() const + Returns the business zip of the contact. +*/ + +/*! \fn QString Contact::businessCountry() const + Returns the business country of the contact. +*/ + +/*! \fn QString Contact::businessPhone() const + Returns the business phone number of the contact. +*/ + +/*! \fn QString Contact::businessFax() const + Returns the business fax number of the contact. +*/ + +/*! \fn QString Contact::businessMobile() const + Returns the business mobile number of the contact. +*/ + +/*! \fn QString Contact::businessPager() const + Returns the business pager number of the contact. +*/ + +/*! \fn QString Contact::businessWebpage() const + Returns the business webpage of the contact. +*/ + +/*! \fn QString Contact::spouse() const + Returns the spouse of the contact. +*/ + +/*! \fn QString Contact::gender() const + Returns the gender of the contact. +*/ + +/*! \fn QString Contact::birthday() const + Returns the birthday of the contact. +*/ + +/*! \fn QString Contact::anniversary() const + Returns the anniversary of the contact. +*/ + +/*! \fn QString Contact::nickname() const + Returns the nickname of the contact. +*/ + +/*! \fn QString Contact::children() const + Returns the children of the contact. +*/ + +/*! \fn QString Contact::notes() const + Returns the notes relating to the the contact. +*/ + +/*! \fn QString Contact::groups() const + \internal + Returns the groups for the contact. +*/ + +/*! \fn QStringList Contact::groupList() const + \internal +*/ + +/*! \fn QString Contact::field(int) const + \internal +*/ + +/*! \fn void Contact::saveJournal( journal_action, const QString & = QString::null ) + \internal +*/ + +/*! \fn void Contact::setUid( int id ) + \internal + Sets the uid for this record to \a id. +*/ + +/*! \enum Contact::journal_action + \internal +*/ + +/*! + \internal +*/ QMap<int, QString> Contact::toMap() const { QMap<int, QString> map = mMap; - map.insert( Qtopia::AddressCategory, idsToString( categories() )); + QString cats = idsToString( categories() ); + if ( !cats.isEmpty() ) + map.insert( Qtopia::AddressCategory, cats ); return map; } /*! - Returns a rich text formatted QString of the Contact. + Returns a rich text formatted QString representing the contents the contact. */ QString Contact::toRichText() const { @@ -231,6 +609,9 @@ QString Contact::toRichText() const return text; } +/*! + \internal +*/ void Contact::insert( int key, const QString &v ) { QString value = v.stripWhiteSpace(); @@ -240,6 +621,9 @@ void Contact::insert( int key, const QString &v ) mMap.insert( key, value ); } +/*! + \internal +*/ void Contact::replace( int key, const QString & v ) { QString value = v.stripWhiteSpace(); @@ -249,11 +633,17 @@ void Contact::replace( int key, const QString & v ) mMap.replace( key, value ); } +/*! + \internal +*/ QString Contact::find( int key ) const { return mMap[key]; } +/*! + \internal +*/ QString Contact::displayAddress( const QString &street, const QString &city, const QString &state, @@ -276,6 +666,9 @@ QString Contact::displayAddress( const QString &street, return s; } +/*! + \internal +*/ QString Contact::displayBusinessAddress() const { return displayAddress( businessStreet(), businessCity(), @@ -283,6 +676,9 @@ QString Contact::displayBusinessAddress() const businessCountry() ); } +/*! + \internal +*/ QString Contact::displayHomeAddress() const { return displayAddress( homeStreet(), homeCity(), @@ -290,6 +686,9 @@ QString Contact::displayHomeAddress() const homeCountry() ); } +/*! + Returns the full name of the contact +*/ QString Contact::fullName() const { QString title = find( Qtopia::Title ); @@ -322,16 +721,62 @@ QString Contact::fullName() const return name.simplifyWhiteSpace(); } +/*! + Returns a list of the names of the children of the contact. +*/ QStringList Contact::childrenList() const { return QStringList::split( " ", find( Qtopia::Children ) ); } +/*! \fn void Contact::insertEmail( const QString &email ) + + Insert \a email into the email list. Ensures \a email can only be added + once. If there is no default email address set, it sets it to the \a email. +*/ + +/*! \fn void Contact::removeEmail( const QString &email ) + + Removes the \a email from the email list. If the default email was \a email, + then the default email address is assigned to the first email in the + email list +*/ + +/*! \fn void Contact::clearEmails() + + Clears the email list. + */ + +/*! \fn void Contact::insertEmails( const QStringList &emailList ) + + Appends the \a emailList to the exiting email list + */ + +/*! + Returns a list of email addresses belonging to the contact, including + the default email address. +*/ QStringList Contact::emailList() const { - return QStringList::split( ";", find( Qtopia::Emails ) ); + QString emailStr = emails(); + + QStringList r; + if ( !emailStr.isEmpty() ) { + qDebug(" emailstr "); + QStringList l = QStringList::split( emailSeparator(), emailStr ); + for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) + r += (*it).simplifyWhiteSpace(); + } + + return r; } +/*! + \overload + + Generates the string for the contact to be filed as from the first, + middle and last name of the contact. +*/ void Contact::setFileAs() { QString lastName, firstName, middleName, fileas; @@ -353,6 +798,10 @@ void Contact::setFileAs() replace( Qtopia::FileAs, fileas ); } +/*! + \internal + Appends the contact information to \a buf. +*/ void Contact::save( QString &buf ) const { static const QStringList SLFIELDS = fields(); @@ -377,6 +826,10 @@ void Contact::save( QString &buf ) const // You need to close this yourself } +/*! + \internal + Returns the list of fields belonging to a contact +*/ QStringList Contact::fields() { QStringList list; @@ -435,6 +888,10 @@ QStringList Contact::fields() return list; } +/*! + \internal + Returns a translated list of field names for a contact. +*/ QStringList Contact::trfields() { QStringList list; @@ -493,19 +950,29 @@ QStringList Contact::trfields() return list; } -void Contact::setEmails( const QString &v ) +/*! + Sets the list of email address for contact to those contained in \a str. + Email address should be separated by ';'s. +*/ +void Contact::setEmails( const QString &str ) { - replace( Qtopia::Emails, v ); - if ( v.isEmpty() ) + replace( Qtopia::Emails, str ); + if ( str.isEmpty() ) setDefaultEmail( QString::null ); } -void Contact::setChildren( const QString &v ) +/*! + Sets the list of children for the contact to those contained in \a str. +*/ +void Contact::setChildren( const QString &str ) { - replace( Qtopia::Children, v ); + replace( Qtopia::Children, str ); } // vcard conversion code +/*! + \internal +*/ static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) { VObject *ret = 0; @@ -514,6 +981,9 @@ static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QSt return ret; } +/*! + \internal +*/ static inline VObject *safeAddProp( VObject *o, const char *prop) { VObject *ret = 0; @@ -522,6 +992,9 @@ static inline VObject *safeAddProp( VObject *o, const char *prop) return ret; } +/*! + \internal +*/ static VObject *createVObject( const Contact &c ) { VObject *vcard = newVObject( VCCardProp ); @@ -622,12 +1095,13 @@ static VObject *createVObject( const Contact &c ) } +/*! + \internal +*/ static Contact parseVObject( VObject *obj ) { Contact c; - bool haveDefaultEmail = FALSE; - VObjectIterator it; initPropIterator( &it, obj ); while( moreIteration( &it ) ) { @@ -767,14 +1241,7 @@ static Contact parseVObject( VObject *obj ) valid = FALSE; } if ( valid ) { - if ( haveDefaultEmail ) { - QString str = c.emails(); - if ( !str.isEmpty() ) - str += ","+email; - c.setEmails( str ); - } else { - c.setDefaultEmail( email ); - } + c.insertEmail( email ); } } else if ( name == VCURLProp ) { @@ -851,6 +1318,9 @@ static Contact parseVObject( VObject *obj ) return c; } +/*! + Writes the list of \a contacts as a set of VCards to the file \a filename. +*/ void Contact::writeVCard( const QString &filename, const QValueList<Contact> &contacts) { QFileDirect f( filename.utf8().data() ); @@ -868,6 +1338,9 @@ void Contact::writeVCard( const QString &filename, const QValueList<Contact> &co cleanStrTbl(); } +/*! + writes \a contact as a VCard to the file \a filename. +*/ void Contact::writeVCard( const QString &filename, const Contact &contact) { QFileDirect f( filename.utf8().data() ); @@ -883,7 +1356,9 @@ void Contact::writeVCard( const QString &filename, const Contact &contact) cleanStrTbl(); } - +/*! + Returns the set of contacts read as VCards from the file \a filename. +*/ QValueList<Contact> Contact::readVCard( const QString &filename ) { qDebug("trying to open %s, exists=%d", filename.utf8().data(), QFileInfo( filename.utf8().data() ).size() ); @@ -904,11 +1379,20 @@ QValueList<Contact> Contact::readVCard( const QString &filename ) return contacts; } +/*! + Returns TRUE if the contact matches the regular expression \a regexp. + Otherwise returns FALSE. +*/ bool Contact::match( const QString ®exp ) const { return match(QRegExp(regexp)); } +/*! + \overload + Returns TRUE if the contact matches the regular expression \a regexp. + Otherwise returns FALSE. +*/ bool Contact::match( const QRegExp &r ) const { bool match; diff --git a/library/backend/contact.h b/library/backend/contact.h index a74cbbe..4999430 100644 --- a/library/backend/contact.h +++ b/library/backend/contact.h @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2001 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software @@ -21,14 +21,14 @@ #ifndef __CONTACT_H__ #define __CONTACT_H__ -#include <qpe/palmtoprecord.h> -#include <qpe/recordfields.h> +#include <qtopia/private/palmtoprecord.h> +#include <qtopia/private/recordfields.h> #include <qstringlist.h> #if defined(QPC_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class QPC_EXPORT QMap<int, QString>; +QPC_TEMPLATEEXTERN template class QPC_EXPORT QMap<int, QString>; // MOC_SKIP_END #endif @@ -56,9 +56,12 @@ public: void setFileAs(); // default email address - void setDefaultEmail( const QString &v ) { replace( Qtopia::DefaultEmail, v ); } - // the emails should be seperated by a semicolon - void setEmails( const QString &v ); + void setDefaultEmail( const QString &v ); + // inserts email to list and ensure's doesn't already exist + void insertEmail( const QString &v ); + void removeEmail( const QString &v ); + void clearEmails(); + void insertEmails( const QStringList &v ); // home void setHomeStreet( const QString &v ) { replace( Qtopia::HomeStreet, v ); } @@ -123,7 +126,6 @@ public: // email QString defaultEmail() const { return find( Qtopia::DefaultEmail ); } - QString emails() const { return find( Qtopia::Emails ); } QStringList emailList() const; // home @@ -202,7 +204,16 @@ public: { Record::setUid(i); replace( Qtopia::AddressUid , QString::number(i)); } private: + friend class AbEditor; friend class AbTable; + friend class AddressBookAccessPrivate; + friend class XMLIO; + + QString emailSeparator() const { return " "; } + // the emails should be seperated by a comma + void setEmails( const QString &v ); + QString emails() const { return find( Qtopia::Emails ); } + void insert( int key, const QString &value ); void replace( int key, const QString &value ); QString find( int key ) const; @@ -219,4 +230,77 @@ private: ContactPrivate *d; }; +// these methods are inlined to keep binary compatability with Qtopia 1.5 +inline void Contact::insertEmail( const QString &v ) +{ + //qDebug("insertEmail %s", v.latin1()); + QString e = v.simplifyWhiteSpace(); + QString def = defaultEmail(); + + // if no default, set it as the default email and don't insert + if ( def.isEmpty() ) { + setDefaultEmail( e ); // will insert into the list for us + return; + } + + // otherwise, insert assuming doesn't already exist + QString emailsStr = find( Qtopia::Emails ); + if ( emailsStr.contains( e )) + return; + if ( !emailsStr.isEmpty() ) + emailsStr += emailSeparator(); + emailsStr += e; + replace( Qtopia::Emails, emailsStr ); +} + +inline void Contact::removeEmail( const QString &v ) +{ + QString e = v.simplifyWhiteSpace(); + QString def = defaultEmail(); + QString emailsStr = find( Qtopia::Emails ); + QStringList emails = emailList(); + + // otherwise, must first contain it + if ( !emailsStr.contains( e ) ) + return; + + // remove it + //qDebug(" removing email from list %s", e.latin1()); + emails.remove( e ); + // reset the string + emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator + replace( Qtopia::Emails, emailsStr ); + + // if default, then replace the default email with the first one + if ( def == e ) { + //qDebug("removeEmail is default; setting new default"); + if ( !emails.count() ) + clearEmails(); + else // setDefaultEmail will remove e from the list + setDefaultEmail( emails.first() ); + } +} +inline void Contact::clearEmails() +{ + mMap.remove( Qtopia::DefaultEmail ); + mMap.remove( Qtopia::Emails ); +} +inline void Contact::setDefaultEmail( const QString &v ) +{ + QString e = v.simplifyWhiteSpace(); + + //qDebug("Contact::setDefaultEmail %s", e.latin1()); + replace( Qtopia::DefaultEmail, e ); + + if ( !e.isEmpty() ) + insertEmail( e ); + +} + +inline void Contact::insertEmails( const QStringList &v ) +{ + for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it ) + insertEmail( *it ); +} + #endif diff --git a/library/backend/event.cpp b/library/backend/event.cpp index 50a663d..7110717 100644 --- a/library/backend/event.cpp +++ b/library/backend/event.cpp @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2001 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software @@ -20,9 +20,9 @@ #include "event.h"
#include "qfiledirect_p.h" -#include <qpe/timeconversion.h> -#include <qpe/stringutil.h> -#include <qpe/recordfields.h> +#include <qtopia/timeconversion.h> +#include <qtopia/stringutil.h> +#include <qtopia/private/recordfields.h> #include <qbuffer.h> #include <time.h> #include "vobject_p.h" @@ -71,6 +71,255 @@ static void write( QString& buf, const Event::RepeatPattern &r ) Qtopia::UidGen Event::sUidGen( Qtopia::UidGen::Qtopia ); +/*! + \class Event event.h + \brief The Event class holds the data of a calendar event. + + This data includes descriptive data of the event and schedualing information. + + \ingroup qtopiaemb + \ingroup qtopiadesktop +*/ + +/*! + \class Event::RepeatPattern + \class The Event::RepeatPattern class is internal. + \internal +*/ + +/*! + \enum Event::Days + \internal +*/ + +/*! + \enum Event::Type + \internal +*/ + +/*! + \enum Event::SoundTypeChoice + + This enum type defines what kind of sound is made when an alarm occurs + for an event. The currently defined types are: + + <ul> + <li>\c Silent - No sound is produced. + <li>\c Loud - A loud sound is produced. + </ul> +*/ + +/*! + \fn bool Event::operator<( const Event & ) const + \internal +*/ + +/*! + \fn bool Event::operator<=( const Event & ) const + \internal +*/ + +/*! + \fn bool Event::operator!=( const Event & ) const + \internal +*/ + +/*! + \fn bool Event::operator>( const Event & ) const + \internal +*/ + +/*! + \fn bool Event::operator>=( const Event & ) const + \internal +*/ + +/*! + \enum Event::RepeatType + + This enum defines how a event will repeat, if at all. + + <ul> + <li>\c NoRepeat - Event does not repeat. + <li>\c Daily - Event occurs every n days. + <li>\c Weekly - Event occurs every n weeks. + <li>\c MonthlyDay - Event occurs every n months. Event will always occur in + the same week and same day of week as the first event. + <li>\c MonthlyDate - Event occurs every n months. Event will always occur + on the same day of the month as the first event. + <li>\c Yearly - Event occurs every n years. + </ul> +*/ + +/*! + \fn bool Event::isAllDay() const + + Returns TRUE if the event is an all day event. Otherwise returns FALSE. +*/ + +/*! + \fn void Event::setAllDay(bool allday) + + If \a allday is TRUE, will set the event to be an all day event. + Otherwise sets the event to not be an all day event. + + \warning This function may affect the start and end times of the event. +*/ + +/*! + \fn QDateTime Event::start() const + + Returns the start date and time of the first occurance of the event. +*/ + +/*! + \fn QDateTime Event::end() const + + Returns the end date and time of the first occurance of the event. +*/ + +/*! + \fn time_t Event::startTime() const + \internal +*/ + +/*! + \fn time_t Event::endTime() const + \internal +*/ + +/*! + \fn void Event::setAlarm(int delay, SoundTypeChoice s) + + Sets the alarm delay of the event to \a delay and the sound type of the + alarm to \a s. +*/ + +/*! + \fn void Event::clearAlarm() + + Clears the alarm for the event. +*/ + +/*! + \fn int Event::alarmDelay() const + + Returns the delay in minutes between the alarm for an event and the + start of the event. +*/ + +/*! + \fn Event::RepeatType Event::repeatType() const + + Returns the repeat pattern type for the event. + + \sa frequency() +*/ + +/*! + \fn int Event::weekOffset() const + + Returns the number of weeks from the start of the month that this event + occurs. +*/ + +/*! + \fn QDate Event::repeatTill() const + + Returns the date that the event will continue to repeat until. If the event + repeats forever the value returned is undefined. + + \sa repeatForever() +*/ + +/*! + \fn bool Event::repeatForever() const + + Returns FALSE if there is a date set for the event to continue until. + Otherwise returns TRUE. +*/ + +/*! + \fn bool Event::doRepeat() const + \internal +*/ + +/*! + \fn bool Event::repeatOnWeekDay(int day) const + + Returns TRUE if the event has a RepeatType of Weekly and is set to occur on + \a day each week. Otherwise returns FALSE. + + \sa QDate::dayName() +*/ + +/*! + \fn void Event::setRepeatOnWeekDay(int day, bool enable) + + If \a enable is TRUE then sets the event to occur on \a day each week. + Otherwise sets the event not to occur on \a day. + + \warning this function is only relavent for a event with RepeatType of + Weekly. + + \sa QDate::dayName() +*/ + +/*! + \fn int Event::frequency() const + + Returns how often the event repeats. + + \sa repeatType() +*/ + +/*! + \fn void Event::setRepeatType(RepeatType t) + + Sets the repeat pattern type of the event to \a t. + + \sa setFrequency() +*/ + +/*! + \fn void Event::setFrequency(int n) + + Sets how often the event occurs with in its repeat pattern. + + \sa setRepeatType() +*/ + +/*! + \fn void Event::setRepeatTill(const QDate &d) + + Sets the event to repeat until \a d. +*/ + +/*! + \fn void Event::setRepeatForever(bool enable) + + If \a enable is TRUE, sets the event to repeat forever. Otherwise + sets the event to stop repeating at some date. + + \warning This function may affect the specific date the event will repeat + till. +*/ + +/*! + \fn bool Event::match(const QRegExp &r) const + + Returns TRUE if the event matches the regular expression \a r. + Otherwise returns FALSE. +*/ + +/*! + \fn char Event::day(int) + \internal +*/ + +/*! + Creates a new, empty event. +*/ Event::Event() : Record() { startUTC = endUTC = time( 0 ); @@ -83,6 +332,9 @@ Event::Event() : Record() pattern.frequency = -1; } +/*! + \internal +*/ Event::Event( const QMap<int, QString> &map ) { setDescription( map[DatebookDescription] ); @@ -106,10 +358,16 @@ Event::Event( const QMap<int, QString> &map ) setUid( map[ DatebookUid ].toInt() ); } +/*! + Destroys an event. +*/ Event::~Event() { } +/*! + \internal +*/ int Event::week( const QDate& date ) { // Calculates the week this date is in within that @@ -124,6 +382,9 @@ int Event::week( const QDate& date ) return week; } +/*! + \internal +*/ int Event::occurrence( const QDate& date ) { // calculates the number of occurrances of this day of the @@ -131,6 +392,9 @@ int Event::occurrence( const QDate& date ) return ( date.day() - 1 ) / 7 + 1; } +/*! + \internal +*/ int Event::dayOfWeek( char day ) { int dayOfWeek = 1; @@ -142,20 +406,33 @@ int Event::dayOfWeek( char day ) return dayOfWeek; } +/*! + \internal +*/ int Event::monthDiff( const QDate& first, const QDate& second ) { return ( second.year() - first.year() ) * 12 + second.month() - first.month(); } +/*! + \internal +*/ QMap<int, QString> Event::toMap() const { QMap<int, QString> m; + + if ( !description().isEmpty() ) m.insert( DatebookDescription, description() ); + if ( !location().isEmpty() ) m.insert ( Location, location() ); + if ( categories().count() ) m.insert ( DatebookCategory, idsToString( categories() ) ); + if ( !timeZone().isEmpty() ) m.insert ( TimeZone, timeZone() ); + if ( !notes().isEmpty() ) m.insert ( Note, notes() ); + m.insert ( StartDateTime, QString::number( TimeConversion::toUTC( start() ) ) ); m.insert ( EndDateTime, QString::number( TimeConversion::toUTC( end() ) ) ); m.insert ( DatebookType, QString::number( (int)type() ) ); @@ -174,16 +451,25 @@ QMap<int, QString> Event::toMap() const return m; } +/*! + \internal +*/ void Event::setRepeat( const RepeatPattern &p ) { setRepeat( p.type != NoRepeat, p ); } +/*! + Sets the description of the event to \a s. +*/ void Event::setDescription( const QString &s ) { descript = s; } +/*! + Sets the location of the event to \a s. +*/ void Event::setLocation( const QString &s ) { locat = s; @@ -194,36 +480,59 @@ void Event::setLocation( const QString &s ) // categ = s; // } +/*! + \internal +*/ void Event::setType( Type t ) { typ = t; } +/*! + Sets the start date and time of the first or only occurance of this event + to the date and time \a d. \a d should be in local time. +*/ void Event::setStart( const QDateTime &d ) { startUTC = TimeConversion::toUTC( d ); } +/*! + \internal +*/ void Event::setStart( time_t time ) { startUTC = time; } +/*! + Sets the end date and time of the first or only occurance of this event + to the date and time \a d. \a d should be in local time. +*/ void Event::setEnd( const QDateTime &d ) { endUTC = TimeConversion::toUTC( d ); } +/*! + \internal +*/ void Event::setEnd( time_t time ) { endUTC = time; } +/*! + \internal +*/ void Event::setTimeZone( const QString &z ) { tz = z; } +/*! + \internal +*/ void Event::setAlarm( bool b, int minutes, SoundTypeChoice s ) { hAlarm = b; @@ -231,22 +540,34 @@ void Event::setAlarm( bool b, int minutes, SoundTypeChoice s ) aSound = s; } +/*! + \internal +*/ void Event::setRepeat( bool b, const RepeatPattern &p ) { hRepeat = b; pattern = p; } +/*! + Sets the notes for the event to \a n. +*/ void Event::setNotes( const QString &n ) { note = n; } +/*! + Returns the description of the event. +*/ const QString &Event::description() const { return descript; } +/*! + Returns the location of the event. +*/ const QString &Event::location() const { return locat; @@ -257,11 +578,17 @@ const QString &Event::location() const // return categ; // } +/*! + \internal +*/ Event::Type Event::type() const { return typ; } +/*! + \internal +*/ QDateTime Event::start( bool actual ) const { QDateTime dt = (startUTC > 0) ? TimeConversion::fromUTC( startUTC ) : QDateTime::currentDateTime(); @@ -274,6 +601,9 @@ QDateTime Event::start( bool actual ) const return dt; } +/*! + \internal +*/ QDateTime Event::end( bool actual ) const { QDateTime dt = (endUTC > 0) ? TimeConversion::fromUTC( endUTC ) : QDateTime::currentDateTime(); @@ -286,48 +616,77 @@ QDateTime Event::end( bool actual ) const return dt; } +/*! + \internal +*/ const QString &Event::timeZone() const { return tz; } +/*! + \internal +*/ bool Event::hasAlarm() const { return hAlarm; } +/*! + \internal +*/ int Event::alarmTime() const { return aMinutes; } +/*! + Returns the sound type for the alarm of this event. +*/ Event::SoundTypeChoice Event::alarmSound() const { return aSound; } +/*! + \internal +*/ bool Event::hasRepeat() const { return doRepeat(); } +/*! + \internal +*/ const Event::RepeatPattern &Event::repeatPattern() const { return pattern; } +/*! + \internal +*/ Event::RepeatPattern &Event::repeatPattern() { return pattern; } +/*! + Returns the notes for the event. +*/ const QString &Event::notes() const { return note; } +/*! + \internal +*/ bool Event::operator==( const Event &e ) const { + if ( uid() && e.uid() == uid() ) + return TRUE; return ( e.descript == descript && e.locat == locat && e.categ == categ && @@ -343,6 +702,10 @@ bool Event::operator==( const Event &e ) const e.note == note ); } +/*! + \internal + Appends the contact information to \a buf. +*/ void Event::save( QString& buf ) { buf += " description=\"" + Qtopia::escapeString(descript) + "\""; @@ -378,6 +741,9 @@ void Event::save( QString& buf ) buf += customToXml(); } +/*! + \internal +*/ bool Event::RepeatPattern::operator==( const Event::RepeatPattern &right ) const { // *sigh* @@ -390,6 +756,28 @@ bool Event::RepeatPattern::operator==( const Event::RepeatPattern &right ) const && createTime == right.createTime ); } +/*! + \class EffectiveEvent + \brief The EffectiveEvent class the data for a single occurance of an event. + + This class describes the event for a single occurance of it. For example if + an Event occurs every week, the effective event might represent the third + occurance of this Event. + + \ingroup qtopiaemb + \ingroup qtopiadesktop + \warning This class will be phased out in Qtopia 3.x +*/ + +/*! + \enum EffectiveEvent::Position + \internal +*/ + +/*! + \fn EffectiveEvent &EffectiveEvent::operator=(const EffectiveEvent &) + \internal +*/ class EffectiveEventPrivate { @@ -400,7 +788,9 @@ public: QDate endDate; }; - +/*! + \internal +*/ EffectiveEvent::EffectiveEvent() { mDate = QDate::currentDate(); @@ -408,6 +798,9 @@ EffectiveEvent::EffectiveEvent() d = 0; } +/*! + \internal +*/ EffectiveEvent::EffectiveEvent( const Event &e, const QDate &date, Position pos ) { mEvent = e; @@ -424,11 +817,17 @@ EffectiveEvent::EffectiveEvent( const Event &e, const QDate &date, Position pos d = 0; } +/*! + \internal +*/ EffectiveEvent::~EffectiveEvent() { delete d; } +/*! + \internal +*/ EffectiveEvent::EffectiveEvent( const EffectiveEvent &e ) { d = 0; @@ -461,67 +860,106 @@ EffectiveEvent& EffectiveEvent::operator=( const EffectiveEvent & e ) // return mEvent.category(); // } +/*! + Returns the description of the event for this effective event. +*/ const QString &EffectiveEvent::description( ) const { return mEvent.description(); } +/*! +\internal +*/ const QString &EffectiveEvent::location( ) const { return mEvent.location(); } +/*! +\internal +*/ const QString &EffectiveEvent::notes() const { return mEvent.notes(); } +/*! + Returns the event associated with this effective event. +*/ const Event &EffectiveEvent::event() const { return mEvent; } +/*! + \internal +*/ const QTime &EffectiveEvent::end() const { return mEnd; } +/*! + \internal +*/ const QTime &EffectiveEvent::start() const { return mStart; } +/*! + Returns the date the effective event occurs on. +*/ const QDate &EffectiveEvent::date() const { return mDate; } +/*! + \internal +*/ int EffectiveEvent::length() const { return (mEnd.hour() * 60 - mStart.hour() * 60) + QABS(mStart.minute() - mEnd.minute() ); } +/*! + \internal +*/ void EffectiveEvent::setDate( const QDate &dt ) { mDate = dt; } +/*! + \internal +*/ void EffectiveEvent::setStart( const QTime &start ) { mStart = start; } +/*! + \internal +*/ void EffectiveEvent::setEnd( const QTime &end ) { mEnd = end; } +/*! + \internal +*/ void EffectiveEvent::setEvent( Event e ) { mEvent = e; } +/*! + \internal +*/ bool EffectiveEvent::operator<( const EffectiveEvent &e ) const { if ( mDate < e.date() ) @@ -532,11 +970,17 @@ bool EffectiveEvent::operator<( const EffectiveEvent &e ) const return FALSE; } +/*! + \internal +*/ bool EffectiveEvent::operator<=( const EffectiveEvent &e ) const { return (mDate <= e.date() ); } +/*! + \internal +*/ bool EffectiveEvent::operator==( const EffectiveEvent &e ) const { return ( mDate == e.date() @@ -545,21 +989,33 @@ bool EffectiveEvent::operator==( const EffectiveEvent &e ) const && mEvent == e.event() ); } +/*! + \internal +*/ bool EffectiveEvent::operator!=( const EffectiveEvent &e ) const { return !(*this == e); } +/*! + \internal +*/ bool EffectiveEvent::operator>( const EffectiveEvent &e ) const { return !(*this <= e ); } +/*! + \internal +*/ bool EffectiveEvent::operator>=(const EffectiveEvent &e) const { return !(*this < e); } +/*! + \internal +*/ void EffectiveEvent::setEffectiveDates( const QDate &from, const QDate &to ) { if ( !from.isValid() ) { @@ -573,6 +1029,9 @@ void EffectiveEvent::setEffectiveDates( const QDate &from, const QDate &to ) d->endDate = to; } +/*! + \internal +*/ QDate EffectiveEvent::startDate() const { if ( d ) @@ -583,6 +1042,9 @@ QDate EffectiveEvent::startDate() const return mEvent.start().date(); } +/*! + \internal +*/ QDate EffectiveEvent::endDate() const { if ( d ) @@ -593,6 +1055,9 @@ QDate EffectiveEvent::endDate() const return mEvent.end().date(); } +/*! + \internal +*/ int EffectiveEvent::size() const { return ( mEnd.hour() - mStart.hour() ) * 3600 @@ -740,15 +1205,23 @@ static Event parseVObject( VObject *obj ) } - +/*! + Writes the list of \a events as a set of VCards to the file \a filename. +*/ void Event::writeVCalendar( const QString &filename, const QValueList<Event> &events) {
+ QFileDirect f( filename.utf8().data() );
+ if ( !f.open( IO_WriteOnly ) ) {
+ qWarning("Unable to open vcard write");
+ return;
+ }
+ QValueList<Event>::ConstIterator it; for( it = events.begin(); it != events.end(); ++it ) { VObject *obj = createVObject( *it ); @@ -756,17 +1229,27 @@ void Event::writeVCalendar( const QString &filename, const QValueList<Event> &ev cleanVObject( obj ); }
+ cleanStrTbl(); } +/*! + Writes \a event as a VCard to the file \a filename. +*/ void Event::writeVCalendar( const QString &filename, const Event &event) {
+ QFileDirect f( filename.utf8().data() );
+ if ( !f.open( IO_WriteOnly ) ) {
+ qWarning("Unable to open vcard write");
+ return;
+ }
+ VObject *obj = createVObject( event ); writeVObject( f.directHandle() , obj ); cleanVObject( obj ); @@ -774,7 +1257,9 @@ void Event::writeVCalendar( const QString &filename, const Event &event) cleanStrTbl(); } - +/*! + Returns the set of events read as VCards from the file \a filename. +*/ QValueList<Event> Event::readVCalendar( const QString &filename ) { VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); diff --git a/library/backend/event.h b/library/backend/event.h index 277aadd..7fe41a5 100644 --- a/library/backend/event.h +++ b/library/backend/event.h @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2001 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software @@ -23,22 +23,31 @@ #include <qdatetime.h> #include <qvaluelist.h> +#include <qcolor.h> #ifdef PALMTOPCENTER #include <qpc/qsorter.h> #endif -#include <qpe/palmtoprecord.h> +#include <qtopia/private/palmtoprecord.h> #include <qpe/timeconversion.h> +static const QColor colorNormal = QColor(255, 0 , 0 ); +static const QColor colorRepeat = QColor(0 , 0 , 255); +static const QColor colorNormalLight = QColor(255, 220, 220); +static const QColor colorRepeatLight = QColor(200, 200, 255); + class EventPrivate; class QPC_EXPORT Event : public Qtopia::Record { public: enum RepeatType { NoRepeat = -1, Daily, Weekly, MonthlyDay, MonthlyDate, Yearly }; + + // Don't use this. enum Days { MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08, FRI = 0x10, SAT = 0x20, SUN = 0x40 }; + // Don't use this. struct QPC_EXPORT RepeatPattern { RepeatPattern() { @@ -70,6 +79,7 @@ public: enum Type { Normal, AllDay }; enum SoundTypeChoice { Silent, Loud }; + // Don't use these, there are essentially meaningless. bool operator<( const Event &e1) const { return start() < e1.start(); }; bool operator<=( const Event &e1 ) const { return start() <= e1.start(); }; bool operator!=( const Event &e1 ) const { return !( *this == e1 ); }; @@ -83,34 +93,63 @@ public: void setLocation( const QString &s ); const QString &location() const; - void setType( Type t ); - Type type() const; + void setNotes( const QString &n ); + const QString ¬es() const; + + void setType( Type t ); // Don't use me. + Type type() const; // Don't use me. + + void setAllDay(bool); + bool isAllDay() const; + void setStart( const QDateTime &d ); - void setStart( time_t time ); - QDateTime start( bool actual = FALSE ) const; - time_t startTime() const { return startUTC; } + void setStart( time_t time ); // don't use me. + QDateTime start( ) const; + QDateTime start( bool actual ) const; // don't use me. + time_t startTime() const { return startUTC; } // don't use me. void setEnd( const QDateTime &e ); - void setEnd( time_t time ); - QDateTime end( bool actual = FALSE ) const; - time_t endTime() const { return endUTC; } + void setEnd( time_t time ); // don't use me + QDateTime end( ) const; + QDateTime end( bool actual ) const; // don't use me. + time_t endTime() const { return endUTC; } // don't use me. void setTimeZone( const QString & ); const QString &timeZone() const; - void setAlarm( bool b, int minutes, SoundTypeChoice ); + void setAlarm( int minutes, SoundTypeChoice ); + void clearAlarm(); + void setAlarm( bool b, int minutes, SoundTypeChoice ); // Don't use me. bool hasAlarm() const; - int alarmTime() const; + int alarmDelay() const; + int alarmTime() const; // Don't use me. SoundTypeChoice alarmSound() const; + + RepeatType repeatType() const; + int frequency() const; + int weekOffset() const; + QDate repeatTill() const; + bool repeatForever() const; + bool repeatOnWeekDay(int day) const; + + void setRepeatType(RepeatType); + void setFrequency(int); + void setRepeatTill(const QDate &); + void setRepeatForever(bool); + void setRepeatOnWeekDay(int day, bool enable); + + // Don't use any of these. void setRepeat( bool b, const RepeatPattern &p ); void setRepeat( const RepeatPattern &p ); bool hasRepeat() const; const RepeatPattern &repeatPattern() const; RepeatPattern &repeatPattern(); - void setNotes( const QString &n ); - const QString ¬es() const; bool doRepeat() const { return pattern.type != NoRepeat; } void save( QString& buf ); //void load( Node *n ); + bool match( const QRegExp &r ) const; + + // Don't use these either. Functionality will be moved elsewhere. + // helper function to calculate the week of the given date static int week( const QDate& date ); // calculates the number of occurrences of the week day of @@ -123,7 +162,6 @@ public: static int dayOfWeek( char day ); // returns the difference of months from first to second. static int monthDiff( const QDate& first, const QDate& second ); - bool match( const QRegExp &r ) const; private: Qtopia::UidGen &uidGen() { return sUidGen; } @@ -211,6 +249,109 @@ private: }; +inline void Event::setAlarm( int minutes, SoundTypeChoice s ) +{ + setAlarm(TRUE, minutes, s); +} + +inline void Event::clearAlarm() +{ + setAlarm(FALSE, 0, Silent); +} + +inline int Event::alarmDelay() const +{ + return alarmTime(); +} + +inline void Event::setAllDay(bool enable) +{ + if (enable) + setType(AllDay); + else + setType(Normal); +}; + +inline bool Event::isAllDay() const +{ + return type() == AllDay; +} + +inline Event::RepeatType Event::repeatType() const +{ + return repeatPattern().type; +} + +inline int Event::frequency() const +{ + return repeatPattern().frequency; +} + +inline int Event::weekOffset() const +{ + if (start().date().day() == 1) + return 1; + return (start().date().day() - 1) / 7 + 1; +} + +inline QDate Event::repeatTill() const +{ + return repeatPattern().endDate(); +} + +inline bool Event::repeatForever() const +{ + return !repeatPattern().hasEndDate; +} + +inline void Event::setRepeatType(RepeatType t) +{ + pattern.type = t; +} + +inline void Event::setFrequency(int f) +{ + pattern.frequency = f; +} + +inline void Event::setRepeatTill(const QDate &d) +{ + pattern.setEndDate(d); + pattern.hasEndDate = TRUE; +} + +inline void Event::setRepeatForever(bool b) +{ + if (!b == pattern.hasEndDate) + return; + if (!b && !pattern.hasEndDate) + pattern.setEndDate(end().date()); + pattern.hasEndDate = !b; +} + +inline bool Event::repeatOnWeekDay(int day) const +{ + if (pattern.type != Weekly) + return FALSE; + return ( (1 << (day - 1)) & pattern.days ) != 0; +} + +inline void Event::setRepeatOnWeekDay(int day, bool enable) +{ + if ( repeatOnWeekDay( day ) != enable ) + pattern.days ^= 1 << (day - 1); +} + +inline QDateTime Event::start( ) const +{ + return start(FALSE); +} + +inline QDateTime Event::end( ) const +{ + return end(FALSE); +} + #ifdef PALMTOPCENTER class QPC_EXPORT EffectiveEventSizeSorter : public QSorter<EffectiveEvent> { diff --git a/library/backend/palmtoprecord.cpp b/library/backend/palmtoprecord.cpp index 0d57699..3cfa874 100644 --- a/library/backend/palmtoprecord.cpp +++ b/library/backend/palmtoprecord.cpp @@ -1,16 +1,15 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included -** in the packaging of this file. +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. ** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING -** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A -** PARTICULAR PURPOSE. +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** @@ -18,12 +17,24 @@ ** not clear to you. ** **********************************************************************/ -#include "palmtoprecord.h" -#include "stringutil.h" +#include <qtopia/private/palmtoprecord.h> +#include <qtopia/stringutil.h> #include <qstringlist.h> +/*! \class Qtopia::PalmtopRecord palmtoprecord.h + \brief The Qtopia::PalmtopRecord class is the base class for all PIM records. + + Provides unique id and category support for all PIM records. + + \ingroup qtopiaemb + \ingroup qtopiadesktop +*/ + + namespace Qtopia { + + Record &Record::operator=( const Record &c ) { mUid = c.mUid; @@ -41,8 +52,11 @@ void Record::setCategories( int single ) } // convenience methods provided for loading and saving to xml -QString Record::idsToString( const QArray<int> &cats ) +QString Record::idsToString( const QArray<int> &catsUnsorted ) { + QArray<int> cats = catsUnsorted; + cats.sort(); + QString str; for ( uint i = 0; i < cats.size(); i++ ) if ( i == 0 ) @@ -84,13 +98,13 @@ QString Record::customField( const QString &key) const */ void Record::setCustomField( const QString &key, const QString &value) { - qWarning("setting custom " + key + " to " + value); +// qWarning("setting custom " + key + " to " + value); if (customMap.contains(key)) customMap.replace(key, value); else customMap.insert(key, value); - qWarning(QString("custom size %1").arg(customMap.count())); +// qWarning(QString("custom size %1").arg(customMap.count())); } /*! @@ -107,7 +121,7 @@ QString Record::customToXml() const QString buf(" "); for ( QMap<QString, QString>::ConstIterator cit = customMap.begin(); cit != customMap.end(); ++cit) { - qWarning(".ITEM."); +// qWarning(".ITEM."); buf += cit.key(); buf += "=\""; buf += escapeString(cit.data()); diff --git a/library/backend/palmtoprecord.h b/library/backend/palmtoprecord.h index 0372011..72f7d1c 100644 --- a/library/backend/palmtoprecord.h +++ b/library/backend/palmtoprecord.h @@ -1,16 +1,15 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included -** in the packaging of this file. +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. ** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING -** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A -** PARTICULAR PURPOSE. +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** @@ -18,10 +17,8 @@ ** not clear to you. ** **********************************************************************/ - #ifndef QTPALMTOP_RECORD_H #define QTPALMTOP_RECORD_H - #include <qglobal.h> #include "qpcglobal.h" #include "palmtopuidgen.h" @@ -30,7 +27,7 @@ #if defined(QPC_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class QPC_EXPORT QMap<QString, QString>; +QPC_TEMPLATEEXTERN template class QPC_EXPORT QMap<QString, QString>; // MOC_SKIP_END #endif @@ -49,10 +46,17 @@ public: virtual bool match( const QRegExp & ) const { return FALSE; } - void setCategories( const QArray<int> &v ) { mCats = v; } + void setCategories( const QArray<int> &v ) { mCats = v; mCats.sort(); } void setCategories( int single ); const QArray<int> &categories() const { return mCats; } + void reassignCategoryId( int oldId, int newId ) + { + int index = mCats.find( oldId ); + if ( index >= 0 ) + mCats[index] = newId; + } + int uid() const { return mUid; }; virtual void setUid( int i ) { mUid = i; uidGen().store( mUid ); } bool isValidUid() const { return mUid != 0; } @@ -77,18 +81,15 @@ public: protected: virtual UidGen &uidGen() = 0; - virtual QString customToXml() const; - private: int mUid; QArray<int> mCats; - QMap<QString, QString> customMap; - RecordPrivate *d; }; } #endif + diff --git a/library/backend/palmtopuidgen.h b/library/backend/palmtopuidgen.h index 1a16681..c3fbcb9 100644 --- a/library/backend/palmtopuidgen.h +++ b/library/backend/palmtopuidgen.h @@ -1,33 +1,33 @@ -#ifndef QTPALMTOP_UIDGEN_H -#define QTPALMTOP_UIDGEN_H /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** -** Licensees holding valid Qtopia Developer license may use this -** file in accordance with the Qtopia Developer License Agreement -** provided with the Software. +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. ** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING -** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE. +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** -** email sales@trolltech.com for information about Qtopia License -** Agreements. +** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ +#ifndef QTPALMTOP_UIDGEN_H +#define QTPALMTOP_UIDGEN_H + #include <time.h> #include <qmap.h> #include "qpcglobal.h" #if defined(QPC_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class QPC_EXPORT QMap< int, bool >; +QPC_TEMPLATEEXTERN template class QPC_EXPORT QMap< int, bool >; // MOC_SKIP_END #endif diff --git a/library/backend/qfiledirect_p.h b/library/backend/qfiledirect_p.h index 3ade622..976c69f 100644 --- a/library/backend/qfiledirect_p.h +++ b/library/backend/qfiledirect_p.h @@ -1,18 +1,17 @@ /**********************************************************************
-** Copyright (C) 2001 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. **
** This file is part of the Qtopia Environment.
**
-** Licensees holding valid Qtopia Developer license may use this
-** file in accordance with the Qtopia Developer License Agreement
-** provided with the Software.
+** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. **
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
-** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-** PURPOSE.
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. **
-** email sales@trolltech.com for information about Qtopia License
-** Agreements.
+** See http://www.trolltech.com/gpl/ for GPL licensing information. **
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
@@ -22,7 +21,7 @@ #ifndef QFILE_DIRECT_H
#define QFILE_DIRECT_H
#include <qfile.h>
-#include <qpe/qpcglobal.h>
+#include <qtopia/private/qpcglobal.h> class QPC_EXPORT QFileDirect : public QFile
{
@@ -34,4 +33,3 @@ public: };
#endif
-
diff --git a/library/backend/qpcglobal.h b/library/backend/qpcglobal.h index 0d60272..7b71f06 100644 --- a/library/backend/qpcglobal.h +++ b/library/backend/qpcglobal.h @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** Licensees holding valid Qtopia Developer license may use this ** file in accordance with the Qtopia Developer License Agreement @@ -22,8 +22,9 @@ #ifndef QPC_GLOBAL_H #define QPC_GLOBAL_H -#if ( defined(Q_OS_WIN32) || defined(Q_OS_WIN64) ) && defined(PALMTOPCENTER) #include <qglobal.h> + +#if ( defined(Q_OS_WIN32) || defined(Q_OS_WIN64) ) && defined(PALMTOPCENTER) // # if defined(QT_NODLL) //# undef QPC_MAKEDLL //# undef QPC_DLL @@ -32,10 +33,12 @@ # undef QPC_DLL # endif # define QPC_EXPORT __declspec(dllexport) +# define QPC_TEMPLATEEXTERN # define QPC_TEMPLATEDLL # undef QPC_DISABLE_COPY /* avoid unresolved externals */ # elif defined(QPC_DLL) /* use a Qt DLL library */ # define QPC_EXPORT __declspec(dllimport) +# define QPC_TEMPLATEEXTERN extern # define QPC_TEMPLATEDLL # undef QPC_DISABLE_COPY /* avoid unresolved externals */ # endif diff --git a/library/backend/recordfields.h b/library/backend/recordfields.h index 4196c8b..1167ed3 100644 --- a/library/backend/recordfields.h +++ b/library/backend/recordfields.h @@ -1,18 +1,17 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** -** Licensees holding valid Qtopia Developer license may use this -** file in accordance with the Qtopia Developer License Agreement -** provided with the Software. +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. ** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING -** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR -** PURPOSE. +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** -** email sales@trolltech.com for information about Qtopia License -** Agreements. +** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. @@ -88,9 +87,10 @@ namespace Qtopia // other Notes, - Groups - ,rid, + // used for internal record keeping, not for end user. + Groups, + rid, rinfo }; diff --git a/library/backend/stringutil.cpp b/library/backend/stringutil.cpp deleted file mode 100644 index df58f54..0000000 --- a/library/backend/stringutil.cpp +++ b/dev/null @@ -1,415 +0,0 @@ -/********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. -** -** This file is part of Qtopia Environment. -** -** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included -** in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING -** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A -** PARTICULAR PURPOSE. -** -** See http://www.trolltech.com/gpl/ for GPL licensing information. -** -** Contact info@trolltech.com if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -#include "stringutil.h" -#include <qregexp.h> -#include <qstringlist.h> - -namespace Qtopia -{ - - - -/* - Very, very simple Latin-1 only collation guaranteed to displease anyone - who actually uses the non-ASCII characters. - */ - -static const char collationHack[] = { -0x00, //C-@ -0x01, //C-A -0x02, //C-B -0x03, //C-C -0x04, //C-D -0x05, //C-E -0x06, //C-F -0x07, //C-G -0x08, //C-H -0x09, //C-I -0x0a, //C-J -0x0b, //C-K -0x0c, //C-L -0x0d, //C-M -0x0e, //C-N -0x0f, //C-O -0x10, //C-P -0x11, //C-Q -0x12, //C-R -0x13, //C-S -0x14, //C-T -0x15, //C-U -0x16, //C-V -0x17, //C-W -0x18, //C-X -0x19, //C-Y -0x1a, //C-Z -0x1b, //C-[ -0x1c, //C-\ -0x1d, //C-] -0x1e, //C-^ -0x1f, //C-_ -' ', // -'!', //! -'"', //" -'#', //# -'$', //$ -'%', //% -'&', //& -'\'', //' -'(', //( -')', //) -'*', //* -'+', //+ -',', //, -'-', //- -'.', //. -'/', /// -0x80, //0 -0x81, //1 -0x82, //2 -0x83, //3 -0x84, //4 -0x85, //5 -0x86, //6 -0x87, //7 -0x88, //8 -0x89, //9 -':', //: -';', //; -'<', //< -'=', //= -'>', //> -'?', //? -'@', //@ -'A', //A -'B', //B -'C', //C -'D', //D -'E', //E -'F', //F -'G', //G -'H', //H -'I', //I -'J', //J -'K', //K -'L', //L -'M', //M -'N', //N -'O', //O -'P', //P -'Q', //Q -'R', //R -'S', //S -'T', //T -'U', //U -'V', //V -'W', //W -'X', //X -'Y', //Y -'Z', //Z -'[', //[ -'\\', //\ -']', //] -'^', //^ -'_', //_ -'`', //` -'A', //a -'B', //b -'C', //c -'D', //d -'E', //e -'F', //f -'G', //g -'H', //h -'I', //i -'J', //j -'K', //k -'L', //l -'M', //m -'N', //n -'O', //o -'P', //p -'Q', //q -'R', //r -'S', //s -'T', //t -'U', //u -'V', //v -'W', //w -'X', //x -'Y', //y -'Z', //z -'{', //{ -'|', //| -'}', //} -'~', //~ -'', // -0x80, //C-M-@ -0x81, //C-M-A -0x82, //C-M-B -0x83, //C-M-C -0x84, //C-M-D -0x85, //C-M-E -0x86, //C-M-F -0x87, //C-M-G -0x88, //C-M-H -0x89, //C-M-I -0x8a, //C-M-J -0x8b, //C-M-K -0x8c, //C-M-L -0x8d, //C-M-M -0x8e, //C-M-N -0x8f, //C-M-O -0x90, //C-M-P -0x91, //C-M-Q -0x92, //C-M-R -0x93, //C-M-S -0x94, //C-M-T -0x95, //C-M-U -0x96, //C-M-V -0x97, //C-M-W -0x98, //C-M-X -0x99, //C-M-Y -0x9a, //C-M-Z -0x9b, //C-M-[ -0x9c, //C-M-\ -0x9d, //C-M-] -0x9e, //C-M-^ -0x9f, //C-M-_ -' ', // -'¡', //¡ -'¢', //¢ -'£', //£ -'¤', //¤ -'¥', //¥ -'¦', //¦ -'§', //§ -'¨', //¨ -'©', //© -'A', //ª -'«', //« -'¬', //¬ -'', // -'®', //® -'¯', //¯ -'O', //° -'±', //± -'²', //² -'³', //³ -'´', //´ -'µ', //µ -'P', //¶ -'·', //· -'¸', //¸ -'¹', //¹ -'O', //º -'»', //» -'¼', //¼ -'½', //½ -'¾', //¾ -'¿', //¿ -'A', //À -'A', //Á -'A', //Â -'A', //Ã -'A', //Ä -'A', //Å -'A', //Æ -'C', //Ç -'E', //È -'E', //É -'E', //Ê -'E', //Ë -'I', //Ì -'I', //Í -'I', //Î -'I', //Ï -'D', //Ð -'N', //Ñ -'O', //Ò -'O', //Ó -'O', //Ô -'O', //Õ -'O', //Ö -'×', //× -'O', //Ø -'U', //Ù -'U', //Ú -'U', //Û -'U', //Ü -'Y', //Ý -'T', //Þ -'S', //ß -'A', //à -'A', //á -'A', //â -'A', //ã -'A', //ä -'A', //å -'A', //æ -'C', //ç -'E', //è -'E', //é -'E', //ê -'E', //ë -'I', //ì -'I', //í -'I', //î -'I', //ï -'D', //ð -'N', //ñ -'O', //ò -'O', //ó -'O', //ô -'O', //õ -'O', //ö -'÷', //÷ -'O', //ø -'U', //ù -'U', //ú -'U', //û -'U', //ü -'Y', //ý -'T', //þ -'Y', //ÿ -}; - - - - - -static void hackString ( QString &s ) -{ - int len = s.length(); - const QChar* uc = s.unicode(); - for ( int i = 0; i < len; i++ ) { - if ( !uc++->row() ) - s[i] = collationHack[s[i].cell()]; - } -} - -QString buildSortKey( const QString & s ) -{ - QString res = s; - hackString( res ); - return res; -} - -QString buildSortKey( const QString & s1, const QString & s2 ) -{ - QString res = s1 + QChar( '\0' ) + s2; - hackString( res ); - return res; -} - -QString buildSortKey( const QString & s1, const QString & s2, - const QString & s3 ) -{ - QString res = s1 + QChar( '\0' ) + s2 + QChar( '\0' ) + s3; - hackString( res ); - return res; -} - -static inline QChar coll( QChar u ) -{ - return u.row() ? u : QChar(collationHack[ u.cell() ]); -} - - -int compare( const QString & s1, const QString & s2 ) -{ - const QChar* u1 = s1.unicode(); - const QChar* u2 = s2.unicode(); - - if ( u1 == u2 ) - return 0; - if ( u1 == 0 ) - return 1; - if ( u2 == 0 ) - return -1; - int l=QMIN(s1.length(),s2.length()); - while ( l-- && coll(*u1) == coll(*u2) ) - u1++,u2++; - if ( l==-1 ) - return ( s1.length()-s2.length() ); - return u1->unicode() - u2->unicode(); -} - -QString simplifyMultiLineSpace( const QString &multiLine ) -{ - QString result; - QStringList lines = QStringList::split("\n", multiLine); - for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it ) { - if ( it != lines.begin() ) - result += "\n"; - result += (*it).simplifyWhiteSpace(); - } - return result; -} - -QString escapeString( const QString& plain ) -{ - QString tmp(plain); - int pos = tmp.length(); - const QChar *uc = plain.unicode(); - while ( pos-- ) { - unsigned char ch = uc[pos].latin1(); - if ( ch == '&' ) - tmp.replace( pos, 1, "&" ); - else if ( ch == '<' ) - tmp.replace( pos, 1, "<" ); - else if ( ch == '>' ) - tmp.replace( pos, 1, ">" ); - else if ( ch == '\"' ) - tmp.replace( pos, 1, """ ); - } - return tmp; -} - -QString plainString( const char* escaped, unsigned int length ) -{ - return plainString( QString::fromUtf8( escaped, length ) ); -} - -QString plainString( const QCString& string ) -{ - // We first have to pass it through a ::fromUtf8() - return plainString( string.data(), string.length() ); -} - -QString plainString( const QString& string ) -{ - QString tmp( string ); - int pos = -1; - while ( (pos = tmp.find( "&", pos +1 ) ) != -1 ) { - if ( tmp.find( "&", pos ) == pos ) - tmp.replace( pos, 5, "&" ); - else if ( tmp.find( "<", pos ) == pos ) - tmp.replace( pos, 4, "<" ); - else if( tmp.find( ">", pos ) == pos ) - tmp.replace( pos, 4, ">" ); - else if ( tmp.find( """, pos ) == pos ) - tmp.replace( pos, 6, "\"" ); - } - return tmp; -} - -} // namespace QPC diff --git a/library/backend/stringutil.h b/library/backend/stringutil.h deleted file mode 100644 index e9daf70..0000000 --- a/library/backend/stringutil.h +++ b/dev/null @@ -1,57 +0,0 @@ -/********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. -** -** This file is part of Qtopia Environment. -** -** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included -** in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING -** THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A -** PARTICULAR PURPOSE. -** -** See http://www.trolltech.com/gpl/ for GPL licensing information. -** -** Contact info@trolltech.com if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - - -#ifndef QTPALMTOP_stringutil_h__ -#define QTPALMTOP_stringutil_h__ - -#include <qstring.h> -#include "qpcglobal.h" - -namespace Qtopia -{ - -// Simplifies white space within each line but keeps the new line characters -QString QPC_EXPORT simplifyMultiLineSpace( const QString &multiLine ); - -// Creates a QString which doesn't contain any "dangerous" -// characters (i.e. <, >, &, ") -QString QPC_EXPORT escapeString( const QString& plain ); - -// Takes a UTF-8!! string and removes all the XML thingies (entities?) -// from the string and also calls fromUtf8() on it... so make sure -// to pass a QCString/const char* with UTF-8 data only -QString QPC_EXPORT plainString( const char* escaped, unsigned int length ); -QString QPC_EXPORT plainString( const QCString& string ); - -QString QPC_EXPORT plainString( const QString& string ); - - -// collation functions -int compare( const QString & s1, const QString & s2 ); -QString buildSortKey( const QString & s ); -QString buildSortKey( const QString & s1, const QString & s2 ); -QString buildSortKey( const QString & s1, const QString & s2, - const QString & s3 ); - -} - -#endif diff --git a/library/backend/task.cpp b/library/backend/task.cpp index f0a38f1..a00adb3 100644 --- a/library/backend/task.cpp +++ b/library/backend/task.cpp @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2001 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software @@ -18,25 +18,124 @@ ** **********************************************************************/ -#include <qpe/task.h> -#include <qregexp.h> -#include <qstring.h> -#include <qpe/recordfields.h> +#include "task.h" +#include "recordfields.h" #include "vobject_p.h" -#include "timeconversion.h" #include "qfiledirect_p.h" +#include <qtopia/timeconversion.h> + +#include <qregexp.h> +#include <qstring.h> + #include <stdio.h> using namespace Qtopia; UidGen Task::sUidGen( UidGen::Qtopia ); +/*! + \class Task + \brief The Task class holds the data of a todo entry. + + This data includes the priority of the task, a description, an optional due + date, and whether the task is completed or not. + + \ingroup qtopiaemb + \ingroup qtopiadesktop +*/ + +/*! + Creates a new, empty task. +*/ Task::Task() : Record(), mDue( FALSE ), mDueDate( QDate::currentDate() ), mCompleted( FALSE ), mPriority( 3 ), mDesc() { } +/*! + \fn void Task::setPriority( int priority ) + + Sets the priority of the task to \a priority. +*/ + +/*! + \fn int Task::priority() const + + Returns the priority of the task. +*/ + +/*! + \fn void Task::setDescription( const QString &description ) + + Sets the description of the task to \a description. + */ + +/*! + \fn const QString &Task::description() const + + Returns the description of the task. + */ + +/*! + \fn void Task::setDueDate( const QDate &date, bool hasDue ) + + \internal + If \a hasDue is TRUE sets the due date of the task to \a date. + Otherwise clears the due date of the task. +*/ + +/*! + \fn void Task::setDueDate( const QDate &date ) + + Sets the due date of the task to \a date. +*/ + +/*! + \fn void Task::clearDueDate( ) + + Clears the due date of the task. +*/ + +/*! + \fn void Task::setCompleted( bool b ) + + If \a b is TRUE marks the task as completed. Otherwise marks the task as + uncompleted. +*/ + +/*! + \fn bool Task::isCompleted() const + + Returns TRUE if the task is completed. Otherwise returns FALSE. +*/ + +/*! + \fn const QDate &Task::dueDate() const + + Returns the due date of the task. + */ + +/*! + \fn bool Task::hasDueDate() const + + Returns TRUE if there is a due date set for the task. Otherwise returns + FALSE. +*/ + +/*! + \fn void Task::setHasDueDate( bool b ) + + \internal + Just don't ask. I really can't justify the function. +*/ + + +/*! + \internal + Creates a new task. The properties of the task are set from \a m. +*/ + Task::Task( const QMap<int, QString> &m ) : Record(), mDue( FALSE ), mDueDate( QDate::currentDate() ), mCompleted( FALSE ), mPriority( 3 ), mDesc() { @@ -51,22 +150,34 @@ mDueDate( QDate::currentDate() ), mCompleted( FALSE ), mPriority( 3 ), mDesc() case Priority: setPriority( (*it).toInt() ); break; case Date: mDueDate = TimeConversion::fromString( (*it) ); break; case TaskUid: setUid( (*it).toInt() ); break; - default: break; + case TaskRid: + case TaskRinfo: + break; } } +/*! + Destroys a task. +*/ Task::~Task() { } +/*! + \internal + Returns the task as a map of field ids to property values. +*/ QMap<int, QString> Task::toMap() const { QMap<int, QString> m; m.insert( HasDate, hasDueDate() ? "1" : "0" ); m.insert( Completed, isCompleted() ? "1" : "0" ); + if ( categories().count() ) m.insert( TaskCategory, idsToString( categories() ) ); + if ( !description().isEmpty() ) m.insert( TaskDescription, description() ); m.insert( Priority, QString::number( priority() ) ); + if ( hasDueDate() ) m.insert( Date, TimeConversion::toString( dueDate() ) ); m.insert( TaskUid, QString::number(uid()) ); @@ -75,6 +186,10 @@ QMap<int, QString> Task::toMap() const return m; } +/*! + \internal + Appends the task information to \a buf. +*/ void Task::save( QString& buf ) const { buf += " Completed=\""; @@ -117,20 +232,27 @@ void Task::save( QString& buf ) const buf += "\""; } -bool Task::match ( const QRegExp &r ) const +/*! + Returns TRUE if the task matches the regular expressions \a regexp. + Otherwise returns FALSE. +*/ +bool Task::match ( const QRegExp ®exp ) const { // match on priority, description on due date... bool match; match = false; - if ( QString::number( mPriority ).find( r ) > -1 ) + if ( QString::number( mPriority ).find( regexp ) > -1 ) match = true; - else if ( mDue && mDueDate.toString().find( r ) > -1 ) + else if ( mDue && mDueDate.toString().find( regexp ) > -1 ) match = true; - else if ( mDesc.find( r ) > -1 ) + else if ( mDesc.find( regexp ) > -1 ) match = true; return match; } +/*! + \internal +*/ static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) { VObject *ret = 0; @@ -139,6 +261,9 @@ static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QSt return ret; } +/*! + \internal +*/ static inline VObject *safeAddProp( VObject *o, const char *prop) { VObject *ret = 0; @@ -148,6 +273,9 @@ static inline VObject *safeAddProp( VObject *o, const char *prop) } +/*! + \internal +*/ static VObject *createVObject( const Task &t ) { VObject *vcal = newVObject( VCCalProp ); @@ -164,7 +292,9 @@ static VObject *createVObject( const Task &t ) return vcal; } - +/*! + \internal +*/ static Task parseVObject( VObject *obj ) { Task t; @@ -207,7 +337,9 @@ static Task parseVObject( VObject *obj ) } - +/*! + Writes the list of \a tasks as a set of VCards to the file \a filename. +*/ void Task::writeVCalendar( const QString &filename, const QValueList<Task> &tasks) { QFileDirect f( filename.utf8().data() ); @@ -226,6 +358,9 @@ void Task::writeVCalendar( const QString &filename, const QValueList<Task> &task cleanStrTbl(); } +/*! + Writes \a task as a VCard to the file \a filename. +*/ void Task::writeVCalendar( const QString &filename, const Task &task) { QFileDirect f( filename.utf8().data() ); @@ -241,7 +376,9 @@ void Task::writeVCalendar( const QString &filename, const Task &task) cleanStrTbl(); } - +/*! + Returns the set of tasks read as VCards from the file \a filename. +*/ QValueList<Task> Task::readVCalendar( const QString &filename ) { VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); diff --git a/library/backend/task.h b/library/backend/task.h index 6f383b8..091f2e9 100644 --- a/library/backend/task.h +++ b/library/backend/task.h @@ -1,7 +1,7 @@ /********************************************************************** -** Copyright (C) 2001 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software @@ -20,8 +20,8 @@ #ifndef __TASK_H__ #define __TASK_H__ -#include <qpe/palmtoprecord.h> -#include <qpe/stringutil.h> +#include <qtopia/private/palmtoprecord.h> +#include <qtopia/stringutil.h> #include <qvaluelist.h> #include <qdatetime.h> @@ -40,6 +40,8 @@ public: static void writeVCalendar( const QString &filename, const Task &task); static QValueList<Task> readVCalendar( const QString &filename ); + enum PriorityValue { VeryHigh=1, High, Normal, Low, VeryLow }; + void setPriority( int priority ) { mPriority = priority; } int priority() const { return mPriority; } @@ -51,10 +53,16 @@ public: { mDesc = Qtopia::simplifyMultiLineSpace(description); } const QString &description() const { return mDesc; } + // Use THESE functions + void setDueDate( const QDate &date); + void clearDueDate(); + + // Instead of these functions. void setDueDate( const QDate& date, bool hasDue ) { mDueDate = date; mDue = hasDue; } + void setHasDueDate( bool b ) { mDue = b; } + const QDate &dueDate() const { return mDueDate; } bool hasDueDate() const { return mDue; } - void setHasDueDate( bool b ) { mDue = b; } void setCompleted( bool b ) { mCompleted = b; } bool isCompleted() const { return mCompleted; } @@ -78,4 +86,7 @@ private: // }; +// MUST be inline. (forwards compatability). +inline void Task::setDueDate( const QDate &date) { setDueDate(date, date.isValid()); } +inline void Task::clearDueDate() { setHasDueDate( FALSE ); } #endif diff --git a/library/backend/timeconversion.cpp b/library/backend/timeconversion.cpp deleted file mode 100644 index a4a2547..0000000 --- a/library/backend/timeconversion.cpp +++ b/dev/null @@ -1,237 +0,0 @@ -/********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. -** -** This file is part of Qtopia Environment. -** -** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -** See http://www.trolltech.com/gpl/ for GPL licensing information. -** -** Contact info@trolltech.com if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -#include <qglobal.h> -#include "timeconversion.h" -#include <qregexp.h> -#include <stdlib.h> - -QString TimeConversion::toString( const QDate &d ) -{ - QString r = QString::number( d.day() ) + "." + - QString::number( d.month() ) + "." + - QString::number( d.year() ); - //qDebug("TimeConversion::toString %s", r.latin1()); - return r; -} - -QDate TimeConversion::fromString( const QString &datestr ) -{ - int monthPos = datestr.find('.'); - int yearPos = datestr.find('.', monthPos+1 ); - if ( monthPos == -1 || yearPos == -1 ) { - qDebug("fromString didn't find . in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, yearPos ); - return QDate(); - } - int d = datestr.left( monthPos ).toInt(); - int m = datestr.mid( monthPos+1, yearPos - monthPos - 1 ).toInt(); - int y = datestr.mid( yearPos+1 ).toInt(); - QDate date ( y,m,d ); - //qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, yearPos); - return date; -} - -time_t TimeConversion::toUTC( const QDateTime& dt ) -{ - time_t tmp; - struct tm *lt; - -#if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64) - _tzset(); -#else - tzset(); -#endif - - // get a tm structure from the system to get the correct tz_name - tmp = time( 0 ); - lt = localtime( &tmp ); - - lt->tm_sec = dt.time().second(); - lt->tm_min = dt.time().minute(); - lt->tm_hour = dt.time().hour(); - lt->tm_mday = dt.date().day(); - lt->tm_mon = dt.date().month() - 1; // 0-11 instead of 1-12 - lt->tm_year = dt.date().year() - 1900; // year - 1900 - //lt->tm_wday = dt.date().dayOfWeek(); ignored anyway - //lt->tm_yday = dt.date().dayOfYear(); ignored anyway - lt->tm_wday = -1; - lt->tm_yday = -1; - // tm_isdst negative -> mktime will find out about DST - lt->tm_isdst = -1; - // keep tm_zone and tm_gmtoff - tmp = mktime( lt ); - return tmp; -} - -QDateTime TimeConversion::fromUTC( time_t time ) -{ - struct tm *lt; - -#if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64) - _tzset(); -#else - tzset(); -#endif - lt = localtime( &time ); - QDateTime dt; - dt.setDate( QDate( lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday ) ); - dt.setTime( QTime( lt->tm_hour, lt->tm_min, lt->tm_sec ) ); - return dt; -} - - -int TimeConversion::secsTo( const QDateTime &from, const QDateTime &to ) -{ - return toUTC( to ) - toUTC( from ); -} - -QCString TimeConversion::toISO8601( const QDate &d ) -{ - time_t tmp = toUTC( d ); - struct tm *utc = gmtime( &tmp ); - - QCString str; - str.sprintf("%04d%02d%02d", (utc->tm_year + 1900), utc->tm_mon+1, utc->tm_mday ); - return str; -} - -QCString TimeConversion::toISO8601( const QDateTime &dt ) -{ - time_t tmp = toUTC( dt ); - struct tm *utc = gmtime( &tmp ); - - QCString str; - str.sprintf("%04d%02d%02dT%02d%02d%02dZ", - (utc->tm_year + 1900), utc->tm_mon+1, utc->tm_mday, - utc->tm_hour, utc->tm_min, utc->tm_sec ); - return str; -} - -QDateTime TimeConversion::fromISO8601( const QCString &s ) -{ - -#if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64) - _tzset(); -#else - tzset(); -#endif - - struct tm *thetime = new tm; - - QCString str = s.copy(); - str.replace(QRegExp("-"), "" ); - str.replace(QRegExp(":"), "" ); - str.stripWhiteSpace(); - str = str.lower(); - - int i = str.find( "t" ); - QCString date; - QCString timestr; - if ( i != -1 ) { - date = str.left( i ); - timestr = str.mid( i+1 ); - } else { - date = str; - } - -// qDebug("--- parsing ISO time---"); - thetime->tm_year = 100; - thetime->tm_mon = 0; - thetime->tm_mday = 0; - thetime->tm_hour = 0; - thetime->tm_min = 0; - thetime->tm_sec = 0; - -// qDebug("date = %s", date.data() ); - - switch( date.length() ) { - case 8: - thetime->tm_mday = date.right( 2 ).toInt(); - case 6: - thetime->tm_mon = date.mid( 4, 2 ).toInt() - 1; - case 4: - thetime->tm_year = date.left( 4 ).toInt(); - thetime->tm_year -= 1900; - break; - default: - break; - } - - int tzoff = 0; - bool inLocalTime = FALSE; - if ( timestr.find( 'z' ) == (int)timestr.length() - 1 ) - // UTC - timestr = timestr.left( timestr.length() -1 ); - else { - int plus = timestr.find( "+" ); - int minus = timestr.find( "-" ); - if ( plus != -1 || minus != -1 ) { - // have a timezone offset - plus = (plus != -1) ? plus : minus; - QCString off = timestr.mid( plus ); - timestr = timestr.left( plus ); - - int tzoffhour = 0; - int tzoffmin = 0; - switch( off.length() ) { - case 5: - tzoffmin = off.mid(3).toInt(); - case 3: - tzoffhour = off.left(3).toInt(); - default: - break; - } - tzoff = 60*tzoffhour + tzoffmin; - } else - inLocalTime = TRUE; - } - - // get the time: - switch( timestr.length() ) { - case 6: - thetime->tm_sec = timestr.mid( 4 ).toInt(); - case 4: - thetime->tm_min = timestr.mid( 2, 2 ).toInt(); - case 2: - thetime->tm_hour = timestr.left( 2 ).toInt(); - default: - break; - } - - int tzloc = 0; - time_t tmp = time( 0 ); - if ( !inLocalTime ) { - // have to get the offset between gmt and local time - struct tm *lt = localtime( &tmp ); - tzloc = mktime( lt ); - struct tm *ut = gmtime( &tmp ); - tzloc -= mktime( ut ); - } -// qDebug("time: %d %d %d, tzloc=%d, tzoff=%d", thetime->tm_hour, thetime->tm_min, thetime->tm_sec, -// tzloc, tzoff ); - - tmp = mktime( thetime ); - tmp += 60*(-tzloc + tzoff); - - delete thetime; - - return fromUTC( tmp ); -} - diff --git a/library/backend/timeconversion.h b/library/backend/timeconversion.h deleted file mode 100644 index 1724812..0000000 --- a/library/backend/timeconversion.h +++ b/dev/null @@ -1,45 +0,0 @@ -/********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. -** -** This file is part of Qtopia Environment. -** -** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -** See http://www.trolltech.com/gpl/ for GPL licensing information. -** -** Contact info@trolltech.com if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -#ifndef __timeconversion_h__ -#define __timeconversion_h__ - -#include <time.h> -#include <sys/types.h> -#include <qdatetime.h> - -#include <qpe/qpcglobal.h> - -class QPC_EXPORT TimeConversion -{ -public: - static QString toString( const QDate &d ); - static QDate fromString( const QString &datestr ); - - static time_t toUTC( const QDateTime& dt ); - static QDateTime fromUTC( time_t time ); - static int secsTo( const QDateTime &from, const QDateTime &to ); - - static QCString toISO8601( const QDate & ); - static QCString toISO8601( const QDateTime & ); - static QDateTime fromISO8601( const QCString & ); -}; - -#endif // __timeconversion_h__ diff --git a/library/backend/vcc.y b/library/backend/vcc.y index e326a64..5bcf0cb 100644 --- a/library/backend/vcc.y +++ b/library/backend/vcc.y @@ -517,7 +517,7 @@ static int lexWithinMode(enum LexMode mode) { return 0; } -static char lexGetc_() +static int lexGetc_()
{ /* get next char from input, no buffering. */ if (lexBuf.curPos == lexBuf.inputLen) @@ -931,60 +931,69 @@ static int match_begin_end_name(int end) { static char* lexGetQuotedPrintable() { - char cur; - + int c;
+ lexSkipWhite();
+ c = lexLookahead();
lexClearToken(); - do { - cur = lexGetc(); - switch (cur) { - case '=': { - int c = 0; - int next[2]; - int i; - for (i = 0; i < 2; i++) { - next[i] = lexGetc(); - if (next[i] >= '0' && next[i] <= '9') - c = c * 16 + next[i] - '0'; - else if (next[i] >= 'A' && next[i] <= 'F') - c = c * 16 + next[i] - 'A' + 10; - else +
+ while (c != EOF && c != ';') {
+ if (c == '\n') {
+ // break, leave '\n' on remaining chars.
break; + } else if (c == '=') {
+ int cur = 0;
+ int next;
+
+ lexSkipLookahead(); // skip '='
+ next = lexLookahead();
+
+ if (next == '\n') {
+ // skip and only skip the \n
+ lexSkipLookahead();
+ c = lexLookahead();
+ ++mime_lineNum; // aid in error reporting
+ continue;
+ } else if (next >= '0' && next <= '9') {
+ cur = next - '0';
+ } else if (next >= 'A' && next <= 'F') {
+ cur = next - 'A' + 10;
+ } else {
+ // we have been sent buggy stuff. doesn't matter
+ // what we do so long as we keep going.
+ // should probably spit an error here
+ c = lexLookahead();
+ continue;
} - if (i == 0) { - /* single '=' follow by LINESEP is continuation sign? */ - if (next[0] == '\n') { - ++mime_lineNum; - } - else { - lexPushLookaheadc('='); - goto EndString; - } +
+ lexSkipLookahead(); // skip A-Z0-9
+ next = lexLookahead();
+
+ cur = cur * 16;
+ // this time really just expecting 0-9A-F
+ if (next >= '0' && next <= '9') {
+ cur += next - '0';
+ } else if (next >= 'A' && next <= 'F') {
+ cur += next - 'A' + 10;
+ } else {
+ // we have been sent buggy stuff. doesn't matter
+ // what we do so long as we keep going.
+ // should probably spit an error here
+ c = lexLookahead();
+ continue;
} - else if (i == 1) { - lexPushLookaheadc(next[1]); - lexPushLookaheadc(next[0]); - lexAppendc('='); +
+ // got a valid escaped =. append it.
+ lexSkipLookahead(); // skip second 0-9A-F
+ lexAppendc(cur);
} else { - lexAppendc(c); + lexSkipLookahead(); // skip whatever we just read.
+ lexAppendc(c); // and append it.
} - break; - } /* '=' */ - case '\n': { - lexPushLookaheadc('\n'); - goto EndString; + c = lexLookahead();
} - case (char)EOF: - break; - default: - lexAppendc(cur); - break; - } /* switch */ - } while (cur != (char)EOF); - -EndString: lexAppendc(0); - return lexStr(); - } /* LexQuotedPrintable */ + return c==EOF?0:lexStr();
+}
static int yylex() { diff --git a/library/backend/vcc_yacc.cpp b/library/backend/vcc_yacc.cpp index cb24631..19a108f 100644 --- a/library/backend/vcc_yacc.cpp +++ b/library/backend/vcc_yacc.cpp @@ -1,5 +1,6 @@ #ifndef lint -static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +/*static char yysccsid[] = "from: @(#)yaccpar 1.9 (Berkeley) 02/21/93";*/ +static char yyrcsid[] = "$Id$"; #endif #define YYBYACC 1 #define YYMAJOR 1 @@ -7,8 +8,32 @@ static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; #define yyclearin (yychar=(-1)) #define yyerrok (yyerrflag=0) #define YYRECOVERING (yyerrflag!=0) -#define YYPREFIX "yy" -#line 1 "vcc.y" +#define yyparse vccparse +#define yylex vcclex +#define yyerror vccerror +#define yychar vccchar +#define yyval vccval +#define yylval vcclval +#define yydebug vccdebug +#define yynerrs vccnerrs +#define yyerrflag vccerrflag +#define yyss vccss +#define yyssp vccssp +#define yyvs vccvs +#define yyvsp vccvsp +#define yylhs vcclhs +#define yylen vcclen +#define yydefred vccdefred +#define yydgoto vccdgoto +#define yysindex vccsindex +#define yyrindex vccrindex +#define yygindex vccgindex +#define yytable vcctable +#define yycheck vcccheck +#define yyname vccname +#define yyrule vccrule +#define YYPREFIX "vcc" +#line 1 "backend/vcc.y" /***************************************************************************
@@ -73,6 +98,7 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. we can use more than one yacc based parser.
*/
+#if 0
#define yyparse mime_parse
#define yylex mime_lex
#define yyerror mime_error
@@ -105,6 +131,7 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. #undef YYPREFIX
#endif
#define YYPREFIX "mime_"
+#endif
#ifndef _NO_LINE_FOLDING
@@ -128,20 +155,17 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. #include <stdlib.h>
#include <ctype.h>
-#ifdef PALMTOPCENTER -#include <qpe/vobject_p.h>
-#include <qpe/qfiledirect_p.h> -#else +/*#ifdef PALMTOPCENTER
*/ +/*#include <qpe/vobject_p.h>
*/ +/*#else
*/ #include "vobject_p.h"
-#include "qfiledirect_p.h" -#endif +/*#endif
*/ /**** Types, Constants ****/
#define YYDEBUG 0 /* 1 to compile in some debugging code */
#define MAXTOKEN 256 /* maximum token (line) length */
-#define YYSTACKSIZE 100 /* ~unref ? -*/ +#define YYSTACKSIZE 100 /* ~unref ?
*/ #define MAXLEVEL 10 /* max # of nested objects parseable */
/* (includes outermost) */
@@ -188,14 +212,16 @@ static void lexPushMode(enum LexMode mode); static void enterProps(const char *s);
static void enterAttr(const char *s1, const char *s2);
static void enterValues(const char *value);
+#define mime_error yyerror
+void mime_error(char *s);
void mime_error_(char *s);
-#line 185 "vcc.y" +#line 189 "backend/vcc.y" typedef union {
char *str;
VObject *vobj;
} YYSTYPE; -#line 196 "y.tab.c" +#line 225 "y.tab.c" #define EQ 257 #define COLON 258 #define DOT 259 @@ -215,21 +241,21 @@ typedef union { #define ID 273 #define STRING 274 #define YYERRCODE 256 -short yylhs[] = { -1, +short vcclhs[] = { -1, 0, 6, 6, 5, 5, 8, 3, 9, 3, 7, 7, 13, 10, 10, 15, 11, 11, 14, 14, 16, 17, 17, 1, 18, 12, 12, 2, 2, 20, 4, 21, 4, 19, 19, 22, 22, 22, 25, 23, 26, 23, 27, 24, 28, 24, }; -short yylen[] = { 2, +short vcclen[] = { 2, 1, 2, 1, 1, 1, 0, 4, 0, 3, 2, 1, 0, 5, 1, 0, 3, 1, 2, 1, 2, 1, 3, 1, 0, 4, 1, 1, 0, 0, 4, 0, 3, 2, 1, 1, 1, 1, 0, 4, 0, 3, 0, 4, 0, 3, }; -short yydefred[] = { 0, +short vccdefred[] = { 0, 0, 0, 0, 4, 5, 3, 0, 0, 0, 0, 0, 2, 14, 23, 0, 0, 11, 0, 9, 0, 0, 0, 0, 34, 35, 36, 32, 0, 7, 10, @@ -237,12 +263,12 @@ short yydefred[] = { 0, 0, 0, 41, 0, 45, 0, 20, 18, 27, 0, 0, 39, 43, 0, 24, 13, 22, 0, 25, }; -short yydgoto[] = { 3, +short vccdgoto[] = { 3, 15, 50, 4, 5, 6, 7, 22, 8, 9, 17, 18, 51, 41, 39, 28, 40, 47, 58, 23, 10, 11, 24, 25, 26, 32, 33, 34, 35, }; -short yysindex[] = { -262, +short vccsindex[] = { -262, 0, 0, 0, 0, 0, 0, -262, -252, -219, -249, -256, 0, 0, 0, 0, -227, 0, -242, 0, 0, 0, -252, -254, 0, 0, 0, 0, -208, 0, 0, @@ -250,7 +276,7 @@ short yysindex[] = { -262, -214, -233, 0, -224, 0, -195, 0, 0, 0, -197, -199, 0, 0, -212, 0, 0, 0, -214, 0, }; -short yyrindex[] = { 0, +short vccrindex[] = { 0, -222, -238, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, -215, 0, 0, 0, 0, -220, -218, -260, 0, 0, 0, 0, 0, 0, 0, 0, @@ -258,13 +284,13 @@ short yyrindex[] = { 0, -250, 0, 0, 0, 0, -202, 0, 0, 0, -196, 0, 0, 0, 0, 0, 0, 0, -250, 0, }; -short yygindex[] = { 0, +short vccgindex[] = { 0, 3, 0, 0, 0, 61, 0, -7, 0, 0, -16, 0, 11, 0, 0, 0, 31, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, }; #define YYTABLESIZE 71 -short yytable[] = { 30, +short vcctable[] = { 30, 16, 13, 1, 13, 2, 30, 13, 37, 37, 28, 37, 27, 28, 36, 20, 31, 21, 29, 14, 20, 14, 21, 13, 14, 42, 30, 44, 30, 13, 31, @@ -274,7 +300,7 @@ short yytable[] = { 30, 14, 54, 55, 56, 1, 16, 26, 12, 59, 48, 37, }; -short yycheck[] = { 16, +short vcccheck[] = { 16, 8, 256, 265, 256, 267, 22, 256, 268, 269, 260, 271, 268, 263, 268, 269, 258, 271, 256, 273, 269, 273, 271, 256, 273, 32, 42, 34, 44, 256, 268, @@ -290,7 +316,7 @@ short yycheck[] = { 16, #endif #define YYMAXTOKEN 274 #if YYDEBUG -char *yyname[] = { +char *vccname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -301,7 +327,7 @@ char *yyname[] = { "SPACE","HTAB","LINESEP","NEWLINE","BEGIN_VCARD","END_VCARD","BEGIN_VCAL", "END_VCAL","BEGIN_VEVENT","END_VEVENT","BEGIN_VTODO","END_VTODO","ID","STRING", }; -char *yyrule[] = { +char *vccrule[] = { "$accept : mime", "mime : vobjects", "vobjects : vobjects vobject", @@ -372,7 +398,7 @@ YYSTYPE yylval; short yyss[YYSTACKSIZE]; YYSTYPE yyvs[YYSTACKSIZE]; #define yystacksize YYSTACKSIZE -#line 378 "vcc.y" +#line 382 "backend/vcc.y" /*------------------------------------*/
static int pushVObject(const char *prop)
@@ -511,7 +537,7 @@ static int lexWithinMode(enum LexMode mode) { return 0;
}
-static char lexGetc_()
+static int lexGetc_()
{
/* get next char from input, no buffering. */
if (lexBuf.curPos == lexBuf.inputLen)
@@ -925,7 +951,7 @@ static int match_begin_end_name(int end) { static char* lexGetQuotedPrintable()
{
- char cur;
+ int cur;
lexClearToken();
do {
@@ -967,13 +993,13 @@ static char* lexGetQuotedPrintable() lexPushLookaheadc('\n');
goto EndString;
}
- case (char)EOF:
+ case (int)EOF:
break;
default:
lexAppendc(cur);
break;
} /* switch */
- } while (cur != (char)EOF);
+ } while (cur != (int)EOF);
EndString:
lexAppendc(0);
@@ -1150,13 +1176,18 @@ VObject* Parse_MIME_FromFile(FILE *file) DLLEXPORT(VObject*) Parse_MIME_FromFileName(char *fname)
{
- QFileDirect f( fname );
- if ( !f.open( IO_ReadOnly ) ) {
- qWarning("Unable to open mime for reading %s", fname);
+ FILE *fp = fopen(fname,"r");
+ if (fp) {
+ VObject* o = Parse_MIME_FromFile(fp);
+ fclose(fp);
+ return o;
+ }
+ else {
+ char msg[80];
+ sprintf(msg, "can't open file '%s' for reading\n", fname);
+ mime_error_(msg);
return 0;
}
-
- return Parse_MIME_FromFile( f.directHandle() );
}
#endif
@@ -1186,13 +1217,17 @@ void mime_error_(char *s) }
}
-#line 1192 "y.tab.c" +#line 1221 "y.tab.c" #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab int +#if defined(__STDC__) +yyparse(void) +#else yyparse() +#endif { register int yym, yyn, yystate; #if YYDEBUG @@ -1216,7 +1251,7 @@ yyparse() *yyssp = yystate = 0; yyloop: - if (yyn = yydefred[yystate]) goto yyreduce; + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; @@ -1256,10 +1291,6 @@ yyloop: goto yyreduce; } if (yyerrflag) goto yyinrecovery; -#ifdef lint - goto yynewerror; -#endif -yynewerror: yyerror("syntax error"); #ifdef lint goto yyerrlab; @@ -1328,49 +1359,49 @@ yyreduce: switch (yyn) { case 2: -#line 217 "vcc.y" +#line 221 "backend/vcc.y" { addList(&vObjList, yyvsp[0].vobj); curObj = 0; } break; case 3: -#line 219 "vcc.y" +#line 223 "backend/vcc.y" { addList(&vObjList, yyvsp[0].vobj); curObj = 0; } break; case 6: -#line 228 "vcc.y" +#line 232 "backend/vcc.y" {
lexPushMode(L_VCARD);
if (!pushVObject(VCCardProp)) YYERROR;
} break; case 7: -#line 233 "vcc.y" +#line 237 "backend/vcc.y" {
lexPopMode(0);
yyval.vobj = popVObject();
} break; case 8: -#line 238 "vcc.y" +#line 242 "backend/vcc.y" {
lexPushMode(L_VCARD);
if (!pushVObject(VCCardProp)) YYERROR;
} break; case 9: -#line 243 "vcc.y" +#line 247 "backend/vcc.y" {
lexPopMode(0);
yyval.vobj = popVObject();
} break; case 12: -#line 254 "vcc.y" +#line 258 "backend/vcc.y" {
lexPushMode(L_VALUES);
} break; case 13: -#line 258 "vcc.y" +#line 262 "backend/vcc.y" {
if (lexWithinMode(L_BASE64) || lexWithinMode(L_QUOTED_PRINTABLE))
lexPopMode(0);
@@ -1378,115 +1409,115 @@ case 13: } break; case 15: -#line 267 "vcc.y" +#line 271 "backend/vcc.y" {
enterProps(yyvsp[0].str);
} break; case 17: -#line 272 "vcc.y" +#line 276 "backend/vcc.y" {
enterProps(yyvsp[0].str);
} break; case 21: -#line 285 "vcc.y" +#line 289 "backend/vcc.y" {
enterAttr(yyvsp[0].str,0);
} break; case 22: -#line 289 "vcc.y" +#line 293 "backend/vcc.y" {
enterAttr(yyvsp[-2].str,yyvsp[0].str);
} break; case 24: -#line 298 "vcc.y" +#line 302 "backend/vcc.y" { enterValues(yyvsp[-1].str); } break; case 26: -#line 300 "vcc.y" +#line 304 "backend/vcc.y" { enterValues(yyvsp[0].str); } break; case 28: -#line 305 "vcc.y" +#line 309 "backend/vcc.y" { yyval.str = 0; } break; case 29: -#line 310 "vcc.y" +#line 314 "backend/vcc.y" { if (!pushVObject(VCCalProp)) YYERROR; } break; case 30: -#line 313 "vcc.y" +#line 317 "backend/vcc.y" { yyval.vobj = popVObject(); } break; case 31: -#line 315 "vcc.y" +#line 319 "backend/vcc.y" { if (!pushVObject(VCCalProp)) YYERROR; } break; case 32: -#line 317 "vcc.y" +#line 321 "backend/vcc.y" { yyval.vobj = popVObject(); } break; case 38: -#line 332 "vcc.y" +#line 336 "backend/vcc.y" {
lexPushMode(L_VEVENT);
if (!pushVObject(VCEventProp)) YYERROR;
} break; case 39: -#line 338 "vcc.y" +#line 342 "backend/vcc.y" {
lexPopMode(0);
popVObject();
} break; case 40: -#line 343 "vcc.y" +#line 347 "backend/vcc.y" {
lexPushMode(L_VEVENT);
if (!pushVObject(VCEventProp)) YYERROR;
} break; case 41: -#line 348 "vcc.y" +#line 352 "backend/vcc.y" {
lexPopMode(0);
popVObject();
} break; case 42: -#line 356 "vcc.y" +#line 360 "backend/vcc.y" {
lexPushMode(L_VTODO);
if (!pushVObject(VCTodoProp)) YYERROR;
} break; case 43: -#line 362 "vcc.y" +#line 366 "backend/vcc.y" {
lexPopMode(0);
popVObject();
} break; case 44: -#line 367 "vcc.y" +#line 371 "backend/vcc.y" {
lexPushMode(L_VTODO);
if (!pushVObject(VCTodoProp)) YYERROR;
} break; case 45: -#line 372 "vcc.y" +#line 376 "backend/vcc.y" {
lexPopMode(0);
popVObject();
} break; -#line 1492 "y.tab.c" +#line 1521 "y.tab.c" } yyssp -= yym; yystate = *yyssp; diff --git a/library/backend/vobject.cpp b/library/backend/vobject.cpp index 9c2ba3b..e6f6b78 100644 --- a/library/backend/vobject.cpp +++ b/library/backend/vobject.cpp @@ -1005,19 +1005,94 @@ static int writeBase64(OFile *fp, unsigned char *s, long len) return 1;
}
+static const char *replaceChar(unsigned char c) +{ + if (c == '\n') { + return "=0A=\n"; + } else if ( + (c >= 'A' && c <= 'Z') + || + (c >= 'a' && c <= 'z') + || + (c >= '0' && c <= '9') + || + (c >= '\'' && c <= ')') + || + (c >= '+' && c <= '-') + || + (c == '/') + || + (c == '?') + || + (c == ' ')) + { + return 0; + } + + static char trans[4]; + trans[0] = '='; + trans[3] = '\0'; + int rem = c % 16; + int div = c / 16; + + if (div < 10) + trans[1] = '0' + div; + else + trans[1] = 'A' + (div - 10); + + if (rem < 10) + trans[2] = '0' + rem; + else + trans[2] = 'A' + (rem - 10); + + return trans; +} + static void writeQPString(OFile *fp, const char *s)
{
+ /* + only A-Z, 0-9 and + "'" (ASCII code 39) + "(" (ASCII code 40) + ")" (ASCII code 41) + "+" (ASCII code 43) + "," (ASCII code 44) + "-" (ASCII code 45) + "/" (ASCII code 47) + "?" (ASCII code 63) + + should remain un-encoded. + '=' needs to be encoded as it is the escape character. + ';' needs to be as it is a field separator. + + */ const char *p = s;
while (*p) {
- if (*p == '\n') {
- if (p[1]) appendsOFile(fp,"=0A=");
- }
+ const char *rep = replaceChar(*p); + if (rep) + appendsOFile(fp, rep); + else appendcOFile(fp,*p);
p++;
}
}
-
+static bool includesUnprintable(VObject *o) +{ + if (o) { + if (VALUE_TYPE(o) == VCVT_STRINGZ) { + const char *p = STRINGZ_VALUE_OF(o); + if (p) { + while (*p) { + if (replaceChar(*p)) + return TRUE; + p++; + } + } + } + } + return FALSE; +} static void writeVObject_(OFile *fp, VObject *o);
@@ -1059,6 +1134,10 @@ static void writeAttrValue(OFile *fp, VObject *o) struct PreDefProp *pi;
pi = lookupPropInfo(NAME_OF(o));
if (pi && ((pi->flags & PD_INTERNAL) != 0)) return;
+ if ( includesUnprintable(o) ) { + appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); + appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); + } appendcOFile(fp,';');
appendsOFile(fp,NAME_OF(o));
}
@@ -1122,6 +1201,18 @@ static void writeProp(OFile *fp, VObject *o) int i = 0, n = 0;
const char** fields = fields_;
/* output prop as fields */
+ bool printable = TRUE; + while (*fields && printable) { + VObject *t = isAPropertyOf(o,*fields); + if (includesUnprintable(t)) + printable = FALSE; + fields++; + } + fields = fields_; + if (!printable) { + appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); + appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); + } appendcOFile(fp,':');
while (*fields) {
VObject *t = isAPropertyOf(o,*fields);
@@ -1138,7 +1229,12 @@ static void writeProp(OFile *fp, VObject *o) }
}
+ if (VALUE_TYPE(o)) {
+ if ( includesUnprintable(o) ) { + appendsOFile(fp, ";" VCEncodingProp "=" VCQuotedPrintableProp); + appendsOFile(fp, ";" VCCharSetProp "=" "UTF-8"); + } unsigned long size = 0;
VObject *p = isAPropertyOf(o,VCDataSizeProp);
if (p) size = LONG_VALUE_OF(p);
diff --git a/library/backend/vobject_p.h b/library/backend/vobject_p.h index a0d921e..0d0a2a8 100644 --- a/library/backend/vobject_p.h +++ b/library/backend/vobject_p.h @@ -74,6 +74,8 @@ which accompanied this distribution. */
+// No tr() anywhere in this file + #ifndef __VOBJECT_H__
#define __VOBJECT_H__ 1
@@ -142,7 +144,7 @@ For example: #define VCCategoriesProp "CATEGORIES"
#define VCCellularProp "CELL"
#define VCCGMProp "CGM"
-#define VCCharSetProp "CS"
+#define VCCharSetProp "CHARSET" #define VCCIDProp "CID"
#define VCCISProp "CIS"
#define VCCityProp "L"
|