Пример #1
0
LPSPropValue CMapiApi::GetMapiProperty( LPMAPIPROP pProp, ULONG tag)
{
  if (!pProp)
    return( NULL);

  int  sz = CbNewSPropTagArray( 1);
  SPropTagArray *pTag = (SPropTagArray *) new char[sz];
  pTag->cValues = 1;
  pTag->aulPropTag[0] = tag;
  LPSPropValue  lpProp = NULL;
  ULONG  cValues = 0;
  HRESULT hr = pProp->GetProps( pTag, 0, &cValues, &lpProp);
  delete [] pTag;
  if (HR_FAILED( hr) || (cValues != 1)) {
    if (lpProp)
      MAPIFreeBuffer( lpProp);
    return( NULL);
  }
  else {
    if (PROP_TYPE( lpProp->ulPropTag) == PT_ERROR) {
      if (lpProp->Value.l == MAPI_E_NOT_FOUND) {
        MAPIFreeBuffer( lpProp);
        lpProp = NULL;
      }
    }
  }

  return( lpProp);
}
BOOL CExMapi::AreSame(LPMAPIPROP lpMapiProp1,LPMAPIPROP lpMapiProp2)
{
	if(!m_pSession) return FALSE;
	BOOL bResult=FALSE;

	if(lpMapiProp1 != NULL && lpMapiProp2 != NULL)
	{
		ULONG cbEntryId1;
		ULONG cbEntryId2;
		LPENTRYID lpEntryId1 = NULL;	
		LPENTRYID lpEntryId2 = NULL;

		SPropValue * rgprops1 = NULL;
		SPropValue * rgprops2 = NULL;
		ULONG rgTags[] = {1, PR_ENTRYID};
		ULONG cCount1   = 0;
		ULONG cCount2   = 0;
		// Get the message store entryid properties.
		if(SUCCEEDED(lpMapiProp1->GetProps((LPSPropTagArray) rgTags, MAPI_UNICODE, &cCount1, &rgprops1)))
		{
			cbEntryId1 = rgprops1[0].Value.bin.cb;
			lpEntryId1 = (ENTRYID*)rgprops1[0].Value.bin.lpb;
		}

		if(SUCCEEDED(lpMapiProp2->GetProps((LPSPropTagArray) rgTags, MAPI_UNICODE, &cCount2, &rgprops2)))
		{
			cbEntryId2 = rgprops2[0].Value.bin.cb;
			lpEntryId2 = (ENTRYID*)rgprops2[0].Value.bin.lpb;
		}

		if(lpEntryId1 != NULL && lpEntryId2 != NULL)
		{
			ULONG lResult;
			if(SUCCEEDED(m_pSession->CompareEntryIDs(cbEntryId1,lpEntryId1,cbEntryId2,lpEntryId2,0,&lResult)))
			{
				bResult = (BOOL)lResult;
			}			
		}

		MAPIFreeBuffer(rgprops1);
		MAPIFreeBuffer(rgprops2);
	}
	return bResult;
}
nsresult nsOutlookMail::CreateList(const PRUnichar * pName,
                                   nsIAddrDatabase *pDb,
                                   LPMAPIPROP pUserList,
                                   nsIImportFieldMap *pFieldMap)
{
  // If no name provided then we're done.
  if (!pName || !(*pName))
    return NS_OK;

  nsresult rv = NS_ERROR_FAILURE;
  // Make sure we have db to work with.
  if (!pDb)
    return rv;

  nsCOMPtr <nsIMdbRow> newListRow;
  rv = pDb->GetNewListRow(getter_AddRefs(newListRow));
  NS_ENSURE_SUCCESS(rv, rv);
  nsAutoCString column;
  LossyCopyUTF16toASCII(nsDependentString(pName), column);
  rv = pDb->AddListName(newListRow, column.get());
  NS_ENSURE_SUCCESS(rv, rv);

  HRESULT             hr;
  LPSPropValue value = NULL;
  ULONG valueCount = 0;

  LPSPropTagArray properties = NULL;
  m_mapi.MAPIAllocateBuffer(CbNewSPropTagArray(1),
    (void **)&properties);
  properties->cValues = 1;
  properties->aulPropTag [0] = m_mapi.GetEmailPropertyTag(pUserList, 0x8054);
  hr = pUserList->GetProps(properties, 0, &valueCount, &value);
  m_mapi.MAPIFreeBuffer(properties);
  if (HR_FAILED(hr))
    return NS_ERROR_FAILURE;
  if (!value)
    return NS_ERROR_NOT_AVAILABLE;
  // XXX from here out, value must be freed with MAPIFreeBuffer 

  SBinaryArray *sa=(SBinaryArray *)&value->Value.bin;
  if (!sa || !sa->lpbin) {
    m_mapi.MAPIFreeBuffer(value);
    return NS_ERROR_NULL_POINTER;
  }

  LPENTRYID    lpEid;
  ULONG        cbEid;
  int32_t        idx;
  LPMESSAGE        lpMsg;
  nsCString        type;
  LPSPropValue    pVal;
  nsString        subject;
  uint32_t total;

  total=sa->cValues;
  for (idx = 0; idx < sa->cValues; idx++)
  {
    lpEid= (LPENTRYID) sa->lpbin[idx].lpb;
    cbEid = sa->lpbin[idx].cb;

    if (!m_mapi.OpenEntry(cbEid, lpEid, (LPUNKNOWN *) &lpMsg))
    {

      IMPORT_LOG1("*** Error opening messages in mailbox: %S\n", pName);
      m_mapi.MAPIFreeBuffer(value);
      return NS_ERROR_FAILURE;
    }
    // This is a contact, add it to the address book!
    subject.Truncate();
    pVal = m_mapi.GetMapiProperty(lpMsg, PR_SUBJECT);
    if (pVal)
      m_mapi.GetStringFromProp(pVal, subject);

    nsCOMPtr <nsIMdbRow> newRow;
    nsCOMPtr <nsIMdbRow> oldRow;
    pDb->GetNewRow(getter_AddRefs(newRow));
    if (newRow) {
      if (BuildCard(subject.get(), pDb, newRow, lpMsg, pFieldMap))
      {
        nsCOMPtr <nsIAbCard> userCard;
        nsCOMPtr <nsIAbCard> newCard;
        userCard = do_CreateInstance(NS_ABMDBCARD_CONTRACTID, &rv);
        NS_ENSURE_SUCCESS(rv, rv);
        pDb->InitCardFromRow(userCard,newRow);

        //add card to db
        bool bl=false;
        pDb->FindRowByCard(userCard,getter_AddRefs(oldRow));
        if (oldRow)
          newRow = oldRow;
        else
          pDb->AddCardRowToDB(newRow);

        //add card list
        pDb->AddListCardColumnsToRow(userCard,
                                     newListRow,idx+1, getter_AddRefs(newCard),
                                     true, nullptr, nullptr);
      }
    }
  }
  m_mapi.MAPIFreeBuffer(value);

  rv = pDb->AddCardRowToDB(newListRow);
  NS_ENSURE_SUCCESS(rv, rv);

  rv = pDb->SetListAddressTotal(newListRow, total);
  rv = pDb->AddListDirNode(newListRow);
  return rv;
}