12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398 |
- #include <kopano/platform.h>
- #include <memory>
- #include <utility>
- #include <kopano/ECRestriction.h>
- #include "vconverter.h"
- #include "valarm.h"
- #include "icalrecurrence.h"
- #include <mapi.h>
- #include <mapiutil.h>
- #include <kopano/mapiext.h>
- #include <kopano/memory.hpp>
- #include <kopano/tie.hpp>
- #include <kopano/CommonUtil.h>
- #include <kopano/Util.h>
- #include "icaluid.h"
- #include "nameids.h"
- #include <kopano/stringutil.h>
- #include <ctime>
- #include <kopano/mapi_ptr.h>
- #include <kopano/namedprops.h>
- #include "icalmem.hpp"
- using namespace std;
- using namespace KCHL;
- namespace KC {
- HRESULT HrCopyString(convert_context& converter, std::string& strCharset, void *base, const char* lpszSrc, WCHAR** lppszDst)
- {
- std::wstring strWide;
- if (lpszSrc)
- strWide = converter.convert_to<wstring>(lpszSrc, rawsize(lpszSrc), strCharset.c_str());
- return HrCopyString(base, strWide.c_str(), lppszDst);
- }
- HRESULT HrCopyString(void *base, const WCHAR* lpwszSrc, WCHAR** lppwszDst)
- {
- WCHAR* lpwszDst = NULL;
- std::wstring strText;
- if(!lpwszSrc)
- strText.clear();
- else
- strText = lpwszSrc;
- HRESULT hr = MAPIAllocateMore((strText.length() + 1) * sizeof(WCHAR),
- base, reinterpret_cast<void **>(&lpwszDst));
- if (hr != hrSuccess)
- return hr;
- wcsncpy(lpwszDst, strText.c_str(), strText.length()+1);
- *lppwszDst = lpwszDst;
- return hrSuccess;
- }
- VConverter::VConverter(LPADRBOOK lpAdrBook, timezone_map *mapTimeZones, LPSPropTagArray lpNamedProps, const std::string& strCharset, bool blCensor, bool bNoRecipients, IMailUser *lpMailUser)
- {
- m_lpAdrBook = lpAdrBook;
- m_mapTimeZones = mapTimeZones;
- m_iCurrentTimeZone = m_mapTimeZones->end();
- m_lpNamedProps = lpNamedProps;
- m_strCharset = strCharset;
- m_lpMailUser = lpMailUser;
- m_bCensorPrivate = blCensor;
- m_bNoRecipients = bNoRecipients;
- m_ulUserStatus = 0;
- }
- HRESULT VConverter::HrICal2MAPI(icalcomponent *lpEventRoot, icalcomponent *lpEvent, icalitem *lpPrevItem, icalitem **lppRet)
- {
- HRESULT hr = hrSuccess;
- std::unique_ptr<icalitem> lpIcalItem;
- icalproperty_method icMethod;
- icalproperty *lpicLastModified = NULL;
- icaltimetype icLastModifed;
- bool bIsAllday;
-
- hr = HrRetrieveAlldayStatus(lpEvent, &bIsAllday);
- if (hr != hrSuccess)
- goto exit;
-
- if (*lppRet != NULL && lpPrevItem != NULL && lpPrevItem == *lppRet) {
- hr = HrAddException(lpEventRoot, lpEvent, bIsAllday, lpPrevItem);
- if (hr == hrSuccess)
- goto exit;
- }
- lpIcalItem.reset(new icalitem);
- if ((hr = MAPIAllocateBuffer(sizeof(void*), &lpIcalItem->base)) != hrSuccess)
- goto exit;
- lpIcalItem->lpRecurrence = NULL;
-
- icMethod = icalcomponent_get_method(lpEventRoot);
- lpicLastModified = icalcomponent_get_first_property(lpEvent, ICAL_LASTMODIFIED_PROPERTY);
- if (lpicLastModified)
- icLastModifed = icalproperty_get_lastmodified(lpicLastModified);
- else
- icLastModifed = icaltime_null_time();
-
- lpIcalItem->tLastModified = icaltime_as_timet(icLastModifed);
-
- hr = HrAddUids(lpEvent, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
-
- hr = HrAddRecurrenceID(lpEvent, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
- hr = HrAddStaticProps(icMethod, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
- hr = HrAddSimpleHeaders(lpEvent, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
- hr = HrAddXHeaders(lpEvent, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
- hr = HrAddCategories(lpEvent, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
- if (icMethod == ICAL_METHOD_REPLY)
- hr = HrAddReplyRecipients(lpEvent, lpIcalItem.get());
- else
- hr = HrAddRecipients(lpEvent, lpIcalItem.get(), &lpIcalItem->lstMsgProps, &lpIcalItem->lstRecips);
- if (hr != hrSuccess)
- goto exit;
-
- hr = HrResolveUser(lpIcalItem->base, &(lpIcalItem->lstRecips));
- if (hr != hrSuccess)
- goto exit;
-
- hr = HrAddBaseProperties(icMethod, lpEvent, lpIcalItem->base, false, &lpIcalItem->lstMsgProps);
- if (hr != hrSuccess)
- goto exit;
- hr = HrAddBusyStatus(lpEvent, icMethod, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
-
-
- hr = HrAddTimes(icMethod, lpEventRoot, lpEvent, bIsAllday, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
-
- hr = HrAddReminder(lpEventRoot, lpEvent, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
-
- hr = HrAddRecurrence(lpEventRoot, lpEvent, bIsAllday, lpIcalItem.get());
- if (hr != hrSuccess)
- goto exit;
- *lppRet = lpIcalItem.release();
- exit:
- if (lpIcalItem != nullptr)
- MAPIFreeBuffer(lpIcalItem->base);
- return hr;
- }
- HRESULT VConverter::HrGetUID(icalcomponent *lpEvent, std::string *strUid)
- {
- const char *uid = NULL;
- icalproperty *icProp = icalcomponent_get_first_property(lpEvent,
- ICAL_UID_PROPERTY);
- if (icProp == NULL)
- return MAPI_E_NOT_FOUND;
- uid = icalproperty_get_uid(icProp);
- if (uid == NULL || strcmp(uid,"") == 0)
- return MAPI_E_NOT_FOUND;
- *strUid = uid;
- return hrSuccess;
- }
- HRESULT VConverter::HrMakeBinaryUID(const std::string &strUid, void *base, SPropValue *lpPropValue)
- {
- SPropValue sPropValue;
- std::string strBinUid;
- std::string strByteArrayID = "040000008200E00074C5B7101A82E008";
-
-
-
-
- if (strUid.compare(0, strByteArrayID.length(), strByteArrayID) == 0)
-
- strBinUid = hex2bin(strUid);
- else
-
- HrMakeBinUidFromICalUid(strUid, &strBinUid);
-
- sPropValue.Value.bin.cb = strBinUid.size();
- HRESULT hr = MAPIAllocateMore(sPropValue.Value.bin.cb, base,
- reinterpret_cast<void **>(&sPropValue.Value.bin.lpb));
- if (hr != hrSuccess)
- return hr;
- memcpy(sPropValue.Value.bin.lpb, strBinUid.data(), sPropValue.Value.bin.cb);
-
- lpPropValue->Value.bin.cb = sPropValue.Value.bin.cb;
- lpPropValue->Value.bin.lpb = sPropValue.Value.bin.lpb;
- return hrSuccess;
- }
- bool VConverter::bIsUserLoggedIn(const std::wstring &strUser)
- {
- HRESULT hr = hrSuccess;
- memory_ptr<SPropValue> lpUserProp;
-
- if (m_lpMailUser)
- hr = HrGetOneProp(m_lpMailUser, PR_SMTP_ADDRESS_W, &~lpUserProp);
- else
- hr = MAPI_E_CALL_FAILED;
- if (hr != hrSuccess)
- return false;
- return wcsncmp(lpUserProp->Value.lpszW, strUser.c_str(), strUser.length()) == 0;
- }
- HRESULT VConverter::HrResolveUser(void *base , std::list<icalrecip> *lplstIcalRecip)
- {
- if (m_lpAdrBook == nullptr)
-
- return hrSuccess;
- HRESULT hr = hrSuccess;
- memory_ptr<SPropValue> lpUsrEidProp;
- adrlist_ptr lpAdrList;
- memory_ptr<ENTRYID> lpDDEntryID;
- ULONG cbDDEntryID;
- object_ptr<IABContainer> lpAddrFolder;
- memory_ptr<FlagList> lpFlagList;
- icalrecip icalRecipient;
- ULONG ulRecpCnt = 0;
- ULONG ulRetn = 0;
- ULONG ulObjType = 0;
- ULONG cbEID = 0;
- if (lplstIcalRecip->empty())
- return hr;
-
-
- if(m_lpMailUser)
- HrGetOneProp(m_lpMailUser, PR_ENTRYID, &~lpUsrEidProp);
- ulRecpCnt = lplstIcalRecip->size();
- hr = MAPIAllocateBuffer(CbNewFlagList(ulRecpCnt), &~lpFlagList);
- if (hr != hrSuccess)
- return hr;
- lpFlagList->cFlags = ulRecpCnt;
- hr = MAPIAllocateBuffer(CbNewADRLIST(ulRecpCnt), &~lpAdrList);
- if (hr != hrSuccess)
- return hr;
- lpAdrList->cEntries = ulRecpCnt;
- ulRecpCnt = 0;
- for (const auto &recip : *lplstIcalRecip) {
- lpAdrList->aEntries[ulRecpCnt].cValues = 1;
- hr = MAPIAllocateBuffer(sizeof(SPropValue), (void **) &lpAdrList->aEntries[ulRecpCnt].rgPropVals);
- if (hr != hrSuccess)
- return hr;
- lpAdrList->aEntries[ulRecpCnt].rgPropVals[0].ulPropTag = PR_DISPLAY_NAME_W;
- lpAdrList->aEntries[ulRecpCnt].rgPropVals[0].Value.lpszW = const_cast<wchar_t *>(recip.strEmail.c_str());
- lpFlagList->ulFlag[ulRecpCnt++] = MAPI_UNRESOLVED;
- }
- hr = m_lpAdrBook->GetDefaultDir(&cbDDEntryID, &~lpDDEntryID);
- if (hr != hrSuccess)
- return hr;
- hr = m_lpAdrBook->OpenEntry(cbDDEntryID, lpDDEntryID, &IID_IABContainer, 0, &ulObjType, &~lpAddrFolder);
- if (hr != hrSuccess)
- return hr;
- hr = lpAddrFolder->ResolveNames(NULL, MAPI_UNICODE, lpAdrList, lpFlagList);
- if (hr != hrSuccess)
- return hr;
-
- for (icalRecipient = lplstIcalRecip->front(), ulRecpCnt = 0;
- ulRecpCnt < lplstIcalRecip->size(); ++ulRecpCnt) {
- if (lpFlagList->ulFlag[ulRecpCnt] == MAPI_RESOLVED)
- {
- auto lpMappedProp = PCpropFindProp(lpAdrList->aEntries[ulRecpCnt].rgPropVals, lpAdrList->aEntries[ulRecpCnt].cValues, PR_DISPLAY_NAME_W);
- if (lpMappedProp)
- icalRecipient.strName = lpMappedProp->Value.lpszW;
- }
-
-
- auto lpMappedProp = PCpropFindProp(lpAdrList->aEntries[ulRecpCnt].rgPropVals, lpAdrList->aEntries[ulRecpCnt].cValues, PR_ENTRYID);
- if (lpMappedProp && lpUsrEidProp)
- hr = m_lpAdrBook->CompareEntryIDs(lpUsrEidProp->Value.bin.cb, (LPENTRYID)lpUsrEidProp->Value.bin.lpb, lpMappedProp->Value.bin.cb, (LPENTRYID)lpMappedProp->Value.bin.lpb , 0 , &ulRetn);
- if (hr == hrSuccess && ulRetn == TRUE)
- m_ulUserStatus = icalRecipient.ulTrackStatus;
-
- if (lpFlagList->ulFlag[ulRecpCnt] == MAPI_RESOLVED && lpMappedProp) {
- hr = MAPIAllocateMore(lpMappedProp->Value.bin.cb, base, (void**)&icalRecipient.lpEntryID);
- if (hr != hrSuccess)
- return hr;
- icalRecipient.cbEntryID = lpMappedProp->Value.bin.cb;
- memcpy(icalRecipient.lpEntryID, lpMappedProp->Value.bin.lpb, lpMappedProp->Value.bin.cb);
- } else {
- memory_ptr<ENTRYID> lpEID;
- hr = ECCreateOneOff((LPTSTR)icalRecipient.strName.c_str(), (LPTSTR)L"SMTP", (LPTSTR)icalRecipient.strEmail.c_str(), MAPI_UNICODE, &cbEID, &~lpEID);
- if (hr == hrSuccess) {
-
- hr = MAPIAllocateMore(cbEID, base, (void**)&icalRecipient.lpEntryID);
- if (hr != hrSuccess)
- return hr;
- icalRecipient.cbEntryID = cbEID;
- memcpy(icalRecipient.lpEntryID, lpEID, cbEID);
- }
- }
- lplstIcalRecip->push_back(icalRecipient);
- lplstIcalRecip->pop_front();
- icalRecipient = lplstIcalRecip->front();
- }
- return hrSuccess;
- }
- HRESULT VConverter::HrCompareUids(icalitem *lpIcalItem, icalcomponent *lpicEvent)
- {
- HRESULT hr = hrSuccess;
- memory_ptr<SPropValue> lpPropVal;
- std::string strUid;
- int res;
-
- hr = HrGetUID(lpicEvent, &strUid);
- if (hr != hrSuccess)
- return hr;
- hr = MAPIAllocateBuffer(sizeof(SPropValue), &~lpPropVal);
- if (hr != hrSuccess)
- return hr;
- hr = HrMakeBinaryUID(strUid, lpPropVal, lpPropVal);
- if (hr != hrSuccess)
- return hr;
- lpPropVal->ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_GOID], PT_BINARY);
- hr = Util::CompareProp(lpPropVal, &lpIcalItem->sBinGuid, createLocaleFromName(""), &res);
- if (hr != hrSuccess || res != 0)
- hr = MAPI_E_BAD_VALUE;
- return hr;
- }
- HRESULT VConverter::HrAddUids(icalcomponent *lpicEvent, icalitem *lpIcalItem)
- {
- SPropValue sPropValue;
- std::string strUid;
-
-
-
-
- HRESULT hr = HrGetUID(lpicEvent, &strUid);
- if (hr != hrSuccess)
- hr = HrGenerateUid(&strUid);
- if (hr != hrSuccess)
- return hr;
- hr = HrMakeBinaryUID(strUid, lpIcalItem->base, &sPropValue);
- if (hr != hrSuccess)
- return hr;
-
-
- hr = HrHandleExceptionGuid(lpicEvent, lpIcalItem->base, &sPropValue);
- if (hr != hrSuccess)
- return hr;
-
- sPropValue.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_GOID], PT_BINARY);
- lpIcalItem->lstMsgProps.push_back(sPropValue);
-
-
-
- if(IsOutlookUid(strUid))
- strUid.replace(32, 8, "00000000");
- hr = HrMakeBinaryUID(strUid, lpIcalItem->base, &sPropValue);
- if (hr != hrSuccess)
- return hr;
-
- sPropValue.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_CLEANID], PT_BINARY);
- lpIcalItem->lstMsgProps.push_back(sPropValue);
-
- lpIcalItem->sBinGuid = sPropValue;
- return hrSuccess;
- }
- HRESULT VConverter::HrHandleExceptionGuid(icalcomponent *lpiEvent, void *base, SPropValue *lpsProp)
- {
- std::string strUid;
- std::string strBinUid;
- icalproperty *icProp = NULL;
- icaltimetype icTime;
- char strHexDate[] = "00000000";
-
- if (lpsProp == NULL)
- return MAPI_E_INVALID_PARAMETER;
- icProp = icalcomponent_get_first_property(lpiEvent, ICAL_RECURRENCEID_PROPERTY);
- if (icProp == NULL)
- return hrSuccess;
- strUid = bin2hex(lpsProp->Value.bin.cb, lpsProp->Value.bin.lpb);
- icTime = icaltime_from_timet_with_zone(ICalTimeTypeToUTC(lpiEvent, icProp), 0, nullptr);
- sprintf(strHexDate,"%04x%02x%02x", icTime.year, icTime.month, icTime.day);
-
- strUid.replace(32, 8, strHexDate);
- strBinUid = hex2bin(strUid);
- lpsProp->Value.bin.cb = strBinUid.size();
- HRESULT hr = MAPIAllocateMore(strBinUid.size(), base,
- reinterpret_cast<void **>(&lpsProp->Value.bin.lpb));
- if (hr != hrSuccess)
- return hr;
- memcpy(lpsProp->Value.bin.lpb, strBinUid.data(), lpsProp->Value.bin.cb);
- return hrSuccess;
- }
- HRESULT VConverter::HrAddRecurrenceID(icalcomponent *lpiEvent, icalitem *lpIcalItem)
- {
- SPropValue sPropVal;
- icalproperty *icProp = icalcomponent_get_first_property(lpiEvent,
- ICAL_RECURRENCEID_PROPERTY);
- if (icProp == NULL)
- return hrSuccess;
-
-
- if (icalproperty_get_recurrenceid(icProp).is_date)
- {
-
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURSTARTTIME], PT_LONG);
- sPropVal.Value.ul = 0;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
-
-
-
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURENDTIME], PT_LONG);
- sPropVal.Value.ul = 24 * 4096;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- }
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRINGBASE], PT_SYSTIME);
- if (icalproperty_get_recurrenceid(icProp).is_date)
- UnixTimeToFileTime(icaltime_as_timet(icalproperty_get_recurrenceid (icProp)), &sPropVal.Value.ft);
- else
- UnixTimeToFileTime(ICalTimeTypeToLocal(icProp), &sPropVal.Value.ft);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_ISEXCEPTION], PT_BOOLEAN);
- sPropVal.Value.b = true;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- return hrSuccess;
- }
- HRESULT VConverter::HrAddStaticProps(icalproperty_method icMethod, icalitem *lpIcalItem)
- {
- HRESULT hr = hrSuccess;
- SPropValue sPropVal;
-
- sPropVal.Value.ul = seOpenToDelete | seOpenToCopy | seOpenToMove | seCoerceToInbox | seOpenForCtxMenu;
-
- if(icMethod == ICAL_METHOD_REPLY || icMethod == ICAL_METHOD_REQUEST || icMethod == ICAL_METHOD_CANCEL)
- {
-
- sPropVal.Value.ul |= seCannotUndoDelete | seCannotUndoCopy | seCannotUndoMove;
-
- sPropVal.Value.ul &= ~(seCoerceToInbox | seOpenForCtxMenu);
- }
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_SIDEEFFECT], PT_LONG);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_SENDASICAL], PT_BOOLEAN);
- sPropVal.Value.b = 1;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_COMMONASSIGN], PT_LONG);
- sPropVal.Value.ul = 0;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- return hr;
- }
-
- HRESULT VConverter::HrAddSimpleHeaders(icalcomponent *lpicEvent, icalitem *lpIcalItem)
- {
- HRESULT hr = hrSuccess;
- SPropValue sPropVal;
- icalproperty *lpicProp = NULL;
- int lPriority;
- int lClass = 0;
- std::string strClass;
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_SUMMARY_PROPERTY);
- if (lpicProp){
- sPropVal.ulPropTag = PR_SUBJECT_W;
- hr = HrCopyString(m_converter, m_strCharset, lpIcalItem->base, icalcomponent_get_summary(lpicEvent), &sPropVal.Value.lpszW);
- if (hr != hrSuccess)
- sPropVal.Value.lpszW = const_cast<wchar_t *>(L"");
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- } else {
- lpIcalItem->lstDelPropTags.push_back(PR_SUBJECT);
- }
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_DESCRIPTION_PROPERTY);
- if (!lpicProp)
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_COMMENT_PROPERTY);
- if (lpicProp){
- sPropVal.ulPropTag = PR_BODY_W;
- hr = HrCopyString(m_converter, m_strCharset, lpIcalItem->base, icalproperty_get_description(lpicProp), &sPropVal.Value.lpszW);
- if (hr != hrSuccess)
- sPropVal.Value.lpszW = const_cast<wchar_t *>(L"");
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- } else {
- lpIcalItem->lstDelPropTags.push_back(PR_BODY_W);
- }
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_LOCATION_PROPERTY);
- if (lpicProp) {
- hr = HrCopyString(m_converter, m_strCharset, lpIcalItem->base, icalproperty_get_location(lpicProp), &sPropVal.Value.lpszW);
- if (hr != hrSuccess)
- sPropVal.Value.lpszW = const_cast<wchar_t *>(L"");
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_LOCATION], PT_UNICODE);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MEETINGLOCATION], PT_UNICODE);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- } else {
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_LOCATION], PT_UNICODE));
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MEETINGLOCATION], PT_UNICODE));
- }
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_PRIORITY_PROPERTY);
- if (lpicProp) {
- lPriority = icalproperty_get_priority(lpicProp);
-
- if (lPriority == 0)
- ;
- else if (lPriority < 5)
- lPriority = 1;
- else if (lPriority > 5)
- lPriority = -1;
- else
- lPriority = 0;
-
- sPropVal.ulPropTag = PR_IMPORTANCE;
- sPropVal.Value.ul = lPriority + 1;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- sPropVal.ulPropTag = PR_PRIORITY;
- sPropVal.Value.l = lPriority;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- } else {
- lpIcalItem->lstDelPropTags.push_back(PR_IMPORTANCE);
- lpIcalItem->lstDelPropTags.push_back(PR_PRIORITY);
- }
-
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_CLASS_PROPERTY);
- if (lpicProp){
- lClass = icalproperty_get_class(lpicProp);
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_PRIVATE], PT_BOOLEAN);
- sPropVal.Value.b = (lClass == ICAL_CLASS_PRIVATE);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- }
-
- sPropVal.ulPropTag = PR_SENSITIVITY;
- if (lClass == ICAL_CLASS_PRIVATE)
- sPropVal.Value.ul = 2;
- else if (lClass == ICAL_CLASS_CONFIDENTIAL)
- sPropVal.Value.ul = 3;
- else
- sPropVal.Value.ul = 0;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
- return hrSuccess;
- }
- HRESULT VConverter::HrAddBusyStatus(icalcomponent *lpicEvent, icalproperty_method icMethod, icalitem *lpIcalItem)
- {
- HRESULT hr = hrSuccess;
- SPropValue sPropVal;
- icalproperty* lpicProp = NULL;
-
-
-
-
-
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_BUSYSTATUS], PT_LONG);
-
- if (icMethod == ICAL_METHOD_CANCEL)
- sPropVal.Value.ul = 0;
- else
- sPropVal.Value.ul = 2;
-
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_TRANSP_PROPERTY);
- if (lpicProp) {
- switch (icalproperty_get_transp(lpicProp)) {
- case ICAL_TRANSP_TRANSPARENT:
- case ICAL_TRANSP_TRANSPARENTNOCONFLICT:
- sPropVal.Value.ul = 0;
- break;
- case ICAL_TRANSP_X:
- case ICAL_TRANSP_OPAQUE:
- case ICAL_TRANSP_OPAQUENOCONFLICT:
- case ICAL_TRANSP_NONE:
- sPropVal.Value.ul = 2;
- break;
- }
- }
-
- if((m_bNoRecipients && icMethod == ICAL_METHOD_REQUEST) || m_ulUserStatus == 5) {
-
-
-
-
-
-
- sPropVal.Value.ul = 1;
- }
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
- lpIcalItem->ulFbStatus = sPropVal.Value.ul;
- if (icMethod == ICAL_METHOD_REPLY) {
-
-
- sPropVal.Value.ul = -1;
- } else {
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_X_PROPERTY);
- while (lpicProp) {
-
- if (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-CDO-INTENDEDSTATUS") != 0) {
- lpicProp = icalcomponent_get_next_property(lpicEvent, ICAL_X_PROPERTY);
- continue;
- }
- const char *lpVal = icalproperty_get_x(lpicProp);
- if (lpVal == NULL)
- sPropVal.Value.ul = 2;
- else if (strcmp(lpVal, "FREE") == 0)
- sPropVal.Value.ul = 0;
- else if (strcmp(lpVal, "TENTATIVE") == 0)
- sPropVal.Value.ul = 1;
- else if(strcmp(lpVal, "BUSY") == 0)
- sPropVal.Value.ul = 2;
- else if (strcmp(lpVal, "OOF") == 0)
- sPropVal.Value.ul = 3;
- else
- sPropVal.Value.ul = 2;
- break;
- }
-
- }
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_INTENDEDBUSYSTATUS], PT_LONG);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- return hr;
- }
- HRESULT VConverter::HrAddXHeaders(icalcomponent *lpicEvent, icalitem *lpIcalItem)
- {
- HRESULT hr = hrSuccess;
- SPropValue sPropVal;
- icalproperty* lpicProp = NULL;
- icalvalue *lpicValue = NULL;
- time_t ttCritcalChange = 0;
- int ulMaxCounter = 0;
- bool bHaveCounter = false;
- bool bOwnerApptID = false;
- bool bMozGen = false;
-
-
-
-
- for (auto lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_X_PROPERTY);
- lpicProp != nullptr;
- lpicProp = icalcomponent_get_next_property(lpicEvent, ICAL_X_PROPERTY))
- {
- if (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-CDO-ATTENDEE-CRITICAL-CHANGE") == 0){
- lpicValue = icalvalue_new_from_string(ICAL_DATETIME_VALUE, icalproperty_get_x(lpicProp));
- if (lpicValue == nullptr)
- continue;
- ttCritcalChange = icaltime_as_timet_with_zone(icalvalue_get_datetime(lpicValue), NULL);
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_ATTENDEECRITICALCHANGE], PT_SYSTIME);
- UnixTimeToFileTime(ttCritcalChange, &sPropVal.Value.ft);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- icalvalue_free(lpicValue);
- }else if (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-CDO-OWNER-CRITICAL-CHANGE") == 0){
-
- lpicValue = icalvalue_new_from_string(ICAL_DATETIME_VALUE, icalproperty_get_x(lpicProp));
- if (lpicValue == nullptr)
- continue;
- ttCritcalChange = icaltime_as_timet_with_zone(icalvalue_get_datetime(lpicValue), NULL);
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_OWNERCRITICALCHANGE], PT_SYSTIME);
- UnixTimeToFileTime(ttCritcalChange, &sPropVal.Value.ft);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- icalvalue_free(lpicValue);
- }else if (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-CDO-OWNERAPPTID") == 0){
-
- lpicValue = icalvalue_new_from_string(ICAL_INTEGER_VALUE, icalproperty_get_x(lpicProp));
- if (lpicValue == nullptr)
- continue;
- sPropVal.ulPropTag = PR_OWNER_APPT_ID;
- sPropVal.Value.ul = icalvalue_get_integer(lpicValue);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- bOwnerApptID = true;
- icalvalue_free(lpicValue);
- }else if (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-CDO-APPT-SEQUENCE") == 0){
-
- lpicValue = icalvalue_new_from_string(ICAL_INTEGER_VALUE, icalproperty_get_x(lpicProp));
- if (lpicValue == nullptr)
- continue;
- ulMaxCounter = std::max(ulMaxCounter, icalvalue_get_integer(lpicValue));
- bHaveCounter = true;
- icalvalue_free(lpicValue);
- } else if (strcmp(icalproperty_get_x_name(lpicProp), "X-MOZ-GENERATION") == 0) {
- lpicValue = icalvalue_new_from_string(ICAL_INTEGER_VALUE, icalproperty_get_x(lpicProp));
- if (lpicValue == nullptr)
- continue;
- ulMaxCounter = std::max(ulMaxCounter, icalvalue_get_integer(lpicValue));
- bHaveCounter = bMozGen = true;
- icalvalue_free(lpicValue);
- } else if (strcmp(icalproperty_get_x_name(lpicProp), "X-MOZ-SEND-INVITATIONS") == 0) {
- lpicValue = icalvalue_new_from_string(ICAL_X_VALUE, icalproperty_get_x(lpicProp));
- if (lpicValue == nullptr)
- continue;
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZSENDINVITE], PT_BOOLEAN);
- const char *x = icalvalue_get_x(lpicValue);
- if (x == NULL)
- x = "";
- sPropVal.Value.b = strcmp(x, "TRUE") ? 0 : 1;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- icalvalue_free(lpicValue);
- }
- }
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_SEQUENCE_PROPERTY);
- if (lpicProp) {
- ulMaxCounter = std::max(ulMaxCounter, icalcomponent_get_sequence(lpicEvent));
- bHaveCounter = true;
- }
-
- if (bHaveCounter) {
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_APPTSEQNR], PT_LONG);
- sPropVal.Value.ul = ulMaxCounter;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- }
- if (!bOwnerApptID) {
- sPropVal.ulPropTag = PR_OWNER_APPT_ID;
- sPropVal.Value.ul = -1;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- }
- if (bMozGen) {
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZGEN], PT_LONG);
- sPropVal.Value.ul = ulMaxCounter;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- }
- return hr;
- }
- HRESULT VConverter::HrAddCategories(icalcomponent *lpicEvent, icalitem *lpIcalItem)
- {
- SPropValue sPropVal;
- icalproperty *lpicProp = NULL;
- const char* lpszCategories = NULL;
- std::vector<std::string> vCategories;
- int i;
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_CATEGORIES_PROPERTY);
- if (!lpicProp) {
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_KEYWORDS], PT_MV_STRING8));
- return hrSuccess;
- }
- while (lpicProp != NULL && (lpszCategories = icalproperty_get_categories(lpicProp)) != NULL) {
- vCategories.push_back(lpszCategories);
- lpicProp = icalcomponent_get_next_property(lpicEvent, ICAL_CATEGORIES_PROPERTY);
- }
- HRESULT hr = MAPIAllocateMore(vCategories.size() * sizeof(LPSTR),
- lpIcalItem->base, reinterpret_cast<void **>(&sPropVal.Value.MVszA.lppszA));
- if (hr != hrSuccess)
- return hr;
- i = 0;
- for (const auto &cat : vCategories) {
- int length = cat.length() + 1;
- hr = MAPIAllocateMore(length, lpIcalItem->base, (void **) &sPropVal.Value.MVszA.lppszA[i]);
- if (hr != hrSuccess)
- return hr;
- memcpy(sPropVal.Value.MVszA.lppszA[i++], cat.c_str(), length);
- }
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_KEYWORDS], PT_MV_STRING8);
- sPropVal.Value.MVszA.cValues = vCategories.size();
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- return hrSuccess;
- }
- HRESULT VConverter::HrAddOrganizer(icalitem *lpIcalItem, std::list<SPropValue> *lplstMsgProps, const std::wstring &strEmail, const std::wstring &strName, const std::string &strType, ULONG cbEntryID, LPENTRYID lpEntryID)
- {
- SPropValue sPropVal;
- auto strSearchKey = strToUpper(strType + ":" + m_converter.convert_to<std::string>(strEmail));
- sPropVal.ulPropTag = PR_SENDER_ADDRTYPE_W;
- HRESULT hr = HrCopyString(m_converter, m_strCharset, lpIcalItem->base,
- strType.c_str(), &sPropVal.Value.lpszW);
- if (hr != hrSuccess)
- return hr;
- lplstMsgProps->push_back(sPropVal);
- sPropVal.ulPropTag = PR_SENT_REPRESENTING_ADDRTYPE;
- lplstMsgProps->push_back(sPropVal);
- sPropVal.ulPropTag = PR_SENDER_EMAIL_ADDRESS_W;
- hr = HrCopyString(lpIcalItem->base, strEmail.c_str(), &sPropVal.Value.lpszW);
- if (hr != hrSuccess)
- return hr;
- lplstMsgProps->push_back(sPropVal);
- sPropVal.ulPropTag = PR_SENT_REPRESENTING_EMAIL_ADDRESS;
- lplstMsgProps->push_back(sPropVal);
- sPropVal.ulPropTag = PR_SENDER_NAME_W;
- hr = HrCopyString(lpIcalItem->base, strName.c_str(), &sPropVal.Value.lpszW);
- if (hr != hrSuccess)
- return hr;
- lplstMsgProps->push_back(sPropVal);
- sPropVal.ulPropTag = PR_SENT_REPRESENTING_NAME;
- lplstMsgProps->push_back(sPropVal);
- sPropVal.ulPropTag = PR_SENDER_SEARCH_KEY;
- hr = Util::HrCopyBinary(strSearchKey.length() + 1, (LPBYTE)strSearchKey.c_str(), &sPropVal.Value.bin.cb, &sPropVal.Value.bin.lpb, lpIcalItem->base);
- if (hr != hrSuccess)
- return hr;
- lplstMsgProps->push_back(sPropVal);
- sPropVal.ulPropTag = PR_SENT_REPRESENTING_SEARCH_KEY;
- lplstMsgProps->push_back(sPropVal);
-
- hr = Util::HrCopyBinary(cbEntryID, (LPBYTE)lpEntryID, &sPropVal.Value.bin.cb, &sPropVal.Value.bin.lpb, lpIcalItem->base);
- if (hr != hrSuccess)
- return hr;
- sPropVal.ulPropTag = PR_SENDER_ENTRYID;
- lplstMsgProps->push_back(sPropVal);
- sPropVal.ulPropTag = PR_SENT_REPRESENTING_ENTRYID;
- lplstMsgProps->push_back(sPropVal);
- return hrSuccess;
- }
- HRESULT VConverter::HrAddRecipients(icalcomponent *lpicEvent, icalitem *lpIcalItem, std::list<SPropValue> *lplstMsgProps, std::list<icalrecip> *lplstIcalRecip)
- {
- HRESULT hr = hrSuccess;
- std::wstring strEmail, strName;
- std::string strType;
- icalproperty *lpicProp = NULL;
- icalparameter *lpicParam = NULL;
- icalrecip icrAttendee = {0};
- ULONG cbEntryID = 0;
- LPENTRYID lpEntryID = NULL;
- ULONG cbEntryIDOneOff = 0;
- memory_ptr<ENTRYID> lpEntryIDOneOff;
- memory_ptr<SPropValue> lpsPropVal;
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_ORGANIZER_PROPERTY);
- if (lpicProp) {
- const char *tmp = icalproperty_get_organizer(lpicProp);
- strEmail = m_converter.convert_to<wstring>(tmp, rawsize(tmp), m_strCharset.c_str());
- if (wcsncasecmp(strEmail.c_str(), L"mailto:", 7) == 0)
- strEmail = strEmail.erase(0, 7);
- lpicParam = icalproperty_get_first_parameter(lpicProp, ICAL_CN_PARAMETER);
- tmp = icalparameter_get_cn(lpicParam);
- if (lpicParam != NULL)
- strName = m_converter.convert_to<wstring>(tmp, rawsize(tmp), m_strCharset.c_str());
- else
- strName = strEmail;
- if (bIsUserLoggedIn(strEmail)) {
- static constexpr const SizedSPropTagArray(4, sPropTags) =
- {4, {PR_SMTP_ADDRESS_W, PR_DISPLAY_NAME_W, PR_ADDRTYPE_A, PR_ENTRYID}};
- ULONG count;
- hr = m_lpMailUser->GetProps(sPropTags, 0, &count, &~lpsPropVal);
- if (hr != hrSuccess)
- return hr;
- if (lpsPropVal[0].ulPropTag == PR_SMTP_ADDRESS_W)
- strEmail = lpsPropVal[0].Value.lpszW;
- if (lpsPropVal[1].ulPropTag == PR_DISPLAY_NAME_W)
- strName = lpsPropVal[1].Value.lpszW;
- if (lpsPropVal[2].ulPropTag == PR_ADDRTYPE_A)
- strType = lpsPropVal[2].Value.lpszA;
- if (lpsPropVal[3].ulPropTag == PR_ENTRYID) {
- cbEntryID = lpsPropVal[3].Value.bin.cb;
- lpEntryID = (LPENTRYID)lpsPropVal[3].Value.bin.lpb;
- }
- } else {
- strType = "SMTP";
- hr = ECCreateOneOff((LPTSTR)strName.c_str(), (LPTSTR)L"SMTP", (LPTSTR)strEmail.c_str(), MAPI_UNICODE, &cbEntryIDOneOff, &~lpEntryIDOneOff);
- if (hr != hrSuccess)
- return hr;
- cbEntryID = cbEntryIDOneOff;
- lpEntryID = lpEntryIDOneOff;
- }
-
- hr = MAPIAllocateMore(cbEntryID, lpIcalItem->base, (void**)&icrAttendee.lpEntryID);
- if (hr != hrSuccess)
- return hr;
-
- memcpy(icrAttendee.lpEntryID, lpEntryID, cbEntryID);
- icrAttendee.cbEntryID = cbEntryID;
- icrAttendee.strEmail = strEmail;
- icrAttendee.strName = strName;
- icrAttendee.ulRecipientType = MAPI_ORIG;
- icrAttendee.ulTrackStatus = 0;
-
- lplstIcalRecip->push_back(icrAttendee);
-
- if (!m_bNoRecipients)
- hr = HrAddOrganizer(lpIcalItem, lplstMsgProps, strEmail, strName, strType, cbEntryID, lpEntryID);
- } else if (!m_bNoRecipients && m_lpMailUser) {
-
- static constexpr const SizedSPropTagArray(4, sPropTags) =
- {4, {PR_SMTP_ADDRESS_W, PR_DISPLAY_NAME_W, PR_ADDRTYPE_A, PR_ENTRYID}};
- ULONG count;
- hr = m_lpMailUser->GetProps(sPropTags, 0, &count, &~lpsPropVal);
- if (hr != hrSuccess)
- return hr;
- if (lpsPropVal[0].ulPropTag == PR_SMTP_ADDRESS_W)
- strEmail = lpsPropVal[0].Value.lpszW;
- if (lpsPropVal[1].ulPropTag == PR_DISPLAY_NAME_W)
- strName = lpsPropVal[1].Value.lpszW;
- if (lpsPropVal[2].ulPropTag == PR_ADDRTYPE_A)
- strType = lpsPropVal[2].Value.lpszA;
- if (lpsPropVal[3].ulPropTag == PR_ENTRYID) {
- cbEntryID = lpsPropVal[3].Value.bin.cb;
- lpEntryID = (LPENTRYID)lpsPropVal[3].Value.bin.lpb;
- }
- hr = HrAddOrganizer(lpIcalItem, lplstMsgProps, strEmail, strName, strType, cbEntryID, lpEntryID);
- }
- if (hr != hrSuccess)
- return hr;
- for (lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_ATTENDEE_PROPERTY);
- lpicProp != NULL;
- lpicProp = icalcomponent_get_next_property(lpicEvent, ICAL_ATTENDEE_PROPERTY))
- {
- const char *tmp = icalproperty_get_attendee(lpicProp);
-
- if (!tmp)
-
- continue;
- icrAttendee.strEmail = m_converter.convert_to<wstring>(tmp, rawsize(tmp), m_strCharset.c_str());
- if (wcsncasecmp(icrAttendee.strEmail.c_str(), L"mailto:", 7) == 0)
- icrAttendee.strEmail.erase(0, 7);
-
- if(icrAttendee.strEmail == strEmail)
- continue;
-
- lpicParam = icalproperty_get_first_parameter(lpicProp, ICAL_CN_PARAMETER);
- if (lpicParam) {
- const char *lpszProp = icalparameter_get_cn(lpicParam);
- icrAttendee.strName = m_converter.convert_to<std::wstring>(lpszProp, rawsize(lpszProp), m_strCharset.c_str());
- } else
- icrAttendee.strName = icrAttendee.strEmail;
- lpicParam = icalproperty_get_first_parameter(lpicProp, ICAL_ROLE_PARAMETER);
- if (!lpicParam) {
- icrAttendee.ulRecipientType = MAPI_TO;
- } else {
- switch (icalparameter_get_role(lpicParam)) {
- case ICAL_ROLE_OPTPARTICIPANT:
- icrAttendee.ulRecipientType = MAPI_CC;
- break;
- case ICAL_ROLE_NONPARTICIPANT:
- icrAttendee.ulRecipientType = MAPI_BCC;
- break;
- case ICAL_ROLE_REQPARTICIPANT:
- default:
- icrAttendee.ulRecipientType = MAPI_TO;
- break;
- }
- }
- lpicParam = icalproperty_get_first_parameter(lpicProp, ICAL_PARTSTAT_PARAMETER);
- if (lpicParam) {
- switch (icalparameter_get_partstat(lpicParam)) {
- case ICAL_PARTSTAT_TENTATIVE:
- icrAttendee.ulTrackStatus = 2;
- break;
- case ICAL_PARTSTAT_ACCEPTED:
- icrAttendee.ulTrackStatus = 3;
- break;
- case ICAL_PARTSTAT_DECLINED:
- icrAttendee.ulTrackStatus = 4;
- break;
- case ICAL_PARTSTAT_NEEDSACTION:
- icrAttendee.ulTrackStatus = 5;
- break;
- default:
- icrAttendee.ulTrackStatus = 0;
- break;
- }
- }
-
- lplstIcalRecip->push_back(icrAttendee);
- }
- return hrSuccess;
- }
- HRESULT VConverter::HrAddReplyRecipients(icalcomponent *lpicEvent, icalitem *lpIcalItem)
- {
- HRESULT hr = hrSuccess;
- wstring strEmail, strName;
- icalproperty *lpicProp = NULL;
- icalparameter *lpicParam = NULL;
- icalrecip icrAttendee;
- ULONG cbEntryID;
- memory_ptr<ENTRYID> lpEntryID;
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_ORGANIZER_PROPERTY);
- if (lpicProp) {
- const char *lpszProp = icalproperty_get_organizer(lpicProp);
- icrAttendee.strEmail = m_converter.convert_to<std::wstring>(lpszProp, rawsize(lpszProp), m_strCharset.c_str());
- if (wcsncasecmp(icrAttendee.strEmail.c_str(), L"mailto:", 7) == 0)
- icrAttendee.strEmail.erase(0, 7);
- lpicParam = icalproperty_get_first_parameter(lpicProp, ICAL_CN_PARAMETER);
- if (lpicParam != NULL) {
- lpszProp = icalparameter_get_cn(lpicParam);
- icrAttendee.strName = m_converter.convert_to<std::wstring>(lpszProp, rawsize(lpszProp), m_strCharset.c_str());
- }
- icrAttendee.ulRecipientType = MAPI_TO;
- lpIcalItem->lstRecips.push_back(icrAttendee);
- }
-
- if (!m_bNoRecipients) {
-
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_ATTENDEE_PROPERTY);
- if (lpicProp) {
- const char *lpszProp = icalproperty_get_attendee(lpicProp);
- strEmail = m_converter.convert_to<std::wstring>(lpszProp, rawsize(lpszProp), m_strCharset.c_str());
- if (wcsncasecmp(strEmail.c_str(), L"mailto:", 7) == 0)
- strEmail.erase(0, 7);
- lpicParam = icalproperty_get_first_parameter(lpicProp, ICAL_CN_PARAMETER);
- if (lpicParam) {
- lpszProp = icalparameter_get_cn(lpicParam);
- strName = m_converter.convert_to<std::wstring>(lpszProp, rawsize(lpszProp), m_strCharset.c_str());
- }
- }
- hr = ECCreateOneOff((LPTSTR)strName.c_str(), (LPTSTR)L"SMTP", (LPTSTR)strEmail.c_str(), MAPI_UNICODE, &cbEntryID, &~lpEntryID);
- if (hr != hrSuccess)
- return hr;
- hr = HrAddOrganizer(lpIcalItem, &lpIcalItem->lstMsgProps, strEmail, strName, "SMTP", cbEntryID, lpEntryID);
- if (hr != hrSuccess)
- return hr;
- }
- return hrSuccess;
- }
- HRESULT VConverter::HrAddReminder(icalcomponent *lpicEventRoot, icalcomponent *lpicEvent, icalitem *lpIcalItem)
- {
- SPropValue sPropVal;
- SPropValue sPropMozAck;
- icalcomponent *lpicAlarm = NULL;
- LONG ulRemindBefore = 0;
- time_t ttReminderTime = 0;
- time_t ttReminderNext = 0;
- time_t ttMozLastAck = 0;
- time_t ttMozLastAckMax = 0;
- bool bReminderSet = false;
- bool bHasMozAck = false;
- icalproperty* lpicDTStartProp = NULL;
- icalproperty* lpicProp = NULL;
- icalvalue *lpicValue = NULL;
- std::string strSuffix;
- lpicAlarm = icalcomponent_get_first_component(lpicEvent, ICAL_VALARM_COMPONENT);
- if (lpicAlarm == NULL) {
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERSET], PT_BOOLEAN);
- sPropVal.Value.b = false;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERTIME], PT_SYSTIME));
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERNEXTTIME], PT_SYSTIME));
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERMINUTESBEFORESTART], PT_LONG));
-
- return hrSuccess;
- }
- HRESULT hr = HrParseVAlarm(lpicAlarm, &ulRemindBefore, &ttReminderTime,
- &bReminderSet);
- if (hr != hrSuccess)
-
- return hrSuccess;
-
-
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_X_PROPERTY);
- while (lpicProp) {
- if (strcmp(icalproperty_get_x_name(lpicProp), "X-MOZ-LASTACK") == 0){
-
- lpicValue = icalvalue_new_from_string(ICAL_DATETIME_VALUE, icalproperty_get_x(lpicProp));
- ttMozLastAck = icaltime_as_timet_with_zone(icalvalue_get_datetime(lpicValue), NULL);
- if(ttMozLastAck > ttMozLastAckMax)
- ttMozLastAckMax = ttMozLastAck;
- icalvalue_free(lpicValue);
- bHasMozAck = true;
- }
- else if (strcmp(icalproperty_get_x_name(lpicProp), "X-MOZ-SNOOZE-TIME") == 0) {
-
- lpicValue = icalvalue_new_from_string(ICAL_DATETIME_VALUE, icalproperty_get_x(lpicProp));
- ttReminderNext = icaltime_as_timet_with_zone(icalvalue_get_datetime(lpicValue), NULL);
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERNEXTTIME], PT_SYSTIME);
- UnixTimeToFileTime(ttReminderNext, &sPropVal.Value.ft);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
-
- strSuffix = icalproperty_get_x_name(lpicProp);
- if(strSuffix.compare("X-MOZ-SNOOZE-TIME") != 0)
- {
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZ_SNOOZE_SUFFIX], PT_SYSTIME);
- strSuffix.erase(0, strlen("X-MOZ-SNOOZE-TIME-"));
- strSuffix.erase(10);
- UnixTimeToFileTime(atoi(strSuffix.c_str()), &sPropVal.Value.ft);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- }
- icalvalue_free(lpicValue);
- } else if (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-RTF") == 0) {
- lpicValue = icalvalue_new_from_string(ICAL_X_VALUE, icalproperty_get_x(lpicProp));
- string rtf = base64_decode(icalvalue_get_x(lpicValue));
- sPropVal.ulPropTag = PR_RTF_COMPRESSED;
- sPropVal.Value.bin.cb = rtf.size();
-
- hr = MAPIAllocateMore(sPropVal.Value.bin.cb,
- lpIcalItem->base, reinterpret_cast<void **>(&sPropVal.Value.bin.lpb));
- if (hr != hrSuccess)
- return hr;
- memcpy(sPropVal.Value.bin.lpb, (LPBYTE)rtf.c_str(), sPropVal.Value.bin.cb);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- icalvalue_free(lpicValue);
- }
- lpicProp = icalcomponent_get_next_property(lpicEvent, ICAL_X_PROPERTY);
- }
- if (bHasMozAck) {
- sPropMozAck.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZLASTACK], PT_SYSTIME);
- UnixTimeToFileTime(ttMozLastAckMax, &sPropMozAck.Value.ft);
- lpIcalItem->lstMsgProps.push_back(sPropMozAck);
- }
- else {
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZLASTACK], PT_SYSTIME));
- }
-
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERSET], PT_BOOLEAN);
- sPropVal.Value.b = bReminderSet;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERMINUTESBEFORESTART], PT_LONG);
- sPropVal.Value.ul = ulRemindBefore;
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
- if (ttReminderTime == 0) {
-
-
- lpicDTStartProp = icalcomponent_get_first_property(lpicEvent, ICAL_DTSTART_PROPERTY);
- if (lpicDTStartProp == NULL)
- return MAPI_E_INVALID_PARAMETER;
- ttReminderTime = ICalTimeTypeToUTC(lpicEventRoot, lpicDTStartProp);
- }
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERTIME], PT_SYSTIME);
- UnixTimeToFileTime(ttReminderTime, &sPropVal.Value.ft);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- if(ttReminderNext == 0)
- {
- if (bReminderSet) {
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERNEXTTIME], PT_SYSTIME);
- UnixTimeToFileTime(ttReminderTime - (ulRemindBefore * 60), &sPropVal.Value.ft);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
- } else {
-
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERNEXTTIME], PT_SYSTIME));
- }
- }
- return hrSuccess;
- }
- HRESULT VConverter::HrAddRecurrence(icalcomponent *lpicEventRoot, icalcomponent *lpicEvent, bool bIsAllday, icalitem *lpIcalItem)
- {
- ICalRecurrence icRecClass;
- SPropValue spSpropVal = {0};
- TIMEZONE_STRUCT zone;
- HRESULT hr = hrSuccess;
- icalproperty *lpicProp = icalcomponent_get_first_property(lpicEvent,
- ICAL_RRULE_PROPERTY);
- if (lpicProp == NULL) {
-
- spSpropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRING], PT_BOOLEAN);
- spSpropVal.Value.b = false;
- lpIcalItem->lstMsgProps.push_back(spSpropVal);
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCESTATE], PT_BINARY));
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCEPATTERN], PT_STRING8));
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCE_START], PT_SYSTIME));
- lpIcalItem->lstDelPropTags.push_back(CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCE_END], PT_SYSTIME));
- lpIcalItem->lpRecurrence = NULL;
-
- return hrSuccess;
- }
- if (!bIsAllday && m_iCurrentTimeZone == m_mapTimeZones->end()) {
-
- return MAPI_E_CORRUPT_DATA;
- } else if (m_iCurrentTimeZone == m_mapTimeZones->end()) {
- hr = HrGetTzStruct("Etc/UTC", &zone);
- if (hr != hrSuccess)
- return hr;
- } else {
- zone = m_iCurrentTimeZone->second;
- }
- hr = icRecClass.HrParseICalRecurrenceRule(zone, lpicEventRoot,
- lpicEvent, bIsAllday, m_lpNamedProps, lpIcalItem);
- if (hr != hrSuccess)
- return hr;
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_X_PROPERTY);
- while (lpicProp) {
- if (strcmp(icalproperty_get_x_name(lpicProp), "X-ZARAFA-REC-PATTERN") == 0 ||
- strcmp(icalproperty_get_x_name(lpicProp), "X-KOPANO-REC-PATTERN") == 0) {
- spSpropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCEPATTERN], PT_UNICODE);
- HrCopyString(m_converter, m_strCharset, lpIcalItem->base, icalproperty_get_x(lpicProp), &spSpropVal.Value.lpszW);
- lpIcalItem->lstMsgProps.push_back(spSpropVal);
- }
- lpicProp = icalcomponent_get_next_property(lpicEvent, ICAL_X_PROPERTY);
- }
- return hrSuccess;
- }
- HRESULT VConverter::HrAddException(icalcomponent *lpEventRoot, icalcomponent *lpEvent, bool bIsAllday, icalitem *lpPrevItem)
- {
- HRESULT hr;
- ICalRecurrence cRec;
- icalitem::exception ex;
- icalproperty_method icMethod = ICAL_METHOD_NONE;
- hr = HrCompareUids(lpPrevItem, lpEvent);
- if (hr != hrSuccess)
- return hr;
- if (lpPrevItem->lpRecurrence == NULL)
-
- return MAPI_E_CORRUPT_DATA;
- icMethod = icalcomponent_get_method(lpEventRoot);
-
- hr = cRec.HrMakeMAPIException(lpEventRoot, lpEvent, lpPrevItem, bIsAllday, m_lpNamedProps, m_strCharset, &ex);
- if (hr != hrSuccess)
- return hr;
- hr = HrAddRecipients(lpEvent, lpPrevItem, &ex.lstMsgProps, &ex.lstRecips);
- if (hr != hrSuccess)
- return hr;
- hr = HrResolveUser(lpPrevItem->base, &ex.lstRecips);
- if (hr != hrSuccess)
- return hr;
- hr = HrAddBaseProperties(icMethod, lpEvent, lpPrevItem->base, true, &ex.lstMsgProps);
- if (hr != hrSuccess)
- return hr;
- lpPrevItem->lstExceptionAttachments.push_back(std::move(ex));
- return hrSuccess;
- }
- HRESULT VConverter::HrFindTimezone(ULONG ulProps, LPSPropValue lpProps, std::string *lpstrTZid, TIMEZONE_STRUCT *lpTZinfo, icaltimezone **lppicTZinfo)
- {
- HRESULT hr = hrSuccess;
- string strTZid;
- string::size_type pos;
- TIMEZONE_STRUCT ttTZinfo = {0};
- icaltimezone *lpicTZinfo = NULL;
- icalcomponent *lpicComp = NULL;
- size_t ulPos = 0;
-
-
-
- auto lpPropTimeZoneString = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_TIMEZONE], PT_UNICODE));
- if (lpPropTimeZoneString == NULL) {
-
- strTZid = "(GMT+0000)";
-
- auto lpProp = PCpropFindProp(lpProps, ulProps, PR_MESSAGE_CLASS_W);
- if(lpProp && (wcscasecmp(lpProp->Value.lpszW, L"IPM.Task") == 0) && !m_mapTimeZones->empty())
- {
- m_iCurrentTimeZone = m_mapTimeZones->begin();
- ttTZinfo = m_iCurrentTimeZone->second;
- strTZid = m_iCurrentTimeZone->first;
- }
- else
- goto done;
- } else
- strTZid = m_converter.convert_to<std::string>(lpPropTimeZoneString->Value.lpszW);
- if (strTZid.empty()) {
- strTZid = "(GMT+0000)";
-
- goto done;
- }
- if (strTZid[0] == '(') {
-
-
-
-
- pos = strTZid.rfind(')');
- strTZid.erase(pos+1);
- }
- ulPos = strTZid.find('+');
-
- m_iCurrentTimeZone = m_mapTimeZones->find(strTZid);
- if (m_iCurrentTimeZone != m_mapTimeZones->end()) {
-
- ttTZinfo = m_iCurrentTimeZone->second;
- } else {
- auto lpPropTimeZoneStruct = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_TIMEZONEDATA], PT_BINARY));
- if (lpPropTimeZoneStruct && lpPropTimeZoneStruct->Value.bin.cb >= sizeof(TIMEZONE_STRUCT) && lpPropTimeZoneStruct->Value.bin.lpb) {
- ttTZinfo = *(TIMEZONE_STRUCT*)lpPropTimeZoneStruct->Value.bin.lpb;
- (*m_mapTimeZones)[strTZid] = ttTZinfo;
-
- m_iCurrentTimeZone = m_mapTimeZones->find(strTZid);
- } else if(ulPos != string::npos){
- strTZid = "(GMT+0000)";
- goto done;
- }
- else {
- strTZid = "(GMT-0000)";
- goto done;
- }
- }
-
- hr = HrCreateVTimeZone(strTZid, ttTZinfo, &lpicComp);
- if (hr == hrSuccess) {
- lpicTZinfo = icaltimezone_new();
- if (icaltimezone_set_component(lpicTZinfo, lpicComp) == 0) {
- icalcomponent_free(lpicComp);
- icaltimezone_free(lpicTZinfo, true);
- }
- }
- hr = hrSuccess;
- done:
- *lpstrTZid = std::move(strTZid);
- *lpTZinfo = ttTZinfo;
- *lppicTZinfo = lpicTZinfo;
- return hr;
- }
- HRESULT VConverter::HrSetTimeProperty(time_t tStamp, bool bDateOnly, icaltimezone *lpicTZinfo, const std::string &strTZid, icalproperty_kind icalkind, icalproperty *lpicProp)
- {
- HRESULT hr = hrSuccess;
- icaltimetype ittStamp;
-
-
- if (bDateOnly) {
- struct tm date;
-
-
-
-
-
-
-
-
- gmtime_r(&tStamp, &date);
-
- if (date.tm_hour >= 11) {
-
- tStamp += 86400;
- }
- }
-
- if (!bDateOnly && lpicTZinfo != NULL)
- ittStamp = icaltime_from_timet_with_zone(tStamp, bDateOnly, lpicTZinfo);
- else
- ittStamp = icaltime_from_timet_with_zone(tStamp, bDateOnly, icaltimezone_get_utc_timezone());
- icalproperty_set_value(lpicProp, icalvalue_new_datetime(ittStamp));
-
- if (lpicTZinfo && !bDateOnly)
- icalproperty_add_parameter(lpicProp, icalparameter_new_from_value_string(ICAL_TZID_PARAMETER, strTZid.c_str()));
- return hr;
- }
- HRESULT VConverter::HrSetTimeProperty(time_t tStamp, bool bDateOnly, icaltimezone *lpicTZinfo, const std::string &strTZid, icalproperty_kind icalkind, icalcomponent *lpicEvent)
- {
- icalproperty *lpicProp = icalproperty_new(icalkind);
- if (lpicProp == NULL)
- return MAPI_E_INVALID_PARAMETER;
- HRESULT hr = HrSetTimeProperty(tStamp, bDateOnly, lpicTZinfo, strTZid,
- icalkind, lpicProp);
- icalcomponent_add_property(lpicEvent, lpicProp);
- return hr;
- }
- HRESULT VConverter::HrSetOrganizerAndAttendees(LPMESSAGE lpParentMsg, LPMESSAGE lpMessage, ULONG ulProps, LPSPropValue lpProps, icalproperty_method *lpicMethod, icalcomponent *lpicEvent)
- {
- HRESULT hr = hrSuccess;
- icalproperty_method icMethod = ICAL_METHOD_NONE;
- wstring strSenderName, strSenderType, strSenderEmailAddr;
- wstring strReceiverName, strReceiverType, strReceiverEmailAddr;
- wstring strRepsSenderName, strRepsSenderType, strRepsSenderEmailAddr;
- object_ptr<IMAPITable> lpTable;
- memory_ptr<SPropValue> lpSpropVal;
- icalproperty *lpicProp = NULL;
- icalparameter *lpicParam = NULL;
- string strMessageClass;
- wstring wstrBuf;
- ULONG ulMeetingStatus = 0;
- bool bCounterProposal = false;
- auto lpPropVal = PCpropFindProp(lpProps, ulProps, m_lpNamedProps->aulPropTag[PROP_COUNTERPROPOSAL]);
- if(lpPropVal && PROP_TYPE(lpPropVal->ulPropTag) == PT_BOOLEAN && lpPropVal->Value.b)
- bCounterProposal = true;
-
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_ORGANIZER_PROPERTY);
- if (lpicProp) {
- icalcomponent_remove_property(lpicEvent, lpicProp);
- icalproperty_free(lpicProp);
- }
-
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_ATTENDEE_PROPERTY);
- while (lpicProp) {
- if (lpicProp) {
- icalcomponent_remove_property(lpicEvent, lpicProp);
- icalproperty_free(lpicProp);
- }
- lpicProp = icalcomponent_get_next_property(lpicEvent, ICAL_X_PROPERTY);
- }
-
-
- lpPropVal = PCpropFindProp(lpProps, ulProps, PR_SENT_REPRESENTING_ENTRYID);
- if (lpPropVal)
- HrGetAddress(m_lpAdrBook, (LPENTRYID)lpPropVal->Value.bin.lpb, lpPropVal->Value.bin.cb, strRepsSenderName, strRepsSenderType, strRepsSenderEmailAddr);
-
-
- hr = HrGetAddress(m_lpAdrBook, lpParentMsg,
- PR_SENDER_ENTRYID, PR_SENDER_NAME, PR_SENDER_ADDRTYPE, PR_SENDER_EMAIL_ADDRESS,
- strSenderName, strSenderType, strSenderEmailAddr);
- if (hr != hrSuccess)
- return hr;
-
- lpPropVal = PCpropFindProp(lpProps, ulProps, PR_MESSAGE_CLASS_W);
- if (lpPropVal == nullptr)
- return MAPI_E_NOT_FOUND;
- strMessageClass = m_converter.convert_to<std::string>(lpPropVal->Value.lpszW);
-
- if (strMessageClass.compare(0, string("IPM.Schedule.Meeting.Resp.").length(), string("IPM.Schedule.Meeting.Resp.")) == 0)
- {
-
-
- if(bCounterProposal)
- icMethod = ICAL_METHOD_COUNTER;
- else {
- icMethod = ICAL_METHOD_REPLY;
-
- icalcomponent_add_property(lpicEvent, icalproperty_new_status(ICAL_STATUS_CONFIRMED));
- }
- if (strMessageClass.rfind("Pos") != string::npos)
- lpicParam = icalparameter_new_partstat(ICAL_PARTSTAT_ACCEPTED);
- else if (strMessageClass.rfind("Neg") != string::npos)
- lpicParam = icalparameter_new_partstat(ICAL_PARTSTAT_DECLINED);
- else if (strMessageClass.rfind("Tent") != string::npos)
- lpicParam = icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE);
- else
-
- lpicParam = icalparameter_new_partstat(ICAL_PARTSTAT_ACCEPTED);
-
- wstrBuf = L"mailto:" + (strRepsSenderEmailAddr.empty() ? strSenderEmailAddr : strRepsSenderEmailAddr);
- lpicProp = icalproperty_new_attendee(m_converter.convert_to<string>(wstrBuf).c_str());
- icalproperty_add_parameter(lpicProp, lpicParam);
- wstrBuf = strRepsSenderName.empty() ? strSenderName: strRepsSenderName;
- if (!wstrBuf.empty())
- icalproperty_add_parameter(lpicProp, icalparameter_new_cn(m_converter.convert_to<string>(m_strCharset.c_str(), wstrBuf, rawsize(wstrBuf), CHARSET_WCHAR).c_str()));
-
- wstrBuf = L"mailto:" + strSenderEmailAddr;
- if (!strSenderEmailAddr.empty() && strSenderEmailAddr != strRepsSenderEmailAddr)
- icalproperty_add_parameter(lpicProp, icalparameter_new_sentby(m_converter.convert_to<string>(wstrBuf).c_str()));
- icalcomponent_add_property(lpicEvent, lpicProp);
-
- hr = lpMessage->GetRecipientTable(MAPI_UNICODE, &~lpTable);
- if (hr != hrSuccess)
- return hr;
- rowset_ptr lpRows;
- hr = lpTable->QueryRows(-1, 0, &~lpRows);
- if (hr != hrSuccess)
- return hr;
-
-
- if (lpRows->cRows != 1)
- return MAPI_E_CALL_FAILED;
-
- hr = HrGetAddress(m_lpAdrBook, lpRows->aRow[0].lpProps, lpRows->aRow[0].cValues,
- PR_ENTRYID, PR_DISPLAY_NAME, PR_ADDRTYPE, PR_EMAIL_ADDRESS,
- strReceiverName, strReceiverType, strReceiverEmailAddr);
- if (hr != hrSuccess)
- return hr;
- wstrBuf = L"mailto:" + strReceiverEmailAddr;
- lpicProp = icalproperty_new_organizer(m_converter.convert_to<string>(m_strCharset.c_str(), wstrBuf, rawsize(wstrBuf), CHARSET_WCHAR).c_str());
- if (!strReceiverName.empty()) {
- lpicParam = icalparameter_new_cn(m_converter.convert_to<string>(m_strCharset.c_str(), strReceiverName, rawsize(strReceiverName), CHARSET_WCHAR).c_str());
- icalproperty_add_parameter(lpicProp, lpicParam);
- }
- icalcomponent_add_property(lpicEvent, lpicProp);
- }
- else
- {
-
-
-
- if (strMessageClass.compare(0, string("IPM.Schedule.Meeting").length(), string("IPM.Schedule.Meeting")) == 0)
- ulMeetingStatus = 1;
-
- lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MEETINGSTATUS], PT_LONG));
- if (lpPropVal)
- ulMeetingStatus = lpPropVal->Value.ul;
- else if (HrGetOneProp(lpParentMsg, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MEETINGSTATUS], PT_LONG), &~lpSpropVal) == hrSuccess)
-
- ulMeetingStatus = lpSpropVal->Value.ul;
-
- if (ulMeetingStatus & 1) {
- if (ulMeetingStatus & 4) {
- icalcomponent_add_property(lpicEvent, icalproperty_new_status(ICAL_STATUS_CANCELLED));
- icMethod = ICAL_METHOD_CANCEL;
- } else {
- icalcomponent_add_property(lpicEvent, icalproperty_new_status(ICAL_STATUS_CONFIRMED));
- icMethod = ICAL_METHOD_REQUEST;
- }
-
- hr = HrSetICalAttendees(lpMessage, strSenderEmailAddr, lpicEvent);
- if (hr != hrSuccess)
- return hr;
-
- lpPropVal = PCpropFindProp (lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZSENDINVITE], PT_BOOLEAN));
- if (lpPropVal && !lpPropVal->Value.b)
- lpicProp = icalproperty_new_x("FALSE");
- else
- lpicProp = icalproperty_new_x("TRUE");
-
- icalproperty_set_x_name(lpicProp, "X-MOZ-SEND-INVITATIONS");
- icalcomponent_add_property(lpicEvent, lpicProp);
-
-
- wstrBuf = L"mailto:" + (strRepsSenderEmailAddr.empty()? strSenderEmailAddr : strRepsSenderEmailAddr);
- lpicProp = icalproperty_new_organizer(m_converter.convert_to<string>(m_strCharset.c_str(), wstrBuf, rawsize(wstrBuf), CHARSET_WCHAR).c_str());
- wstrBuf = strRepsSenderName.empty()? strSenderName : strRepsSenderName;
- if (!wstrBuf.empty())
- icalproperty_add_parameter(lpicProp, icalparameter_new_cn(m_converter.convert_to<string>(m_strCharset.c_str(), wstrBuf, rawsize(wstrBuf), CHARSET_WCHAR).c_str()) );
- wstrBuf = L"mailto:" + strSenderEmailAddr;
- if (!strSenderEmailAddr.empty() && strSenderEmailAddr != strRepsSenderEmailAddr)
- icalproperty_add_parameter(lpicProp, icalparameter_new_sentby(m_converter.convert_to<string>(m_strCharset.c_str(), wstrBuf, rawsize(wstrBuf), CHARSET_WCHAR).c_str()) );
- icalcomponent_add_property(lpicEvent, lpicProp);
- } else {
-
- icMethod = ICAL_METHOD_PUBLISH;
- }
- }
- *lpicMethod = icMethod;
- return hrSuccess;
- }
- HRESULT VConverter::HrSetTimeProperties(LPSPropValue lpMsgProps, ULONG ulMsgProps, icaltimezone *lpicTZinfo, const std::string &strTZid, icalcomponent *lpEvent)
- {
- HRESULT hr = hrSuccess;
- icalproperty *lpProp = NULL;
- icaltimetype ittICalTime;
- bool bHasOwnerCriticalChange = false;
-
- auto lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_CREATION_TIME);
- if (lpPropVal) {
- ittICalTime = icaltime_from_timet_with_zone(FileTimeToUnixTime(lpPropVal->Value.ft.dwHighDateTime, lpPropVal->Value.ft.dwLowDateTime), 0, nullptr);
- ittICalTime.is_utc = 1;
- lpProp = icalproperty_new_created(ittICalTime);
- icalcomponent_add_property(lpEvent, lpProp);
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_OWNERCRITICALCHANGE], PT_SYSTIME));
- if (lpPropVal) {
- ittICalTime = icaltime_from_timet_with_zone(FileTimeToUnixTime(lpPropVal->Value.ft.dwHighDateTime, lpPropVal->Value.ft.dwLowDateTime), false, icaltimezone_get_utc_timezone());
- lpProp = icalproperty_new_dtstamp(ittICalTime);
- icalcomponent_add_property(lpEvent,lpProp);
- bHasOwnerCriticalChange = true;
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_LAST_MODIFICATION_TIME);
- if (lpPropVal) {
- ittICalTime = icaltime_from_timet_with_zone(FileTimeToUnixTime(lpPropVal->Value.ft.dwHighDateTime, lpPropVal->Value.ft.dwLowDateTime), 0, nullptr);
- ittICalTime.is_utc = 1;
- lpProp = icalproperty_new_lastmodified(ittICalTime);
- icalcomponent_add_property(lpEvent,lpProp);
- if (!bHasOwnerCriticalChange) {
- lpProp = icalproperty_new_dtstamp(ittICalTime);
- icalcomponent_add_property(lpEvent,lpProp);
- }
- }
- return hr;
- }
- HRESULT VConverter::HrSetICalAttendees(LPMESSAGE lpMessage, const std::wstring &strOrganizer, icalcomponent *lpicEvent)
- {
- HRESULT hr = hrSuccess;
- icalproperty *lpProp = NULL;
- icalparameter *lpParam = NULL;
- object_ptr<IMAPITable> lpTable;
- rowset_ptr lpRows;
- ULONG ulCount = 0;
- wstring strName, strType, strEmailAddress;
- static constexpr const SizedSPropTagArray(7, sptaRecipProps) =
- {7, {PR_ENTRYID, PR_DISPLAY_NAME_W, PR_ADDRTYPE_A,
- PR_EMAIL_ADDRESS_A, PR_RECIPIENT_FLAGS, PR_RECIPIENT_TYPE,
- PR_RECIPIENT_TRACKSTATUS}};
- hr = lpMessage->GetRecipientTable(0, &~lpTable);
- if (hr != hrSuccess)
- return hr;
- hr = lpTable->SetColumns(sptaRecipProps, 0);
- if (hr != hrSuccess)
- return hr;
- hr = lpTable->QueryRows(-1, 0, &~lpRows);
- if (hr != hrSuccess)
- return hr;
-
-
- for (ulCount = 0; ulCount < lpRows->cRows; ++ulCount) {
-
-
- hr = HrGetAddress(m_lpAdrBook, lpRows->aRow[ulCount].lpProps, lpRows->aRow[ulCount].cValues,
- PR_ENTRYID, PR_DISPLAY_NAME_W, PR_ADDRTYPE_A, PR_EMAIL_ADDRESS_A,
- strName, strType, strEmailAddress);
-
- if (hr != hrSuccess || strEmailAddress == strOrganizer)
- continue;
-
- auto lpPropVal = PCpropFindProp(lpRows->aRow[ulCount].lpProps, lpRows->aRow[ulCount].cValues, PR_RECIPIENT_FLAGS);
- if (lpPropVal != NULL && lpPropVal->Value.ul == 3)
- continue;
- lpPropVal = PCpropFindProp(lpRows->aRow[ulCount].lpProps, lpRows->aRow[ulCount].cValues, PR_RECIPIENT_TYPE);
- if (lpPropVal == NULL)
- continue;
- switch (lpPropVal->Value.ul) {
- case MAPI_TO:
- lpParam = icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT);
- break;
- case MAPI_CC:
- lpParam = icalparameter_new_role(ICAL_ROLE_OPTPARTICIPANT);
- break;
- case MAPI_BCC:
- lpParam = icalparameter_new_role(ICAL_ROLE_NONPARTICIPANT);
- break;
- default:
- continue;
- }
- strEmailAddress.insert(0, L"mailto:");
- lpProp = icalproperty_new_attendee(m_converter.convert_to<string>(m_strCharset.c_str(), strEmailAddress, rawsize(strEmailAddress), CHARSET_WCHAR).c_str());
- icalproperty_add_parameter(lpProp, lpParam);
- lpPropVal = PCpropFindProp(lpRows->aRow[ulCount].lpProps, lpRows->aRow[ulCount].cValues, PR_RECIPIENT_TRACKSTATUS);
- if (lpPropVal != NULL) {
- if (lpPropVal->Value.ul == 2)
- icalproperty_add_parameter(lpProp, icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE));
- else if (lpPropVal->Value.ul == 3)
- icalproperty_add_parameter(lpProp, icalparameter_new_partstat(ICAL_PARTSTAT_ACCEPTED));
- else if (lpPropVal->Value.ul == 4)
- icalproperty_add_parameter(lpProp, icalparameter_new_partstat(ICAL_PARTSTAT_DECLINED));
- else {
- icalproperty_add_parameter(lpProp, icalparameter_new_partstat(ICAL_PARTSTAT_NEEDSACTION));
- icalproperty_add_parameter(lpProp, icalparameter_new_rsvp(ICAL_RSVP_TRUE));
- }
- } else {
-
- icalproperty_add_parameter(lpProp, icalparameter_new_partstat(ICAL_PARTSTAT_NEEDSACTION));
- icalproperty_add_parameter(lpProp, icalparameter_new_rsvp(ICAL_RSVP_TRUE));
- }
- if (!strName.empty())
- icalproperty_add_parameter(lpProp, icalparameter_new_cn(m_converter.convert_to<string>(m_strCharset.c_str(), strName, rawsize(strName), CHARSET_WCHAR).c_str()));
- icalcomponent_add_property(lpicEvent, lpProp);
- }
- return hr;
- }
- HRESULT VConverter::HrSetBusyStatus(LPMESSAGE lpMessage, ULONG ulBusyStatus, icalcomponent *lpicEvent)
- {
- HRESULT hr = hrSuccess;
- memory_ptr<SPropValue> lpSpropVal;
- icalproperty *lpicProp = NULL;
-
-
- if (ulBusyStatus == 0)
- lpicProp = icalproperty_new_transp(ICAL_TRANSP_TRANSPARENT);
- else
- lpicProp = icalproperty_new_transp(ICAL_TRANSP_OPAQUE);
- icalcomponent_add_property(lpicEvent, lpicProp);
-
-
- hr = HrGetOneProp(lpMessage, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_INTENDEDBUSYSTATUS], PT_LONG), &~lpSpropVal);
- if(hr == hrSuccess && lpSpropVal->Value.ul != (ULONG)-1)
- ulBusyStatus = lpSpropVal->Value.ul;
- switch (ulBusyStatus) {
- case 0:
- lpicProp = icalproperty_new_x("FREE");
- break;
- case 1:
- lpicProp = icalproperty_new_x("TENTATIVE");
- break;
- default:
- case 2:
- lpicProp = icalproperty_new_x("BUSY");
- break;
- case 3:
- lpicProp = icalproperty_new_x("OOF");
- break;
- }
-
- icalproperty_set_x_name(lpicProp, "X-MICROSOFT-CDO-INTENDEDSTATUS");
- icalcomponent_add_property(lpicEvent, lpicProp);
- return hrSuccess;
- }
- HRESULT VConverter::HrSetXHeaders(ULONG ulMsgProps, LPSPropValue lpMsgProps, LPMESSAGE lpMessage, icalcomponent *lpEvent)
- {
- icaltimetype icCriticalChange;
- icalvalue *lpicValue = NULL;
- icalproperty *lpProp = NULL;
- time_t ttCriticalChange = 0;
- ULONG ulApptSeqNo = 0;
- ULONG ulOwnerApptID = 0;
- char *lpszTemp = NULL;
- bool blIsAllday = false;
-
-
- auto lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_OWNERCRITICALCHANGE], PT_SYSTIME));
- if (lpPropVal != nullptr)
- FileTimeToUnixTime(lpPropVal->Value.ft, &ttCriticalChange);
- else
- ttCriticalChange = time(NULL);
- icCriticalChange = icaltime_from_timet_with_zone(ttCriticalChange, false, icaltimezone_get_utc_timezone());
- lpicValue = icalvalue_new_datetime(icCriticalChange);
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpProp, "X-MICROSOFT-CDO-OWNER-CRITICAL-CHANGE");
- icalcomponent_add_property(lpEvent, lpProp);
- icalvalue_free(lpicValue);
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_ATTENDEECRITICALCHANGE], PT_SYSTIME));
- if (lpPropVal != nullptr)
- FileTimeToUnixTime(lpPropVal->Value.ft, &ttCriticalChange);
- else
- ttCriticalChange = time(NULL);
- icCriticalChange = icaltime_from_timet_with_zone(ttCriticalChange, false, icaltimezone_get_utc_timezone());
- lpicValue = icalvalue_new_datetime(icCriticalChange);
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
-
- icalproperty_set_x_name(lpProp, "X-MICROSOFT-CDO-ATTENDEE-CRITICAL-CHANGE");
- icalcomponent_add_property(lpEvent, lpProp);
- icalvalue_free(lpicValue);
-
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_APPTSEQNR], PT_LONG));
- if (lpPropVal != nullptr)
- ulApptSeqNo = lpPropVal->Value.ul;
- else
- ulApptSeqNo = 0;
- lpicValue = icalvalue_new_integer(ulApptSeqNo);
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpProp, "X-MICROSOFT-CDO-APPT-SEQUENCE");
- icalcomponent_add_property(lpEvent, lpProp);
- icalvalue_free(lpicValue);
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_OWNER_APPT_ID);
- if (lpPropVal != nullptr)
- ulOwnerApptID = lpPropVal->Value.ul;
- else
- ulOwnerApptID = -1;
- lpicValue = icalvalue_new_integer(ulOwnerApptID);
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpProp, "X-MICROSOFT-CDO-OWNERAPPTID");
- icalcomponent_add_property(lpEvent, lpProp);
- icalvalue_free(lpicValue);
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZGEN], PT_LONG));
- if (lpPropVal)
- {
- LONG ulXmozGen = 0;
- icalvalue *lpicValue = NULL;
- ulXmozGen = lpPropVal->Value.ul;
- lpicValue = icalvalue_new_integer(ulXmozGen);
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpProp, "X-MOZ-GENERATION");
- icalcomponent_add_property(lpEvent, lpProp);
- icalvalue_free(lpicValue);
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_ALLDAYEVENT], PT_BOOLEAN));
- if (lpPropVal != nullptr)
- blIsAllday = (lpPropVal->Value.b == TRUE);
- lpicValue = icalvalue_new_x(blIsAllday ? "TRUE" : "FALSE");
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpProp, "X-MICROSOFT-CDO-ALLDAYEVENT");
- icalcomponent_add_property(lpEvent, lpProp);
- icalvalue_free(lpicValue);
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_RTF_COMPRESSED);
- if (lpPropVal == nullptr || Util::GetBestBody(lpMsgProps, ulMsgProps, fMapiUnicode) != PR_RTF_COMPRESSED)
- return hrSuccess;
- string rtf;
- object_ptr<IStream> lpStream;
- if (lpMessage->OpenProperty(PR_RTF_COMPRESSED, &IID_IStream, 0, MAPI_DEFERRED_ERRORS, &~lpStream) != hrSuccess)
- return hrSuccess;
- if (Util::HrStreamToString(lpStream, rtf) != hrSuccess)
- return hrSuccess;
- string rtfbase64;
- rtfbase64 = base64_encode((unsigned char*)rtf.c_str(), rtf.size());
- lpicValue = icalvalue_new_x(rtfbase64.c_str());
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpProp, "X-MICROSOFT-RTF");
- icalcomponent_add_property(lpEvent, lpProp);
- icalvalue_free(lpicValue);
- return hrSuccess;
- }
- HRESULT VConverter::HrSetVAlarm(ULONG ulProps, LPSPropValue lpProps, icalcomponent *lpicEvent)
- {
- HRESULT hr = hrSuccess;
- icalcomponent *lpAlarm = NULL;
- icalproperty *lpicProp = NULL;
- time_t ttSnooze = 0;
- time_t ttSnoozeSuffix = 0;
- bool blxmozgen = false;
- bool blisItemReccr = false;
- char *lpszTemp = NULL;
- LONG lRemindBefore = 0;
- time_t ttReminderTime = 0;
- bool bTask = false;
-
-
- auto lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERSET], PT_BOOLEAN));
- if (!lpPropVal || lpPropVal->Value.b == FALSE)
- return hrSuccess;
- lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERMINUTESBEFORESTART], PT_LONG));
- if (lpPropVal)
- lRemindBefore = lpPropVal->Value.l;
- lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERTIME], PT_SYSTIME));
- if (lpPropVal)
- FileTimeToUnixTime(lpPropVal->Value.ft, &ttReminderTime);
- lpPropVal = PCpropFindProp(lpProps, ulProps, PR_MESSAGE_CLASS);
- if (lpPropVal && _tcsicmp(lpPropVal->Value.LPSZ, _T("IPM.Task")) == 0)
- bTask = true;
- hr = HrParseReminder(lRemindBefore, ttReminderTime, bTask, &lpAlarm);
- if (hr != hrSuccess)
- return hr;
- icalcomponent_add_component(lpicEvent, lpAlarm);
- lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRING], PT_BOOLEAN));
- if(lpPropVal && lpPropVal->Value.b == TRUE)
- blisItemReccr = true;
-
- lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZ_SNOOZE_SUFFIX], PT_SYSTIME));
- if(lpPropVal)
- FileTimeToUnixTime(lpPropVal->Value.ft, &ttSnoozeSuffix);
-
- lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERNEXTTIME], PT_SYSTIME));
- if (lpPropVal) {
- icaltimetype icSnooze;
- icalvalue *lpicValue = NULL;
- std::string strSnoozeTime = "X-MOZ-SNOOZE-TIME";
-
- if (ttSnoozeSuffix != 0 && blisItemReccr)
- strSnoozeTime += "-" + stringify(ttSnoozeSuffix) + "000000";
- FileTimeToUnixTime(lpPropVal->Value.ft, &ttSnooze);
- icSnooze = icaltime_from_timet_with_zone(ttSnooze, false, icaltimezone_get_utc_timezone());
- lpicValue = icalvalue_new_datetime(icSnooze);
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpicProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpicProp, strSnoozeTime.c_str());
- icalcomponent_add_property(lpicEvent, lpicProp);
- icalvalue_free(lpicValue);
- }
- lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZGEN], PT_LONG));
- if (lpPropVal)
- blxmozgen = true;
-
- lpPropVal = PCpropFindProp(lpProps, ulProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_MOZLASTACK], PT_SYSTIME));
- if (lpPropVal)
- {
- time_t ttLastAckTime = 0;
- icaltimetype icModTime;
- icalvalue *lpicValue = NULL;
-
- FileTimeToUnixTime(lpPropVal->Value.ft, &ttLastAckTime);
-
- if(ttLastAckTime > ttSnooze && !blxmozgen)
- return hrSuccess;
- icModTime = icaltime_from_timet_with_zone(ttLastAckTime, false, icaltimezone_get_utc_timezone());
- lpicValue = icalvalue_new_datetime(icModTime);
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpicProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpicProp, "X-MOZ-LASTACK");
- icalcomponent_add_property(lpicEvent, lpicProp);
- icalvalue_free(lpicValue);
- }
- return hrSuccess;
- }
- HRESULT VConverter::HrSetBody(LPMESSAGE lpMessage, icalproperty **lppicProp)
- {
- HRESULT hr = hrSuccess;
- object_ptr<IStream> lpStream;
- STATSTG sStreamStat;
- std::wstring strBody;
- std::unique_ptr<wchar_t[]> lpBody;
- hr = lpMessage->OpenProperty(PR_BODY_W, &IID_IStream, 0, MAPI_DEFERRED_ERRORS, &~lpStream);
- if (hr != hrSuccess)
- return hr;
- hr = lpStream->Stat(&sStreamStat, 0);
- if (hr != hrSuccess)
- return hr;
- if (sStreamStat.cbSize.LowPart == 0)
- return MAPI_E_NOT_FOUND;
- lpBody.reset(new WCHAR[sStreamStat.cbSize.LowPart + sizeof(WCHAR)]);
- memset(lpBody.get(), 0, (sStreamStat.cbSize.LowPart+1) * sizeof(WCHAR));
- hr = lpStream->Read(lpBody.get(), sStreamStat.cbSize.LowPart * sizeof(WCHAR), NULL);
- if (hr != hrSuccess)
- return hr;
-
-
-
- StringTabtoSpaces(lpBody.get(), &strBody);
- StringCRLFtoLF(strBody, &strBody);
-
- *lppicProp = icalproperty_new_description(m_converter.convert_to<string>(m_strCharset.c_str(), strBody, rawsize(strBody), CHARSET_WCHAR).c_str());
- return hrSuccess;
- }
- HRESULT VConverter::HrSetItemSpecifics(ULONG ulProps, LPSPropValue lpProps, icalcomponent *lpicEvent)
- {
- return hrSuccess;
- }
- HRESULT VConverter::HrSetRecurrenceID(LPSPropValue lpMsgProps, ULONG ulMsgProps, icaltimezone *lpicTZinfo, const std::string &strTZid, icalcomponent *lpEvent)
- {
- bool bIsSeriesAllDay = false;
- icaltimetype icTime = {0};
- std::string strUid;
- time_t tRecId = 0;
- ULONG ulRecurStartTime = -1;
- ULONG ulRecurEndTime = -1;
-
- auto lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_ISEXCEPTION], PT_BOOLEAN));
- if (!lpPropVal || lpPropVal->Value.b == FALSE) {
- auto lpPropGlobal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_GOID], PT_BINARY));
- if (!lpPropGlobal)
- return hrSuccess;
- auto lpPropClean = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_CLEANID], PT_BINARY));
- if (!lpPropClean)
- return hrSuccess;
- if (lpPropClean->Value.bin.cb != lpPropGlobal->Value.bin.cb)
- return hrSuccess;
- if (memcmp(lpPropClean->Value.bin.lpb, lpPropGlobal->Value.bin.lpb, lpPropGlobal->Value.bin.cb) == 0)
- return hrSuccess;
-
- }
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURSTARTTIME], PT_LONG));
- if (lpPropVal)
- ulRecurStartTime = lpPropVal->Value.ul;
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURENDTIME], PT_LONG));
- if (lpPropVal)
- ulRecurEndTime = lpPropVal->Value.ul;
-
-
-
-
-
- if (ulRecurStartTime == 0 && ulRecurEndTime == (24 * 4096))
- bIsSeriesAllDay = true;
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRINGBASE], PT_SYSTIME));
- if (!lpPropVal) {
-
-
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_GOID], PT_BINARY));
- if (!lpPropVal)
- return hrSuccess;
-
- strUid = bin2hex(lpPropVal->Value.bin.cb, lpPropVal->Value.bin.lpb);
- if(!IsOutlookUid(strUid))
- return hrSuccess;
- if(strUid.substr(32, 8).compare("00000000") == 0 && ulRecurStartTime == (ULONG)-1)
- return hrSuccess;
- icTime.year = strtol(strUid.substr(32, 4).c_str(), NULL, 16);
- icTime.month = strtol(strUid.substr(36, 2).c_str(), NULL, 16);
- icTime.day = strtol(strUid.substr(38, 2).c_str(), NULL, 16);
-
- icTime.hour = ulRecurStartTime / 4096;
- ulRecurStartTime -= icTime.hour * 4096;
- icTime.minute = ulRecurStartTime / 64;
- icTime.second = ulRecurStartTime - icTime.minute * 64;
-
-
- if(bIsSeriesAllDay)
- tRecId = icaltime_as_timet(icTime);
- else
- tRecId = icaltime_as_timet_with_zone(icTime,lpicTZinfo);
- } else {
- tRecId = FileTimeToUnixTime(lpPropVal->Value.ft.dwHighDateTime, lpPropVal->Value.ft.dwLowDateTime);
- }
-
- return HrSetTimeProperty(tRecId, bIsSeriesAllDay, lpicTZinfo, strTZid,
- ICAL_RECURRENCEID_PROPERTY, lpEvent);
- }
- HRESULT VConverter::HrSetRecurrence(LPMESSAGE lpMessage, icalcomponent *lpicEvent, icaltimezone *lpicTZinfo, const std::string &strTZid, std::list<icalcomponent*> *lpEventList)
- {
- HRESULT hr = hrSuccess;
- ULONG ulRecurrenceStateTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCESTATE], PT_BINARY);
- bool bIsAllDay = false;
- bool bIsAllDayException = false;
- memory_ptr<SPropValue> lpSpropArray;
- LPSPropValue lpSPropRecVal = NULL;
- recurrence cRecurrence;
- object_ptr<IStream> lpStream;
- STATSTG sStreamStat;
- ICalRecurrence cICalRecurrence;
- icalcomponent *lpicComp = NULL;
- icalproperty *lpicProp = NULL;
- ULONG ulModCount = 0;
- ULONG ulModifications = 0;
- ULONG cbsize = 0;
- ULONG ulFlag = 0;
- time_t tNewTime = 0;
- time_t tExceptionStart = 0;
- std::list<icalcomponent*> lstExceptions;
- TIMEZONE_STRUCT zone;
- SizedSPropTagArray(6, proptags) =
- {6, {PR_MESSAGE_CLASS_A,
- CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCEPATTERN], PT_UNICODE),
- CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCESTATE], PT_BINARY),
- CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_ALLDAYEVENT], PT_BOOLEAN),
- CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_TASK_STATUS], PT_LONG),
- CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_TASK_RECURRSTATE], PT_BINARY)}};
- hr = lpMessage->GetProps(proptags, 0, &cbsize, &~lpSpropArray);
- if (FAILED(hr))
- return hr;
-
- if ((PROP_TYPE(lpSpropArray[0].ulPropTag) != PT_ERROR)
- && (strcasecmp(lpSpropArray[0].Value.lpszA, "IPM.Task") == 0)) {
- ulRecurrenceStateTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_TASK_RECURRSTATE], PT_BINARY);
- lpSPropRecVal = &lpSpropArray[5];
- ulFlag = RECURRENCE_STATE_TASKS;
- } else {
- ulRecurrenceStateTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRENCESTATE], PT_BINARY);
- lpSPropRecVal = &lpSpropArray[2];
- ulFlag = RECURRENCE_STATE_CALENDAR;
- }
-
- if ((PROP_TYPE(lpSpropArray[4].ulPropTag) != PT_ERROR) && lpSpropArray[4].Value.ul == 2)
- return hr;
- if (PROP_TYPE(lpSpropArray[1].ulPropTag) != PT_ERROR)
- {
- lpicProp = icalproperty_new_x(m_converter.convert_to<string>(m_strCharset.c_str(), lpSpropArray[1].Value.lpszW, rawsize(lpSpropArray[1].Value.lpszW), CHARSET_WCHAR).c_str());
- icalproperty_set_x_name(lpicProp, "X-KOPANO-REC-PATTERN");
- icalcomponent_add_property(lpicEvent, lpicProp);
- }
- if ((PROP_TYPE(lpSPropRecVal->ulPropTag) != PT_ERROR)) {
- hr = cRecurrence.HrLoadRecurrenceState(reinterpret_cast<const char *>(lpSPropRecVal->Value.bin.lpb), lpSPropRecVal->Value.bin.cb, ulFlag);
- } else if (lpSPropRecVal->Value.err == MAPI_E_NOT_ENOUGH_MEMORY) {
-
- hr = lpMessage->OpenProperty(ulRecurrenceStateTag, &IID_IStream, 0, MAPI_DEFERRED_ERRORS, &~lpStream);
- if (hr != hrSuccess)
- return hr;
- hr = lpStream->Stat(&sStreamStat, 0);
- if (hr != hrSuccess)
- return hr;
- std::unique_ptr<char[]> lpRecurrenceData(new char[sStreamStat.cbSize.LowPart]);
- hr = lpStream->Read(lpRecurrenceData.get(), sStreamStat.cbSize.LowPart, NULL);
- if (hr != hrSuccess)
- return hr;
- hr = cRecurrence.HrLoadRecurrenceState(lpRecurrenceData.get(), sStreamStat.cbSize.LowPart, ulFlag);
- } else {
-
-
- return hrSuccess;
- }
- if (FAILED(hr))
- return hr;
- if (PROP_TYPE(lpSpropArray[3].ulPropTag) != PT_ERROR)
- bIsAllDay = (lpSpropArray[3].Value.b == TRUE);
- if (m_iCurrentTimeZone == m_mapTimeZones->end()) {
- hr = HrGetTzStruct("Etc/UTC", &zone);
- if (hr != hrSuccess)
- return hr;
- } else {
- zone = m_iCurrentTimeZone->second;
- }
-
- hr = cICalRecurrence.HrCreateICalRecurrence(zone, bIsAllDay, &cRecurrence, lpicEvent);
- if (hr != hrSuccess)
- return hr;
-
-
-
-
- ulModCount = cRecurrence.getModifiedCount();
- for (ULONG i = 0; i < ulModCount; ++i) {
-
- SPropValuePtr lpMsgProps;
- ULONG ulMsgProps = 0;
- const SPropValue *lpProp = NULL;
- icalproperty_method icMethod = ICAL_METHOD_NONE;
- icalcomp_ptr lpicException;
- ulModifications = cRecurrence.getModifiedFlags(i);
- bIsAllDayException = bIsAllDay;
- hr = cICalRecurrence.HrMakeICalException(lpicEvent, &unique_tie(lpicException));
- if (hr != hrSuccess)
- continue;
- tExceptionStart = tNewTime = cRecurrence.getModifiedStartDateTime(i);
-
- object_ptr<IMessage> lpException;
- hr = HrGetExceptionMessage(lpMessage, tExceptionStart, &~lpException);
- if (hr != hrSuccess)
- {
- hr = hrSuccess;
- continue;
- }
- hr = lpException->GetProps(NULL, MAPI_UNICODE, &ulMsgProps, &~lpMsgProps);
- if (FAILED(hr))
- continue;
- hr = HrSetOrganizerAndAttendees(lpMessage, lpException,
- ulMsgProps, lpMsgProps, &icMethod, lpicException.get());
- if (hr != hrSuccess)
- continue;
- if (ulModifications & ARO_SUBTYPE)
- {
- icalvalue *lpicValue = NULL;
- char *lpszTemp = NULL;
-
- lpProp = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_ALLDAYEVENT], PT_BOOLEAN));
- if (lpProp)
- bIsAllDayException = (lpProp->Value.b == TRUE);
-
- lpicProp = icalcomponent_get_first_property(lpicException.get(), ICAL_X_PROPERTY);
- while (lpicProp && (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-CDO-ALLDAYEVENT") != 0))
- lpicProp = icalcomponent_get_next_property(lpicException.get(), ICAL_X_PROPERTY);
- if (lpicProp) {
- icalcomponent_remove_property(lpicException.get(), lpicProp);
- icalproperty_free(lpicProp);
- }
- lpicValue = icalvalue_new_x(bIsAllDayException ? "TRUE" : "FALSE");
- lpszTemp = icalvalue_as_ical_string_r(lpicValue);
- lpicProp = icalproperty_new_x(lpszTemp);
- icalmemory_free_buffer(lpszTemp);
- icalproperty_set_x_name(lpicProp, "X-MICROSOFT-CDO-ALLDAYEVENT");
- icalcomponent_add_property(lpicException.get(), lpicProp);
- icalvalue_free(lpicValue);
- }
-
-
- tNewTime = LocalToUTC(tNewTime, m_iCurrentTimeZone->second);
- hr = HrSetTimeProperty(tNewTime, bIsAllDayException, lpicTZinfo,
- strTZid, ICAL_DTSTART_PROPERTY, lpicException.get());
- if (hr != hrSuccess)
- continue;
- tNewTime = LocalToUTC(cRecurrence.getModifiedEndDateTime(i), m_iCurrentTimeZone->second);
- hr = HrSetTimeProperty(tNewTime, bIsAllDayException, lpicTZinfo,
- strTZid, ICAL_DTEND_PROPERTY, lpicException.get());
- if (hr != hrSuccess)
- continue;
- lpProp = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRINGBASE], PT_SYSTIME));
- if (!lpProp)
- lpProp = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_OLDSTART], PT_SYSTIME));
- if (lpProp) {
- tNewTime = FileTimeToUnixTime(lpProp->Value.ft.dwHighDateTime, lpProp->Value.ft.dwLowDateTime);
- hr = HrSetTimeProperty(tNewTime, bIsAllDay, lpicTZinfo,
- strTZid, ICAL_RECURRENCEID_PROPERTY, lpicException.get());
- if (hr != hrSuccess)
- continue;
- }
-
- if (ulModifications & ARO_SUBJECT) {
-
- lpicProp = icalcomponent_get_first_property(lpicException.get(), ICAL_SUMMARY_PROPERTY);
- if (lpicProp) {
- icalcomponent_remove_property(lpicException.get(), lpicProp);
- icalproperty_free(lpicProp);
- }
- const wstring wstrTmp = cRecurrence.getModifiedSubject(i);
- icalcomponent_add_property(lpicException.get(), icalproperty_new_summary(m_converter.convert_to<string>(m_strCharset.c_str(), wstrTmp, rawsize(wstrTmp), CHARSET_WCHAR).c_str()));
- }
- if (ulModifications & ARO_MEETINGTYPE) {
-
- }
- if (ulModifications & ARO_REMINDERDELTA && !(ulModifications & ARO_REMINDERSET))
- HrUpdateReminderTime(lpicException.get(), cRecurrence.getModifiedReminderDelta(i));
- if (ulModifications & ARO_REMINDERSET) {
-
-
-
-
-
- LONG lRemindBefore = 0;
- time_t ttReminderTime = 0;
- if (ulModifications & ARO_REMINDERDELTA) {
- lpProp = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERMINUTESBEFORESTART], PT_LONG));
- lRemindBefore = lpProp ? lpProp->Value.l : 15;
- lpProp = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_REMINDERTIME], PT_LONG));
- if (lpProp)
- FileTimeToUnixTime(lpProp->Value.ft, &ttReminderTime);
- }
-
-
- lpicComp = icalcomponent_get_first_component(lpicException.get(), ICAL_VALARM_COMPONENT);
- if (lpicComp) {
- icalcomponent_remove_component(lpicException.get(), lpicComp);
- icalcomponent_free(lpicComp);
- }
- lpicComp = NULL;
- if (cRecurrence.getModifiedReminder(i) != 0) {
- hr = HrParseReminder(lRemindBefore, ttReminderTime, false, &lpicComp);
- if (hr == hrSuccess)
- icalcomponent_add_component(lpicException.get(), lpicComp);
- }
- }
- if (ulModifications & ARO_LOCATION) {
- lpicProp = icalcomponent_get_first_property(lpicException.get(), ICAL_LOCATION_PROPERTY);
- if (lpicProp) {
- icalcomponent_remove_property(lpicException.get(), lpicProp);
- icalproperty_free(lpicProp);
- }
- const wstring wstrTmp = cRecurrence.getModifiedLocation(i);
- icalcomponent_add_property(lpicException.get(), icalproperty_new_location(m_converter.convert_to<std::string>(m_strCharset.c_str(), wstrTmp, rawsize(wstrTmp), CHARSET_WCHAR).c_str()));
- }
- if (ulModifications & ARO_BUSYSTATUS) {
-
- lpicProp = icalcomponent_get_first_property(lpicException.get(), ICAL_TRANSP_PROPERTY);
- if (lpicProp) {
- icalcomponent_remove_property(lpicException.get(), lpicProp);
- icalproperty_free(lpicProp);
- }
- lpicProp = icalcomponent_get_first_property(lpicException.get(), ICAL_X_PROPERTY);
- while (lpicProp && (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-CDO-INTENDEDSTATUS") != 0))
- lpicProp = icalcomponent_get_next_property(lpicException.get(), ICAL_X_PROPERTY);
- if (lpicProp) {
- icalcomponent_remove_property(lpicException.get(), lpicProp);
- icalproperty_free(lpicProp);
- }
- HrSetBusyStatus(lpException, cRecurrence.getModifiedBusyStatus(i), lpicException.get());
- }
- if (ulModifications & ARO_ATTACHMENT) {
-
- }
- if (ulModifications & ARO_APPTCOLOR) {
-
- }
- if (ulModifications & ARO_EXCEPTIONAL_BODY) {
- lpicProp = icalcomponent_get_first_property(lpicException.get(), ICAL_DESCRIPTION_PROPERTY);
- if (lpicProp) {
- icalcomponent_remove_property(lpicException.get(), lpicProp);
- icalproperty_free(lpicProp);
- }
- lpicProp = NULL;
- if (HrSetBody(lpException, &lpicProp) == hrSuccess)
- icalcomponent_add_property(lpicException.get(), lpicProp);
- }
- lstExceptions.push_back(lpicException.release());
- }
- *lpEventList = std::move(lstExceptions);
- return hr;
- }
- HRESULT VConverter::HrUpdateReminderTime(icalcomponent *lpicEvent, LONG lReminder)
- {
- icalcomponent *lpicAlarm = NULL;
- icalproperty *lpicProp = NULL;
- icaltriggertype sittTrigger;
- lpicAlarm = icalcomponent_get_first_component(lpicEvent, ICAL_VALARM_COMPONENT);
- if (lpicAlarm == NULL)
- return MAPI_E_NOT_FOUND;
- memset(&sittTrigger, 0, sizeof(icaltriggertype));
- sittTrigger.duration = icaldurationtype_from_int(-1 * lReminder * 60);
- lpicProp = icalcomponent_get_first_property(lpicAlarm, ICAL_TRIGGER_PROPERTY);
- if (lpicProp) {
- icalcomponent_remove_property(lpicAlarm, lpicProp);
- icalproperty_free(lpicProp);
- }
- icalcomponent_add_property(lpicAlarm, icalproperty_new_trigger(sittTrigger));
- return hrSuccess;
- }
- HRESULT VConverter::HrGetExceptionMessage(LPMESSAGE lpMessage, time_t tStart, LPMESSAGE *lppMessage)
- {
- HRESULT hr = hrSuccess;
- object_ptr<IMAPITable> lpAttachTable;
- rowset_ptr lpRows;
- const SPropValue *lpPropVal = nullptr;
- object_ptr<IAttach> lpAttach;
- LPMESSAGE lpAttachedMessage = NULL;
- SPropValue sStart = {0};
- SPropValue sMethod = {0};
- sStart.ulPropTag = PR_EXCEPTION_STARTTIME;
- UnixTimeToFileTime(tStart, &sStart.Value.ft);
- sMethod.ulPropTag = PR_ATTACH_METHOD;
- sMethod.Value.ul = ATTACH_EMBEDDED_MSG;
- hr = lpMessage->GetAttachmentTable(0, &~lpAttachTable);
- if (hr != hrSuccess)
- return hr;
-
- hr = ECAndRestriction(
- ECExistRestriction(sStart.ulPropTag) +
- ECPropertyRestriction(RELOP_EQ, sStart.ulPropTag, &sStart, ECRestriction::Cheap) +
- ECExistRestriction(sMethod.ulPropTag) +
- ECPropertyRestriction(RELOP_EQ, sMethod.ulPropTag, &sMethod, ECRestriction::Cheap)
- ).RestrictTable(lpAttachTable, 0);
- if (hr != hrSuccess)
- return hr;
-
- hr = lpAttachTable->QueryRows(-1, 0, &~lpRows);
- if (hr != hrSuccess)
- return hr;
- if (lpRows->cRows == 0)
-
- return MAPI_E_NOT_FOUND;
- lpPropVal = PCpropFindProp(lpRows->aRow[0].lpProps, lpRows->aRow[0].cValues, PR_ATTACH_NUM);
- if (lpPropVal == nullptr)
- return MAPI_E_NOT_FOUND;
- hr = lpMessage->OpenAttach(lpPropVal->Value.ul, nullptr, 0, &~lpAttach);
- if (hr != hrSuccess)
- return hr;
- hr = lpAttach->OpenProperty(PR_ATTACH_DATA_OBJ, &IID_IMessage, 0, 0, (LPUNKNOWN *)&lpAttachedMessage);
- if (hr != hrSuccess)
- return hr;
- *lppMessage = lpAttachedMessage;
- return hrSuccess;
- }
- HRESULT VConverter::HrAddTimeZone(icalproperty *lpicProp, icalitem *lpIcalItem)
- {
- icalparameter* lpicTZParam = NULL;
- const char *lpszTZID = NULL;
- std::string strTZ;
- SPropValue sPropVal;
-
- lpicTZParam = icalproperty_get_first_parameter(lpicProp, ICAL_TZID_PARAMETER);
-
- if (lpicTZParam == NULL && lpicProp == NULL)
- return hrSuccess;
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_TIMEZONE], PT_UNICODE);
- if (lpicTZParam != NULL) {
- strTZ = urlDecode(icalparameter_get_tzid(lpicTZParam));
- lpszTZID = strTZ.c_str();
- } else if (!m_mapTimeZones->empty()) {
- lpszTZID = (m_mapTimeZones->begin()->first).c_str();
- } else {
- return hrSuccess;
- }
- HrCopyString(m_converter, m_strCharset, lpIcalItem->base, lpszTZID, &sPropVal.Value.lpszW);
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
- m_iCurrentTimeZone = m_mapTimeZones->find(lpszTZID);
- if (m_iCurrentTimeZone == m_mapTimeZones->cend())
-
- return MAPI_E_NOT_FOUND;
-
- sPropVal.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_TIMEZONEDATA], PT_BINARY);
- sPropVal.Value.bin.cb = sizeof(TIMEZONE_STRUCT);
- HRESULT hr = MAPIAllocateMore(sizeof(TIMEZONE_STRUCT), lpIcalItem->base, (void**)&sPropVal.Value.bin.lpb);
- if (hr != hrSuccess)
- return hr;
- memcpy(sPropVal.Value.bin.lpb, &m_iCurrentTimeZone->second, sizeof(TIMEZONE_STRUCT));
- lpIcalItem->lstMsgProps.push_back(sPropVal);
-
- lpIcalItem->tTZinfo = m_iCurrentTimeZone->second;
- return hrSuccess;
- }
-
- HRESULT VConverter::HrRetrieveAlldayStatus(icalcomponent *lpicEvent, bool *lpblIsAllday)
- {
- icalproperty *lpicProp = NULL;
- icaltimetype icStart;
- icaltimetype icEnd;
- bool blIsAllday = false;
-
-
- icStart = icalcomponent_get_dtstart(lpicEvent);
- if (icStart.is_date)
- {
- *lpblIsAllday = true;
- return hrSuccess;
- }
-
-
- icEnd = icalcomponent_get_dtend(lpicEvent);
- if (icStart.hour + icStart.minute + icStart.second != 0 ||
- icEnd.hour + icEnd.minute + icEnd.second != 0) {
- *lpblIsAllday = false;
- return hrSuccess;
- }
- lpicProp = icalcomponent_get_first_property(lpicEvent, ICAL_X_PROPERTY);
- while (lpicProp) {
- if (strcmp(icalproperty_get_x_name(lpicProp), "X-MICROSOFT-CDO-ALLDAYEVENT") == 0){
- blIsAllday = strcmp(icalproperty_get_x(lpicProp),"TRUE") == 0;
- break;
- }
- lpicProp = icalcomponent_get_next_property(lpicEvent, ICAL_X_PROPERTY);
- }
- *lpblIsAllday = blIsAllday;
- return hrSuccess;
- }
- HRESULT VConverter::HrMAPI2ICal(LPMESSAGE lpMessage, icalproperty_method *lpicMethod, std::list<icalcomponent*> *lpEventList)
- {
- HRESULT hr = hrSuccess;
- std::list<icalcomponent*> lstEvents;
- icalproperty_method icMainMethod = ICAL_METHOD_NONE;
- icalcomp_ptr lpicEvent;
- memory_ptr<SPropValue> lpSpropValArray;
- std::unique_ptr<icaltimezone, icalmapi_delete> lpicTZinfo;
- std::string strTZid;
- ULONG cbSize = 0;
- SizedSPropTagArray(3, proptags) = {3,
- {CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_RECURRING], PT_BOOLEAN),
- CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_ISRECURRING], PT_BOOLEAN),
- CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_TASK_ISRECURRING], PT_BOOLEAN)}};
-
- hr = HrMAPI2ICal(lpMessage, &icMainMethod, &unique_tie(lpicTZinfo),
- &strTZid, &unique_tie(lpicEvent));
- if (hr != hrSuccess)
- return hr;
- cbSize = 0;
- hr = lpMessage->GetProps(proptags, 0, &cbSize, &~lpSpropValArray);
- if (FAILED(hr))
- return hrSuccess;
- hr = hrSuccess;
-
- if (((PROP_TYPE(lpSpropValArray[0].ulPropTag) != PT_ERROR) &&
- lpSpropValArray[0].Value.b == TRUE) ||
- ((PROP_TYPE(lpSpropValArray[1].ulPropTag) != PT_ERROR) &&
- lpSpropValArray[1].Value.b == TRUE) ||
- ((PROP_TYPE(lpSpropValArray[2].ulPropTag) != PT_ERROR) &&
- lpSpropValArray[2].Value.b == TRUE))
- {
- hr = HrSetRecurrence(lpMessage, lpicEvent.get(),
- lpicTZinfo.get(), strTZid, &lstEvents);
- if (hr != hrSuccess)
- return hr;
- }
-
- lstEvents.push_front(lpicEvent.release());
-
- *lpicMethod = icMainMethod;
- *lpEventList = std::move(lstEvents);
- return hr;
- }
- HRESULT VConverter::HrMAPI2ICal(LPMESSAGE lpMessage, icalproperty_method *lpicMethod, icaltimezone **lppicTZinfo, std::string *lpstrTZid, icalcomponent *lpEvent)
- {
- HRESULT hr = hrSuccess;
- icalproperty_method icMethod = ICAL_METHOD_NONE;
- icalproperty *lpProp = NULL;
- const SPropValue *lpPropVal = nullptr;
- memory_ptr<SPropValue> lpMsgProps;
- ULONG ulMsgProps = 0;
- TIMEZONE_STRUCT ttTZinfo = {0};
- icaltimezone *lpicTZinfo = NULL;
- ULONG ulCount = 0;
- std::string strTZid;
- std::string strUid;
- std::wstring wstrBuf;
- hr = lpMessage->GetProps(NULL, MAPI_UNICODE, &ulMsgProps, &~lpMsgProps);
- if (FAILED(hr))
- return hr;
- hr = HrFindTimezone(ulMsgProps, lpMsgProps, &strTZid, &ttTZinfo, &lpicTZinfo);
- if (hr != hrSuccess)
- return hr;
-
- if(!m_bCensorPrivate) {
-
- hr = HrSetOrganizerAndAttendees(lpMessage, lpMessage, ulMsgProps, lpMsgProps, &icMethod, lpEvent);
- if (hr != hrSuccess)
- return hr;
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_BUSYSTATUS], PT_LONG));
- if (!m_bCensorPrivate && lpPropVal)
- HrSetBusyStatus(lpMessage, lpPropVal->Value.ul, lpEvent);
-
-
- hr = HrSetTimeProperties(lpMsgProps, ulMsgProps, lpicTZinfo, strTZid, lpEvent);
- if (hr != hrSuccess)
- return hr;
-
- hr = HrSetRecurrenceID(lpMsgProps, ulMsgProps, lpicTZinfo, strTZid, lpEvent);
- if (hr != hrSuccess)
- return hr;
-
- if(m_bCensorPrivate) {
- lpProp = icalproperty_new_summary("Private Appointment");
- icalcomponent_add_property(lpEvent, lpProp);
- }
- else {
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_SUBJECT_W);
- if (lpPropVal && lpPropVal->Value.lpszW[0] != '\0') {
- lpProp = icalproperty_new_summary(m_converter.convert_to<string>(m_strCharset.c_str(), lpPropVal->Value.lpszW, rawsize(lpPropVal->Value.lpszW), CHARSET_WCHAR).c_str());
- icalcomponent_add_property(lpEvent, lpProp);
- }
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_LOCATION], PT_UNICODE));
- if (!m_bCensorPrivate && lpPropVal && lpPropVal->Value.lpszW[0] != '\0') {
- lpProp = icalproperty_new_location(m_converter.convert_to<string>(m_strCharset.c_str(), lpPropVal->Value.lpszW, rawsize(lpPropVal->Value.lpszW), CHARSET_WCHAR).c_str());
- icalcomponent_add_property(lpEvent, lpProp);
- }
-
- if(!m_bCensorPrivate) {
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_BODY_W);
- if (lpPropVal && lpPropVal->Value.lpszW[0] != '\0') {
- std::wstring strBody;
-
-
- StringTabtoSpaces(lpPropVal->Value.lpszW, &strBody);
- StringCRLFtoLF(strBody, &strBody);
- lpProp = icalproperty_new_description(m_converter.convert_to<string>(m_strCharset.c_str(), lpPropVal->Value.lpszW, rawsize(lpPropVal->Value.lpszW), CHARSET_WCHAR).c_str());
- } else {
- hr = HrSetBody(lpMessage, &lpProp);
- }
- if (hr == hrSuccess)
- icalcomponent_add_property(lpEvent, lpProp);
- hr = hrSuccess;
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_IMPORTANCE);
- if (!m_bCensorPrivate && lpPropVal) {
- lpProp = icalproperty_new_priority(5 - ((lpPropVal->Value.l - 1) * 4));
- icalcomponent_add_property(lpEvent, lpProp);
- } else {
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_PRIORITY);
- if (!m_bCensorPrivate && lpPropVal && lpPropVal->Value.l != 0) {
- lpProp = icalproperty_new_priority(5 - (lpPropVal->Value.l * 4));
- icalcomponent_add_property(lpEvent, lpProp);
- }
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_KEYWORDS], PT_MV_UNICODE));
- if (lpPropVal && lpPropVal->Value.MVszA.cValues > 0) {
-
- wstrBuf.reserve(lpPropVal->Value.MVszW.cValues * 50);
- for (ulCount = 0; ulCount < lpPropVal->Value.MVszW.cValues; ++ulCount) {
- if (ulCount)
- wstrBuf += L",";
- wstrBuf += lpPropVal->Value.MVszW.lppszW[ulCount];
- }
- if (!wstrBuf.empty()) {
- lpProp = icalproperty_new_categories(m_converter.convert_to<string>(m_strCharset.c_str(), wstrBuf, rawsize(wstrBuf), CHARSET_WCHAR).c_str());
- icalcomponent_add_property(lpEvent, lpProp);
- }
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_NETSHOWURL], PT_UNICODE));
- if (lpPropVal && lpPropVal->Value.lpszW[0] != '\0') {
- lpProp = icalproperty_new_url(m_converter.convert_to<string>(m_strCharset.c_str(), lpPropVal->Value.lpszW, rawsize(lpPropVal->Value.lpszW), CHARSET_WCHAR).c_str());
- icalcomponent_add_property(lpEvent, lpProp);
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_CONTACTS], PT_MV_UNICODE));
- if (lpPropVal) {
- for (ulCount = 0; ulCount < lpPropVal->Value.MVszW.cValues; ++ulCount) {
- lpProp = icalproperty_new_contact(m_converter.convert_to<string>(m_strCharset.c_str(), lpPropVal->Value.MVszW.lppszW[ulCount], rawsize(lpPropVal->Value.MVszW.lppszW[ulCount]), CHARSET_WCHAR).c_str());
- icalcomponent_add_property(lpEvent, lpProp);
- }
- }
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_SENSITIVITY);
- if (lpPropVal) {
- switch (lpPropVal->Value.ul) {
- case 1:
- case 2:
- lpProp = icalproperty_new_class(ICAL_CLASS_PRIVATE);
- break;
- case 3:
- lpProp = icalproperty_new_class(ICAL_CLASS_CONFIDENTIAL);
- break;
- default:
- lpProp = icalproperty_new_class(ICAL_CLASS_PUBLIC);
- break;
- }
- icalcomponent_add_property(lpEvent, lpProp);
- }
-
-
-
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_GOID], PT_BINARY));
- if (lpPropVal == NULL)
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_CLEANID], PT_BINARY));
-
-
- if (lpPropVal == NULL) {
- SPropValue propUid;
- hr = HrGenerateUid(&strUid);
- if (hr != hrSuccess)
- return hr;
- hr = HrMakeBinaryUID(strUid, lpMsgProps, &propUid);
-
-
-
- propUid.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_GOID], PT_BINARY);
- HrSetOneProp(lpMessage, &propUid);
-
- propUid.ulPropTag = CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_CLEANID], PT_BINARY);
- HrSetOneProp(lpMessage, &propUid);
-
-
- hr = lpMessage->SaveChanges(KEEP_OPEN_READWRITE);
- if (hr == E_ACCESSDENIED) {
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, PR_ENTRYID);
- if (lpPropVal)
- strUid = bin2hex(lpPropVal->Value.bin.cb,lpPropVal->Value.bin.lpb);
- }
- hr = hrSuccess;
- } else {
- HrGetICalUidFromBinUid(lpPropVal->Value.bin, &strUid);
- }
- if(IsOutlookUid(strUid))
- strUid.replace(32, 8, "00000000");
- lpProp = icalproperty_new_uid(strUid.c_str());
- icalcomponent_add_property(lpEvent,lpProp);
- hr = HrSetItemSpecifics(ulMsgProps, lpMsgProps, lpEvent);
- if (hr != hrSuccess)
- return hr;
-
- lpPropVal = PCpropFindProp(lpMsgProps, ulMsgProps, CHANGE_PROP_TYPE(m_lpNamedProps->aulPropTag[PROP_APPTSEQNR], PT_LONG));
- if(lpPropVal)
- {
- lpProp = icalproperty_new_sequence(lpPropVal->Value.ul);
- icalcomponent_add_property(lpEvent, lpProp);
- }
-
- if(!m_bCensorPrivate) {
- hr = HrSetVAlarm(ulMsgProps, lpMsgProps, lpEvent);
- if (hr != hrSuccess)
- return hr;
- }
-
- hr = HrSetXHeaders(ulMsgProps, lpMsgProps, lpMessage, lpEvent);
- if (hr != hrSuccess)
- return hr;
-
-
- if (lpicMethod)
- *lpicMethod = icMethod;
- if (lppicTZinfo)
- *lppicTZinfo = lpicTZinfo;
- if (lpstrTZid)
- *lpstrTZid = std::move(strTZid);
- return hrSuccess;
- }
- }
|