Changeset 149

Show
Ignore:
Timestamp:
01/13/08 12:24:39 (7 months ago)
Author:
cyrusdaboo
Message:

Support address book queries on multiple fields in a single request.

Location:
Mulberry/branches/v4.1d1/Sources_Common
Files:
27 modified

Legend:

Unmodified
Added
Removed
  • Mulberry/branches/v4.1d1/Sources_Common/HTTP/CardDAVClient/CCardDAVQueryReport.cpp

    r148 r149  
    3434using namespace carddav;  
    3535 
    36 CCardDAVQueryReport::CCardDAVQueryReport(CWebDAVSession* session, const cdstring& ruri, const cdstring& search_prop, const cdstring& search_text, const cdstring& match_type) : 
     36CCardDAVQueryReport::CCardDAVQueryReport(CWebDAVSession* session, const cdstring& ruri, const cdstrvect& search_props, const cdstring& search_text, const cdstring& match_type) : 
    3737        CWebDAVReport(session, ruri) 
    3838{ 
    39         InitRequestData(search_prop, search_text, match_type); 
     39        InitRequestData(search_props, search_text, match_type); 
    4040} 
    4141 
     
    4646 
    4747 
    48 void CCardDAVQueryReport::InitRequestData(const cdstring& search_prop, const cdstring& search_text, const cdstring& match_type) 
     48void CCardDAVQueryReport::InitRequestData(const cdstrvect& search_props, const cdstring& search_text, const cdstring& match_type) 
    4949{ 
    5050        // Write XML info to a string 
    5151        std::ostrstream os; 
    52         GenerateXML(os, search_prop, search_text, match_type); 
     52        GenerateXML(os, search_props, search_text, match_type); 
    5353        os << ends; 
    5454         
     
    5656} 
    5757 
    58 void CCardDAVQueryReport::GenerateXML(std::ostream& os, const cdstring& search_prop, const cdstring& search_text, const cdstring& match_type) 
     58void CCardDAVQueryReport::GenerateXML(std::ostream& os, const cdstrvect& search_props, const cdstring& search_text, const cdstring& match_type) 
    5959{ 
    6060        using namespace xmllib; 
     
    7171        //           <C:text-match match-type="...">...</C:text-match> 
    7272        //         </C:prop-filter> 
     73        //     ... 
    7374        //       </C:filter> 
    7475        //   ... 
     
    9899        xmllib::XMLNode* filter = new xmllib::XMLNode(&xmldoc, query, cElement_filter.Name(), carddav_namespc); 
    99100         
    100         // <CardDAV:prop-filter name="..."> element 
    101         xmllib::XMLNode* prop_filter = new xmllib::XMLNode(&xmldoc, filter, cElement_propfilter.Name(), carddav_namespc); 
    102         prop_filter->AddAttribute(cAttribute_name.Name(), search_prop); 
     101        for(cdstrvect::const_iterator iter = search_props.begin(); iter != search_props.end(); iter++) 
     102        { 
     103                // <CardDAV:prop-filter name="..."> element 
     104                xmllib::XMLNode* prop_filter = new xmllib::XMLNode(&xmldoc, filter, cElement_propfilter.Name(), carddav_namespc); 
     105                prop_filter->AddAttribute(cAttribute_name.Name(), *iter); 
    103106 
    104         // <C:text-match match-type="...">...</C:text-match> 
    105         xmllib::XMLNode* text_match = new xmllib::XMLNode(&xmldoc, prop_filter, cElement_textmatch.Name(), carddav_namespc, search_text); 
    106         text_match->AddAttribute(cAttribute_matchtype.Name(), match_type); 
     107                // <C:text-match match-type="...">...</C:text-match> 
     108                xmllib::XMLNode* text_match = new xmllib::XMLNode(&xmldoc, prop_filter, cElement_textmatch.Name(), carddav_namespc, search_text); 
     109                text_match->AddAttribute(cAttribute_matchtype.Name(), match_type); 
     110        } 
    107111 
    108112        // Now we have the complete document, so write it out (no indentation) 
  • Mulberry/branches/v4.1d1/Sources_Common/HTTP/CardDAVClient/CCardDAVQueryReport.h

    r148 r149  
    3737{ 
    3838public: 
    39         CCardDAVQueryReport(CWebDAVSession* session, const cdstring& ruri, const cdstring& search_prop, const cdstring& search_text, const cdstring& match_type); 
     39        CCardDAVQueryReport(CWebDAVSession* session, const cdstring& ruri, const cdstrvect& search_props, const cdstring& search_text, const cdstring& match_type); 
    4040        virtual ~CCardDAVQueryReport(); 
    4141 
    4242protected: 
    43         void    InitRequestData(const cdstring& search_prop, const cdstring& search_text, const cdstring& match_type); 
     43        void    InitRequestData(const cdstrvect& search_props, const cdstring& search_text, const cdstring& match_type); 
    4444         
    45         void    GenerateXML(std::ostream& os, const cdstring& search_prop, const cdstring& search_text, const cdstring& match_type); 
     45        void    GenerateXML(std::ostream& os, const cdstrvect& search_props, const cdstring& search_text, const cdstring& match_type); 
    4646}; 
    4747 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/Address/CAdbkAddress.cp

    r96 r149  
    134134 
    135135// Compare specific field 
    136 bool CAdbkAddress::Search(const cdstring& text, EAddressField field) const 
     136bool CAdbkAddress::Search(const cdstring& text, const CAddressFields& fields) const 
    137137{ 
    138138        bool result = false; 
    139139 
    140         switch(field) 
    141         { 
    142         case CAdbkAddress::eName: 
    143                 result = GetName().PatternMatch(text); 
    144                 break; 
    145         case CAdbkAddress::eNickName: 
    146                 result = GetADL().PatternMatch(text); 
    147                 break; 
    148         case CAdbkAddress::eEmail: 
    149                 result = GetMailAddress().PatternMatch(text); 
    150                 if (!result) 
    151                 { 
    152                         for(emailmap::const_iterator iter = GetEmails().begin(); !result && (iter != GetEmails().end()); iter++) 
     140        for(CAddressFields::const_iterator iter = fields.begin(); iter != fields.end(); iter++) 
     141        { 
     142                switch(*iter) 
     143                { 
     144                case CAdbkAddress::eName: 
     145                        result = GetName().PatternMatch(text); 
     146                        break; 
     147                case CAdbkAddress::eNickName: 
     148                        result = GetADL().PatternMatch(text); 
     149                        break; 
     150                case CAdbkAddress::eEmail: 
     151                        result = GetMailAddress().PatternMatch(text); 
     152                        if (!result) 
     153                        { 
     154                                for(emailmap::const_iterator iter = GetEmails().begin(); !result && (iter != GetEmails().end()); iter++) 
     155                                        result = (*iter).second.PatternMatch(text); 
     156                        } 
     157                        break; 
     158                case CAdbkAddress::eCalendar: 
     159                        result = GetCalendar().PatternMatch(text); 
     160                        break; 
     161                case CAdbkAddress::eCompany: 
     162                        result = GetCompany().PatternMatch(text); 
     163                        break; 
     164                case CAdbkAddress::eAddress: 
     165                        for(addrmap::const_iterator iter = GetAddresses().begin(); !result && (iter != GetAddresses().end()); iter++) 
    153166                                result = (*iter).second.PatternMatch(text); 
    154                 } 
    155                 break; 
    156         case CAdbkAddress::eCalendar: 
    157                 result = GetCalendar().PatternMatch(text); 
    158                 break; 
    159         case CAdbkAddress::eCompany: 
    160                 result = GetCompany().PatternMatch(text); 
    161                 break; 
    162         case CAdbkAddress::eAddress: 
    163                 for(addrmap::const_iterator iter = GetAddresses().begin(); !result && (iter != GetAddresses().end()); iter++) 
    164                         result = (*iter).second.PatternMatch(text); 
    165                 break; 
    166         case CAdbkAddress::ePhoneWork: 
    167                 result = GetPhone(eWorkPhoneType).PatternMatch(text); 
    168                 break; 
    169         case CAdbkAddress::ePhoneHome: 
    170                 result = GetPhone(eHomePhoneType).PatternMatch(text); 
    171                 break; 
    172         case CAdbkAddress::eFax: 
    173                 result = GetPhone(eFaxType).PatternMatch(text) || 
    174                                         GetPhone(eHomeFaxType).PatternMatch(text) || 
    175                                         GetPhone(eWorkFaxType).PatternMatch(text); 
    176                 break; 
    177         case CAdbkAddress::eURL: 
    178                 result = GetURL().PatternMatch(text); 
    179                 break; 
    180         case CAdbkAddress::eNotes: 
    181                 result = GetNotes().PatternMatch(text); 
    182                 break; 
    183         default:; 
    184         } 
    185          
     167                        break; 
     168                case CAdbkAddress::ePhoneWork: 
     169                        result = GetPhone(eWorkPhoneType).PatternMatch(text); 
     170                        break; 
     171                case CAdbkAddress::ePhoneHome: 
     172                        result = GetPhone(eHomePhoneType).PatternMatch(text); 
     173                        break; 
     174                case CAdbkAddress::eFax: 
     175                        result = GetPhone(eFaxType).PatternMatch(text) || 
     176                                                GetPhone(eHomeFaxType).PatternMatch(text) || 
     177                                                GetPhone(eWorkFaxType).PatternMatch(text); 
     178                        break; 
     179                case CAdbkAddress::eURL: 
     180                        result = GetURL().PatternMatch(text); 
     181                        break; 
     182                case CAdbkAddress::eNotes: 
     183                        result = GetNotes().PatternMatch(text); 
     184                        break; 
     185                default:; 
     186                } 
     187                 
     188                if (result) 
     189                        break; 
     190        } 
     191 
    186192        return result; 
    187193} 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/Address/CAdbkAddress.h

    r86 r149  
    106106        }; 
    107107 
     108        typedef vector<EAddressField> CAddressFields; 
    108109        typedef multimap<EEmailType, cdstring>  emailmap; 
    109110        typedef multimap<EAddressType, cdstring> addrmap; 
     
    151152        static void ExpandMatch(EAddressMatch match, cdstring& str); 
    152153 
    153         bool Search(const cdstring& text, CAdbkAddress::EAddressField field) const;     // Compare specific field 
     154        bool Search(const cdstring& text, const CAdbkAddress::CAddressFields& fields) const;    // Compare specific fields 
    154155 
    155156        void SetEntry(const char* theEntry)                                                             // Set entry 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/Address/CGroup.cp

    r19 r149  
    9090 
    9191// Compare specific field 
    92 bool CGroup::Search(const cdstring& text, CAdbkAddress::EAddressField field) const 
     92bool CGroup::Search(const cdstring& text, const CAdbkAddress::CAddressFields& fields) const 
    9393{ 
    9494        bool result = false; 
    9595 
    96         switch(field) 
     96        for(CAdbkAddress::CAddressFields::const_iterator iter = fields.begin(); iter != fields.end(); iter++) 
    9797        { 
    98         case CAdbkAddress::eName: 
    99                 result = GetName().PatternMatch(text); 
    100                 break; 
    101         case CAdbkAddress::eNickName: 
    102                 result = GetNickName().PatternMatch(text); 
    103                 break; 
    104         default:; 
     98                switch(*iter) 
     99                { 
     100                case CAdbkAddress::eName: 
     101                        result = GetName().PatternMatch(text); 
     102                        break; 
     103                case CAdbkAddress::eNickName: 
     104                        result = GetNickName().PatternMatch(text); 
     105                        break; 
     106                default:; 
     107                } 
     108                 
     109                if (result) 
     110                        break; 
    105111        } 
    106112         
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/Address/CGroup.h

    r19 r149  
    6868        int operator==(const CGroup& grp) const;                                        // Compare with another 
    6969 
    70         bool Search(const cdstring& text, CAdbkAddress::EAddressField field) const;     // Compare specific field 
     70        bool Search(const cdstring& text, const CAdbkAddress::CAddressFields& fields) const;    // Compare specific field 
    7171 
    7272        void SetEntry(const char* theEntry)                                                             // Set entry 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/AddressBook/CAddressBook.cp

    r148 r149  
    14651465 
    14661466// Do search 
    1467 void CAddressBook::SearchAddress(const cdstring& name, CAdbkAddress::EAddressMatch match, CAdbkAddress::EAddressField field, CAddressList& addr_list) 
     1467void CAddressBook::SearchAddress(const cdstring& name, CAdbkAddress::EAddressMatch match, const CAdbkAddress::CAddressFields& fields, CAddressList& addr_list) 
    14681468{ 
    14691469        // Do remote lookup only if not open 
    14701470        if (!IsOpen()) 
    1471                 mProtocol->SearchAddress(this, name, match, field, addr_list); 
     1471                mProtocol->SearchAddress(this, name, match, fields, addr_list); 
    14721472        else 
    14731473        { 
     
    14851485                                 
    14861486                        // Do comparison of specific field 
    1487                         result = addr->Search(matchit, field); 
     1487                        result = addr->Search(matchit, fields); 
    14881488 
    14891489                        // Check for matching item 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/AddressBook/CAddressBook.h

    r86 r149  
    287287        void    SearchAddress(const cdstring& name, 
    288288                                                                        CAdbkAddress::EAddressMatch match, 
    289                                                                         CAdbkAddress::EAddressField field, 
     289                                                                        const CAdbkAddress::CAddressFields& fields, 
    290290                                                                        CAddressList& addr_list);       // Do search 
    291291 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/AddressBook/CAddressBookManager.cp

    r96 r149  
    913913void CAddressBookManager::SearchAddress(const cdstring& name, CAdbkAddress::EAddressMatch match, CAdbkAddress::EAddressField field, CAddressList& results) 
    914914{ 
     915        // Search 
     916        CAdbkAddress::CAddressFields fields; 
     917        fields.push_back(field); 
     918        SearchAddress(name, match, fields, results); 
     919} 
     920 
     921// Do search 
     922void CAddressBookManager::SearchAddress(const cdstring& name, CAdbkAddress::EAddressMatch match, const CAdbkAddress::CAddressFields& fields, CAddressList& results) 
     923{ 
    915924        // Look through all address books 
    916925        for(CAddressBookList::const_iterator iter = mAdbkSearch.begin(); iter != mAdbkSearch.end(); iter++) 
     
    922931#endif 
    923932 
    924                 (*iter)->SearchAddress(name, match, field, results); 
     933                (*iter)->SearchAddress(name, match, fields, results); 
    925934        } 
    926935} 
     
    11951204                        // See if it exists 
    11961205                        CAddressList found; 
    1197                         adbk->SearchAddress(email, CAdbkAddress::eMatchExactly, CAdbkAddress::eEmail, found); 
     1206                        CAdbkAddress::CAddressFields fields; 
     1207                        fields.push_back(CAdbkAddress::eEmail); 
     1208                        adbk->SearchAddress(email, CAdbkAddress::eMatchExactly, fields, found); 
    11981209                         
    11991210                        // If its empty then do capture 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/AddressBook/CAddressBookManager.h

    r86 r149  
    147147                                                CAdbkAddress::EAddressField field, 
    148148                                                CAddressList& results);                                                 // Do search 
     149        void SearchAddress(const cdstring& name, 
     150                                                CAdbkAddress::EAddressMatch match, 
     151                                                const CAdbkAddress::CAddressFields& fields, 
     152                                                CAddressList& results);                                                 // Do search 
    149153        void SearchAddress(EAddrLookup method, 
    150154                                                bool expanding, 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/INET_Clients/ACAP/CACAPClient.cp

    r148 r149  
    10491049                                                                        const cdstring& name, 
    10501050                                                                        CAdbkAddress::EAddressMatch match, 
    1051                                                                         CAdbkAddress::EAddressField field, 
     1051                                                                        const CAdbkAddress::CAddressFields& fields, 
    10521052                                                                        CAddressList& addr_list) 
    10531053{ 
     
    10631063        cdstring dataset = GetAdbkDataset(adbk->GetName()); 
    10641064        cdstring criteria = cADBKDATASET_ATTR; 
    1065         switch(field) 
     1065        switch(fields.front())  // OK so this won't do multiple fields, but no one really uses ACAP. 
    10661066        { 
    10671067        case CAdbkAddress::eName: 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/INET_Clients/ACAP/CACAPClient.h

    r148 r149  
    178178                                                                        const cdstring& name, 
    179179                                                                        CAdbkAddress::EAddressMatch match, 
    180                                                                         CAdbkAddress::EAddressField field, 
     180                                                                        const CAdbkAddress::CAddressFields& fields, 
    181181                                                                        CAddressList& addr_list);       // Do search 
    182182 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/INET_Clients/CAdbkClient.h

    r148 r149  
    9595                                                                        const cdstring& name, 
    9696                                                                        CAdbkAddress::EAddressMatch match, 
    97                                                                         CAdbkAddress::EAddressField field, 
     97                                                                        const CAdbkAddress::CAddressFields& fields, 
    9898                                                                        CAddressList& addr_list) = 0;   // Do search 
    9999 
  • Mulberry/branches/v4.1d1/Sources_Common/Mail/INET_Clients/IMSP/CIMSPClient.cp

    r148 r149  
    10191019                                                                        const cdstring& name, 
    10201020                                                                        CAdbkAddress::EAddressMatch match, 
    1021                                                                         CAdbkAddress::EAddressField field, 
     1021                                                                        const CAdbkAddress::CAddressFields& fields, 
    10221022                                                                        CAddressList& addr_list) 
    10231023{ 
     
    10311031                mSearchResults = &addr_list; 
    10321032 
    1033                 cdstring criteria; 
    1034                 switch(field) 
    1035                 { 
    1036                 case CAdbkAddress::eName: 
    1037                         criteria = cADDRESS_NAME; 
    1038                         break; 
    1039                 case CAdbkAddress::eNickName: 
    1040                         criteria = cADDRESS_ALIAS; 
    1041                         break; 
    1042                 case CAdbkAddress::eEmail: 
    1043                         criteria = cADDRESS_EMAIL; 
    1044                         break; 
    1045                 case CAdbkAddress::eCompany: 
    1046                         criteria = cADDRESS_COMPANY; 
    1047                         break; 
    1048                 case CAdbkAddress::eAddress: 
    1049                         criteria = cADDRESS_ADDRESS; 
    1050                         break; 
    1051                 case CAdbkAddress::ePhoneWork: 
    1052                         criteria = cADDRESS_PHONE_WORK; 
    1053                         break; 
    1054                 case CAdbkAddress::ePhoneHome: 
    1055                         criteria = cADDRESS_PHONE_HOME; 
    1056                         break; 
    1057                 case CAdbkAddress::eFax: 
    1058                         criteria = cADDRESS_FAX; 
    1059                         break; 
    1060                 case CAdbkAddress::eURL: 
    1061                         criteria = cADDRESS_URLS; 
    1062                         break; 
    1063                 case CAdbkAddress::eNotes: 
    1064                         criteria = cADDRESS_NOTES; 
    1065                         break; 
    1066                 default:; 
    1067                 } 
    1068  
    10691033                cdstring lookup(name); 
    10701034                CAdbkAddress::ExpandMatch(match, lookup); 
     
    10761040                INETSendString(cSpace); 
    10771041                INETSendString(adbk->GetName(), eQueueProcess); 
    1078                 INETSendString(cSpace); 
    1079                 INETSendString(criteria); 
    1080                 INETSendString(cSpace); 
    1081                 INETSendString(lookup, eQueueProcess); 
     1042                for(CAdbkAddress::CAddressFields::const_iterator iter = fields.begin(); iter != fields.end(); iter++) 
     1043                { 
     1044                        cdstring criteria; 
     1045                        switch(*iter) 
     1046                        { 
     1047                        case CAdbkAddress::eName: 
     1048                                criteria = cADDRESS_NAME; 
     1049                                break; 
     1050                        case CAdbkAddress::eNickName: 
     1051                                criteria = cADDRESS_ALIAS; 
     1052                                break; 
     1053                        case CAdbkAddress::eEmail: 
     1054                                criteria = cADDRESS_EMAIL; 
     1055                                break; 
     1056                        case CAdbkAddress::eCompany: 
     1057                                criteria = cADDRESS_COMPANY; 
     1058                                break; 
     1059                        case CAdbkAddress::eAddress: 
     1060                                criteria = cADDRESS_ADDRESS; 
     1061                                break; 
     1062                        case CAdbkAddress::ePhoneWork: 
     1063                                criteria = cADDRESS_PHONE_WORK; 
     1064                                break; 
     1065                        case CAdbkAddress::ePhoneHome: 
     1066                                criteria = cADDRESS_PHONE_HOME; 
     1067                                break; 
     1068                        case CAdbkAddress::eFax: 
     1069                                criteria = cADDRESS_FAX; 
     1070                                break; 
     1071                        case CAdbkAddress::eURL: 
     1072                                criteria = cADDRESS_URLS; 
     1073                                break; 
     1074</