void FeatureSOLIDCreatePatternCirc::GetInfo(void)
{
	
	TransCAD::IStdSolidOperatePatternCircularFeaturePtr spFeature = GetTransCADFeature();

	TransCAD::IReferencePtr spTargetFeature = spFeature->TargetFeature;
	
	_featurename = spTargetFeature->ReferenceeName;

	
	_isradial = spFeature->IsRadialAnignment;

	_gcvt(spFeature->NumberOfPatterns, MAX_DIGITS, _patternnumber);
	
	_gcvt(spFeature->AngleIncrement, MAX_DIGITS, _angleincrement);


	spFeature->GetCenterAxis(&_ptorg[0],&_ptorg[1],&_ptorg[2],&_ptvec[0],&_ptvec[1],&_ptvec[2]);

	_ptvec[0]=0;
		_ptvec[1]=0;
			_ptvec[2]=1;
 
	cout<<_featurename<<endl<<_patternnumber<<endl<<_angleincrement<<endl<<_isradial<<endl<<endl<<endl;
	cout<<_ptorg[0]<<endl<<_ptorg[1]<<endl<<_ptorg[2]<<endl<<_ptvec[0]<<endl<<_ptvec[1]<<endl<<_ptvec[2]<<endl;


}
void main()
{
double x;
char c[80];

x=1.23456e-5;
_gcvt(x,15,&c[0]);
printf("%lg=%s\n",x,c);
x=1.23456e5;
_gcvt(x,15,&c[0]);
printf("%lg=%s\n",x,c);
scanf("%c%c",c,c);
}
Exemple #3
0
/*
    010602 Carl Corcoran
*/
HRESULT CCString::FromDouble(double d)
{
    char sz[50];
    _gcvt(d, 10, sz);
    this->_CreateFromA(sz);
    return S_OK;
}
bool use_gcvt(double number, char* string, short size)
{
	char *buffer,*temp ;
	int length;

	temp = _gcvt (number, size, string);
	length = strlen(temp);
	buffer = (char *) malloc (length + 2);
	if (buffer==NULL)
		return false;

	strcpy(buffer,temp);
	if (temp[length-1] == '.')
	{
		strcpy(buffer,temp);
		strcat(buffer,"0");
	}
	if (temp[0] == '.')
	{
		strcpy( buffer, "0");
		strcat( buffer, temp);
	}
	strcpy(string,buffer);
	free (buffer);

	if (strlen(string)>size)
		return false;
	else
		return true;
}
Exemple #5
0
bool z_convert(const double &from,char* to,int size,ctext format) 
{
    if(size>14) //leave room for extra: -3.32e+211
		_gcvt(from,4,to);
    //_gcvt_s(to,size,from,4);
	return true;
}
Exemple #6
0
bool z_convert(const double &val,z_string &t,ctext format)
{
    char buff[20];
    _gcvt(val,4,buff);
	t=buff;
	return true;
}
Exemple #7
0
disp_gcvt(double dblIn, int ndigits, OLECHAR FAR* pchOut, int bufSize)
{
    char buf[40];

    _gcvt(dblIn, ndigits, buf);
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, buf, -1, pchOut, bufSize);
}
Exemple #8
0
/////////////
// ExpFuncStr
void ExpFuncStr::Evaluate(ExpReturn* er)
{
	p->Evaluate(er);

	char strbuf[32];

	switch (er->eType) {
	case EXPTYPE_INTEGER:
		_i64toa(er->eData.iVal, strbuf, 10);
		temp = strbuf;
		er->eData.str = &temp;
		er->eType = EXPTYPE_STRING;
		return;
	case EXPTYPE_FLOAT:
		_gcvt(er->eData.fVal, DBL_DIG, strbuf);
		temp = strbuf;
		if (temp.Right(1) == ".")
			temp.Delete(temp.GetLength() - 1);
		er->eData.str = &temp;
		er->eType = EXPTYPE_STRING;
		return;
	case EXPTYPE_STRING:
		return;
	}

	// Types invalid: return without modifying er (!)
	TYPEMISMATCH1(er, "'string' cast");
}
Exemple #9
0
	wstring ToStr(double Value)
	{
		char AnsiBuffer[100];
		wchar_t Buffer[100];
		_gcvt(Value,18,AnsiBuffer);
		mbstowcs(Buffer,AnsiBuffer,100);
		return Buffer;
	}
void CDlgInfo::OnNMReleasedcaptureSliderSigmaTb(NMHDR *pNMHDR, LRESULT *pResult)
{
	float val = m_sigmaTB.GetPos() * 0.01f;
	m_pView->SetSigmaTB(val);
	TCHAR tchBuffer[BUFFER]; 
	SetDlgItemText(IDC_STATIC_SigmaTBtrue, 	_gcvt(val, 5, tchBuffer)); 
	*pResult = 0;
}
char *FdoCommonOSUtil::gcvt(double number, size_t ndigits, char *buf)
{
#ifdef _WIN32
    return _gcvt (number, (int)ndigits, buf);
#else
    return ::gcvt (number, (int)ndigits, buf);
#endif
}
Exemple #12
0
CString DblToStr(double dblVal, int ndigits)
{
	CString strRet;
	char buff[50];

   _gcvt(dblVal, ndigits, buff);
	strRet = buff;
	return strRet;
}
Exemple #13
0
CString DblToStr(float fltVal)
{
	CString strRet;
	char buff[50];
	
   _gcvt(fltVal, 10, buff);
	strRet = buff;
	return strRet;
}
void BencodeData(StringValue *s, ScriptValue *sv, int strict, int *pos) {
	if (sv->type == SCRIPT_NULL ||
		sv->type == SCRIPT_OBJECT) {
			if (!strict) {
				s->value[pos[0]] = 'n';
				pos[0]++;
			}
			else {
				s->value[pos[0]] = '0';
				s->value[pos[0]+1] = ':';
				pos[0]+=2;
			}
	}
	else if (sv->type == SCRIPT_INT) {
		s->value[pos[0]++] = 'i';
		_i64toa(sv->intVal, (char*)s->value+pos[0], 10);
		pos[0] += (int)strlen(s->value+pos[0]);
		s->value[pos[0]++] = 'e';
	}
	else if (sv->type == SCRIPT_STRING) {
		itoa(sv->stringVal->len, (char*)s->value+pos[0], 10);
		pos[0] += (int)strlen(s->value+pos[0]);
		s->value[pos[0]++] = ':';
		memcpy(s->value+pos[0], sv->stringVal->value, sv->stringVal->len);
		pos[0] += sv->stringVal->len;
	}
	else if (sv->type == SCRIPT_LIST) {
		s->value[pos[0]++] = 'l';
		for (int i=0; i<sv->listVal->numVals; i++) {
			BencodeData(s, sv->listVal->vals+i, strict, pos);
		}
		s->value[pos[0]++] = 'e';
	}
	else if (sv->type == SCRIPT_DICT) {
		s->value[pos[0]++] = 'd';
		//sv->dictVal->Sort();
		for (int i=0; i<sv->dictVal->numEntries; i++) {
			BencodeData(s, &sv->dictVal->entries[i].key, strict, pos);
			BencodeData(s, &sv->dictVal->entries[i].val, strict, pos);
		}
		s->value[pos[0]++] = 'e';
	}
	else if (sv->type == SCRIPT_DOUBLE) {
		if (strict) {
			char temp[30];
			_gcvt(sv->doubleVal, 14, temp);
			sprintf((char*)s->value + pos[0], "%i:%s", strlen(temp), temp);
			pos[0] += (int) strlen(s->value+pos[0]);
		}
		else {
			s->value[pos[0]++] = 'f';
			memcpy(s->value+pos[0], &sv->doubleVal, 8);
			pos[0]+=8;
		}
	}
}
		inline void GetStringRepresentation(char *buffer, double value)
		{
			int precision = 4 ; 
			int intLen = (int)(precision*1.0 + log10(value)) ; 
			_gcvt(value, intLen, buffer) ; 
			if (strlen(buffer) > 0 && buffer[strlen(buffer)-1] == '.')
			{
				buffer[strlen(buffer)-1] = '\0' ; 
			}
		}
guiConsole &guiConsole::operator<<(const double &_val)
{
	char temp[80];
	_gcvt(_val,10,temp);
	text += temp;
	SDL_FreeSurface(foreground);
	foreground = TTF_RenderText_Solid(ttfFont,text.c_str(),fontColor);
	reDraw = true;
	return(*this);
}
// Convert double to CString
CString FloatToString(double x)
{
	char strbuf[32];
	_gcvt(x, 7, strbuf);
	
	// Last character is a dot - remove it
	int lastch = strlen(strbuf) - 1;
	if (strbuf[lastch] == '.')
		strbuf[lastch] = '\0';

	return strbuf;
}
CString ExpBase::GetString() const
{
	switch (eType) {
	case EXPTYPE_INTEGER:
		{
			char strbuf[32];
			_i64toa(eData.iVal, strbuf, 10);
			return strbuf;
		}
	case EXPTYPE_FLOAT:
		{
			char strbuf[32];
			_gcvt(eData.fVal, DBL_DIG, strbuf);
			CString str = strbuf;
			if (str.Right(1) == ".")
				str.Delete(str.GetLength() - 1);
			return str;
		}
	case EXPTYPE_STRING:
		return (const char*)*(eData.str);
	case EXPTYPE_ARRAY:
		{
		// Build an expression style array string eg {1, 3, 5, 6}
		CString s = "{";

		ExpStore* ptr = eData.arr.pArray;
		ExpStore* end = eData.arr.pArray + eData.arr.size;
		ExpStore* last = end - 1;

		for ( ; ptr != end; ptr++) {

			bool isString = (ptr->Type() == EXPTYPE_STRING);

			if (isString)
				s += '"';

			s += (const char*)(ptr->GetString());

			if (isString)
				s += '"';

			if (ptr != last)
				s += ", ";
		}

		s += "}";

		return s;
		}
	default:
		return "";
	}
}
Exemple #19
0
char *toip(int myhost)
{
	char x[10];
	char *cng;
	_gcvt((myhost & 0xff000000)/0x01000000, 5, x);
	cng = strstr(x, ".");
	if(cng != NULL)
	{
		*cng = '\0';
	}
	strcpy(qchar, x);
	strcat(qchar, ".");
	_gcvt((myhost & 0x00ff0000)/0x00010000, 5, x);
	cng = strstr(x, ".");
	if(cng != NULL)
	{
		*cng = '\0';
	}
	strcat(qchar, x);
	strcat(qchar, ".");
	_gcvt((myhost & 0x0000ff00)/256, 5, x);
	cng = strstr(x, ".");
	if(cng != NULL)
	{
		*cng = '\0';
	}
	strcat(qchar, x);
	strcat(qchar, ".");
	_gcvt((myhost & 0x000000ff), 5, x);
	cng = strstr(x, ".");
	if(cng != NULL)
	{
		*cng = '\0';
	}
	strcat(qchar, x);
	return qchar;

}
std::string Exporter::getBoneInfo() const
{
	std::string result;
	
	char number[20] = { 0 };
	_itoa(bones.size(), number, 10);
	std::string boneAmount = number;

	for(unsigned int i = 0; i < bones.size(); ++i)
	{
		_itoa(i+1, number, 10);
		result += "Bone (" + std::string(number) + "/" + boneAmount + ")\r\n";
		result += "\tName: " + bones[i].getName() + "\r\n";
		result += "\tParent: " + bones[i].getParentName() + "\r\n";
		_gcvt(bones[i].getRestLength(), 7, number);
		result += "\tRest length: " + std::string(number) + "\r\n";

		_gcvt(bones[i].getRadius(), 7, number);
		result += "\tBone radius: " + std::string(number) + "\r\n";
	}

	return result;
}
Exemple #21
0
void DblToStr(double dblVal, int ndigits, char* strVal, unsigned size)
{
	char buff[50] = "";
	int nCopySize = 0;
	int nStrLen = 0;

	_gcvt(dblVal, ndigits, buff);
	nCopySize = strlen(buff) > 50 ? 50 : strlen(buff);
	nStrLen = nCopySize > size ? size : nCopySize;
	memcpy(strVal, buff, nStrLen);
	strVal[nStrLen] = '\0';

	return;
}
void DecreaseAI() {
    DECLARE_MWBRIDGE
    float f = mwBridge->GetAIDistance();
    SatDown(&f,0,0.015625f);
	mwBridge->SetAIDistance(f);
    if ((MGEFlags & DISPLAY_MESSAGES) && RealDevice != NULL) {
        char str[15];
        char str2[31]; str2[0]='\0';
        strcat(str2,"AI distance: ");
        _gcvt(f,8,str);
        strcat_s(str2,30,str);
        SETSTATUS(str2);
    }
}
Exemple #23
0
void DblToStr(float fltVal, char* strVal, unsigned size)
{
	char buff[50] = "";
	int nCopySize = 0;
	int nStrLen = 0;

	_gcvt(fltVal, 10, buff);
	nCopySize = strlen(buff) > 50 ? 50 : strlen(buff);
	nStrLen = nCopySize > size ? size : nCopySize;
	memcpy(strVal, buff, nStrLen);
	strVal[nStrLen] = '\0';

	return;
}
void CDlgInfo::OnNMReleasedcaptureSliderGb(NMHDR *pNMHDR, LRESULT *pResult)
{
	int pos = m_GB.GetPos();
	float newVal = float(0.01f * pos);
	//0.5~0.95 only
	if(newVal < 0.5f)
	{
		newVal = 0.5f;
		m_GB.SetPos(newVal / 0.01f);
	}
	if(newVal > 0.95f)
	{
		newVal = 0.95f;
		m_GB.SetPos(newVal / 0.01f);
	}

	m_pView->SetGB(newVal);
	TCHAR tchBuffer[BUFFER]; 
	SetDlgItemText(IDC_STATIC_GB, _gcvt(newVal, 5, tchBuffer)); 
	*pResult = 0;
}
int GetLength(ScriptValue *sv, int strict) {
	if (sv->type == SCRIPT_NULL ||
		sv->type == SCRIPT_OBJECT) {
		if (!strict) return 1;
		return 2;
	}
	else if (sv->type == SCRIPT_INT) {
		return 2 + GetIntLength(sv->intVal);
	}
	else if (sv->type == SCRIPT_STRING) {
		return 1 + sv->stringVal->len + GetIntLength(sv->stringVal->len);
	}
	else if (sv->type == SCRIPT_LIST) {
		int len = 2;
		for (int i=0; i<sv->listVal->numVals; i++) {
			len += GetLength(sv->listVal->vals+i, strict);
		}
		return len;
	}
	else if (sv->type == SCRIPT_DICT) {
		int len = 2;
		for (int i=0; i<sv->dictVal->numEntries; i++) {
			len += GetLength(&sv->dictVal->entries[i].key, strict);
			len += GetLength(&sv->dictVal->entries[i].val, strict);
		}
		return len;
	}
	else if (sv->type == SCRIPT_DOUBLE) {
		if (strict) {
			char temp[30];
			_gcvt(sv->doubleVal, 14, temp);
			int len = (int)strlen(temp);
			return 1 + len + GetIntLength(len);
		}
		return 1+8;
	}
	else
		return 0;
}
Exemple #26
0
void WriteOutput(float Number) {
	char String[35];
	_gcvt(Number, 10, String);
	WriteUnicodeString(_totchar(String));
}
Exemple #27
0
void ExpAnd::Evaluate(ExpReturn* er)
{
	ExpReturn param;

	l->Evaluate(er);
	r->Evaluate(&param);

	// Also does string concats
	switch (er->eType) {

	case EXPTYPE_INTEGER:

		switch (param.eType) {
		case EXPTYPE_INTEGER:
			er->eData.iVal = (er->eData.iVal && param.eData.iVal);
			return;
		case EXPTYPE_STRING: {
			er->eType = EXPTYPE_STRING;
			char strbuf[32];
			_i64toa(er->eData.iVal, strbuf, 10);
			temp = strbuf;
			temp += *(param.eData.str);
			er->eData.str = &temp;
			return;
			}
		}//switch

	case EXPTYPE_FLOAT:
		switch(param.eType) {
		case EXPTYPE_STRING:
			{
				er->eType = EXPTYPE_STRING;
				char strbuf[32];
				_gcvt(er->eData.fVal, DBL_DIG, strbuf);
				temp = strbuf;
				if (temp.Right(1) == ".")
					temp = temp.Left(temp.GetLength() - 1);
				temp += *(param.eData.str);
				er->eData.str = &temp;
				return;
			}
		}
	case EXPTYPE_STRING:
		switch(param.eType) {
		case EXPTYPE_INTEGER:
			{
				char strbuf[32];
				_i64toa(param.eData.iVal, strbuf, 10);
				*(er->eData.str) += strbuf;
				return;
			}
		case EXPTYPE_FLOAT:
			{
				char strbuf[32];
				_gcvt(param.eData.fVal, DBL_DIG, strbuf);
				temp = strbuf;
				if (temp.Right(1) == ".")
					temp = temp.Left(temp.GetLength() - 1);
				*(er->eData.str) += temp;
				return;
			}
		case EXPTYPE_STRING:
			{
				*(er->eData.str) += *(param.eData.str);
				return;
			}
		}
	}//switch

	// Types invalid: return without modifying er (!)
	TYPEMISMATCH2(er, &param, "perform 'and'");
}
Exemple #28
0
long WMIUtil::WMIObjAddNVItem (IWbemClassObject * Obj, BSTR ObjAttr, NVDataItem * TargetData, char * DataName, char * DefaultVal)
{
	USES_CONVERSION;

	char NumBuf[NUM_BUF_SIZE];

	CComVariant ValueVariant;

	HRESULT hr;

	hr = Obj->Get (ObjAttr,	// Name
					0,				// Flags
					&ValueVariant,	// return Variant
					NULL, NULL);    // Type and Origin (optional parms)

	if (FAILED(hr))
		return ERROR_GEN_FAILURE;

	//cout << "Partition VT = " << PartitionVariant.vt << endl;

	switch (ValueVariant.vt) {

	case VT_BSTR:
		TargetData->AddNVItem (DataName, ValueVariant.bstrVal);
		
		break;

	case VT_I4:
		TargetData->AddNVItem (DataName, _itoa(ValueVariant.lVal, NumBuf , 10));
		break;

	case VT_I2:
		TargetData->AddNVItem (DataName, _itoa(ValueVariant.iVal, NumBuf , 10));
		break;

	case VT_BOOL:
		TargetData->AddNVItem (DataName, ValueVariant.boolVal ? "Yes" : "No");
		break;

//	case VT_I8:
//		TargetData->AddNVItem (DataName, _i64toa(ValueVariant.ullVal, NumBuf , 10));
//		break;

	case VT_R4:
		TargetData->AddNVItem (DataName, _gcvt(ValueVariant.fltVal, 10, NumBuf));
		break;

	case VT_R8:
		TargetData->AddNVItem (DataName, _gcvt(ValueVariant.dblVal, 10, NumBuf));
		break;

	case VT_I1:
		TargetData->AddNVItem (DataName, _itoa(ValueVariant.bVal, NumBuf , 10));
		break;

	case VT_NULL:
	case VT_EMPTY:
		if (DefaultVal != NULL)
			TargetData->AddNVItem (DataName, DefaultVal);
		break;

	case (VT_BSTR | VT_ARRAY): 
		{
			if (ValueVariant.parray->cDims > 1)
				return ERROR_GEN_FAILURE;

			CComBSTR ConcatValue;
			BSTR * BSTRAccess;
			
			hr = SafeArrayAccessData (ValueVariant.parray, (void **) & BSTRAccess);
			if (FAILED(hr))
				return ERROR_GEN_FAILURE;

			long Index;
			long NumElements = ValueVariant.parray->rgsabound[0].cElements;

			for (Index = 0; Index < NumElements; Index ++) {

				if (Index > 0)
					ConcatValue.Append(L",");

				ConcatValue.AppendBSTR(BSTRAccess[Index]);

			}

			SafeArrayUnaccessData(ValueVariant.parray);

			TargetData->AddNVItem (DataName, ConcatValue);
		}

		break;

	case VT_I4 | VT_ARRAY:
	case VT_I2 | VT_ARRAY:
	default:
		assert(0);
		return ERROR_GEN_FAILURE;
	}

	return ERROR_SUCCESS;
}
static void convert_from_float(MYSQL_BIND *r_param, const MYSQL_FIELD *field, float val, int size)
{
  double check_trunc_val= (val > 0) ? floor(val) : -floor(-val);
  char *buf= (char *)r_param->buffer;
  switch (r_param->buffer_type)
  {
    case MYSQL_TYPE_TINY:
      *buf= (r_param->is_unsigned) ? (uint8)val : (int8)val;
      *r_param->error= check_trunc_val != (r_param->is_unsigned ? (double)((uint8)*buf) :
                                          (double)((int8)*buf));
      r_param->buffer_length= 1;
    break;
    case MYSQL_TYPE_SHORT:
    case MYSQL_TYPE_YEAR:
    {
      if (r_param->is_unsigned)
      {
        ushort sval= (ushort)val;
        shortstore(buf, sval);
        *r_param->error= check_trunc_val != (double)sval;
      } else { 
        short sval= (short)val;
        shortstore(buf, sval);
        *r_param->error= check_trunc_val != (double)sval;
      } 
      r_param->buffer_length= 2;
    }
    break; 
    case MYSQL_TYPE_LONG:
    {
      if (r_param->is_unsigned)
      {
        uint32 lval= (uint32)val;
        longstore(buf, lval);
        *r_param->error= (check_trunc_val != (double)lval);
      } else {
        int32 lval= (int32)val;
        longstore(buf, lval);
        *r_param->error= (check_trunc_val != (double)lval);
      }
      r_param->buffer_length= 4;
    }
    break; 
    case MYSQL_TYPE_LONGLONG:
    {
      if (r_param->is_unsigned)
      {
        ulonglong llval= (ulonglong)val;
        longlongstore(buf, llval);
        *r_param->error= (check_trunc_val != (double)llval);
      } else {
        longlong llval= (longlong)val;
        longlongstore(buf, llval);
        *r_param->error= (check_trunc_val != (double)llval);
      }
      r_param->buffer_length= 8;
    }
    break; 
    case MYSQL_TYPE_DOUBLE:
    {
      double dval= (double)val;
      memcpy(buf, &dval, sizeof(double));
      r_param->buffer_length= 8;
    }
    break;
    default:
    {
 #define MAX_DOUBLE_STRING_REP_LENGTH 300
     char buff[MAX_DOUBLE_STRING_REP_LENGTH];
     size_t length;
     char *end;

     length= MIN(MAX_DOUBLE_STRING_REP_LENGTH - 1, r_param->buffer_length);

/*     if (field->decimals >= NOT_FIXED_DEC)
     {
       sprintf(buff, "%-*.*g", (int) length-1, DBL_DIG, val);
       length= strlen(buff);
     }
     else */
     {
#ifdef _WIN32
       _gcvt(val, 6, buff);
#else
       gcvt(val, 6, buff);
#endif
       length= strlen(buff);
     }

     /* remove trailing blanks */
     end= strchr(buff, '\0') - 1;
     while (end > buff && *end == ' ')
       *end--= '\0';

     /* check if ZEROFILL flag is active */
     if (field->flags & ZEROFILL_FLAG)
     {
       /* enough space available ? */
       if (field->length < length || field->length > MAX_DOUBLE_STRING_REP_LENGTH - 1)
         break;
       ma_bmove_upp(buff + field->length, buff + length, length);
       memset((char*) buff, 0, field->length - length);
     }
     convert_froma_string(r_param, buff, strlen(buff));
    }  
    break;
  } 
}
HRESULT MAPIContact::Init()
{
    HRESULT hr = S_OK;
    Zimbra::Util::ScopedBuffer<SPropValue> pPropValMsgClass;

    if (FAILED(hr = HrGetOneProp(m_pMessage, PR_MESSAGE_CLASS, pPropValMsgClass.getptr())))
        throw MAPIContactException(hr, L"Init(): HrGetOneProp Failed.", 
		ERR_MAPI_CONTACT, __LINE__, __FILE__);
    if ((pPropValMsgClass->ulPropTag == PR_MESSAGE_CLASS_W) && (_tcsicmp(
        pPropValMsgClass->Value.LPSZ, L"ipm.distlist") == 0))
        m_bPersonalDL = true;

    // initialize the MAPINAMEID structure GetIDsFromNames requires
    LPMAPINAMEID ppNames[N_NUM_NAMES] = { 0 };

    for (int i = 0; i < N_NUM_NAMES; i++)
    {
        MAPIAllocateBuffer(sizeof (MAPINAMEID), (LPVOID *)&(ppNames[i]));
        ppNames[i]->ulKind = MNID_ID;
        ppNames[i]->lpguid = (LPGUID)(&PS_CONTACT_PROPERTIES);
        ppNames[i]->Kind.lID = nameIds[i];
    }

    // get the real prop tag ID's
    LPSPropTagArray pContactTags = NULL;

    if (FAILED(hr = m_pMessage->GetIDsFromNames(N_NUM_NAMES, ppNames, MAPI_CREATE,
            &pContactTags)))
        throw MAPIContactException(hr, L"Init(): GetIDsFromNames Failed.", 
		ERR_MAPI_CONTACT, __LINE__, __FILE__);
    // give the prop tag ID's a type
    pr_mail1address = SetPropType(pContactTags->aulPropTag[N_MAIL1], PT_TSTRING);
    pr_mail1entryid = SetPropType(pContactTags->aulPropTag[N_MAIL1EID], PT_BINARY);
    pr_mail1type = SetPropType(pContactTags->aulPropTag[N_MAIL1TYPE], PT_TSTRING);
    pr_mail1dispname = SetPropType(pContactTags->aulPropTag[N_MAIL1DISPNAME], PT_TSTRING);
    pr_mail2address = SetPropType(pContactTags->aulPropTag[N_MAIL2], PT_TSTRING);
    pr_mail2entryid = SetPropType(pContactTags->aulPropTag[N_MAIL2EID], PT_BINARY);
    pr_mail2type = SetPropType(pContactTags->aulPropTag[N_MAIL2TYPE], PT_TSTRING);
    pr_mail2dispname = SetPropType(pContactTags->aulPropTag[N_MAIL2DISPNAME], PT_TSTRING);
    pr_mail3address = SetPropType(pContactTags->aulPropTag[N_MAIL3], PT_TSTRING);
    pr_mail3entryid = SetPropType(pContactTags->aulPropTag[N_MAIL3EID], PT_BINARY);
    pr_mail3type = SetPropType(pContactTags->aulPropTag[N_MAIL3TYPE], PT_TSTRING);
    pr_mail3dispname = SetPropType(pContactTags->aulPropTag[N_MAIL3DISPNAME], PT_TSTRING);
    pr_fileas = SetPropType(pContactTags->aulPropTag[N_FILEAS], PT_TSTRING);
    pr_fileasID = SetPropType(pContactTags->aulPropTag[N_FILEAS_ID], PT_LONG);
    pr_business_address_city = SetPropType(pContactTags->aulPropTag[N_BUS_CITY], PT_TSTRING);
    pr_business_address_country = SetPropType(pContactTags->aulPropTag[N_BUS_COUNTRY],
        PT_TSTRING);
    pr_business_address_postal_code = SetPropType(pContactTags->aulPropTag[N_BUS_ZIP],
        PT_TSTRING);
    pr_business_address_state = SetPropType(pContactTags->aulPropTag[N_BUS_STATE], PT_TSTRING);
    pr_business_address_street = SetPropType(pContactTags->aulPropTag[N_BUS_STREET],
        PT_TSTRING);
    pr_contact_user1_idx = SetPropType(pContactTags->aulPropTag[N_CONTACT_USER1_IDX],
        PT_TSTRING);
    pr_contact_user2_idx = SetPropType(pContactTags->aulPropTag[N_CONTACT_USER2_IDX],
        PT_TSTRING);
    pr_contact_user3_idx = SetPropType(pContactTags->aulPropTag[N_CONTACT_USER3_IDX],
        PT_TSTRING);
    pr_contact_user4_idx = SetPropType(pContactTags->aulPropTag[N_CONTACT_USER4_IDX],
        PT_TSTRING);
    pr_contact_oneoffmemebrs = SetPropType(
        pContactTags->aulPropTag[N_CONTACT_ONEOFFMEMEBRS_IDX], PT_MV_BINARY);
    pr_imaddress = SetPropType(pContactTags->aulPropTag[N_IMADDRESS], PT_TSTRING);

    pr_anniversary = SetPropType(pContactTags->aulPropTag[N_ANNIVERSARY], PT_TSTRING);
    // free the memory we allocated on the head
    for (int i = 0; i < N_NUM_NAMES; i++)
        MAPIFreeBuffer(ppNames[i]);
    MAPIFreeBuffer(pContactTags);

    // these are the contact properties we need to get
    SizedSPropTagArray(C_NUM_PROPS, contactProps) = {
        C_NUM_PROPS, {
            PR_CALLBACK_TELEPHONE_NUMBER, PR_CAR_TELEPHONE_NUMBER, PR_COMPANY_NAME,
            pr_mail1address, pr_mail1entryid, pr_mail1type, pr_mail1dispname,
            pr_mail2address, pr_mail2entryid, pr_mail2type, pr_mail2dispname,
            pr_mail3address, pr_mail3entryid, pr_mail3type, pr_mail3dispname, pr_fileas,
            pr_fileasID, PR_GIVEN_NAME, PR_HOME_ADDRESS_CITY, PR_HOME_ADDRESS_COUNTRY,
            PR_HOME_FAX_NUMBER, PR_HOME_TELEPHONE_NUMBER, PR_HOME2_TELEPHONE_NUMBER,
            PR_HOME_ADDRESS_POSTAL_CODE, PR_HOME_ADDRESS_STATE_OR_PROVINCE,
            PR_HOME_ADDRESS_STREET, PR_TITLE, PR_SURNAME, PR_MIDDLE_NAME,
            PR_CELLULAR_TELEPHONE_NUMBER, PR_DISPLAY_NAME_PREFIX, PR_GENERATION,
            // notes is PR_BODY and PR_BODY_HTML
            PR_OTHER_ADDRESS_CITY, PR_OTHER_ADDRESS_COUNTRY, PR_PRIMARY_FAX_NUMBER,     // other fax
            PR_OTHER_TELEPHONE_NUMBER, PR_OTHER_ADDRESS_POSTAL_CODE,
            PR_OTHER_ADDRESS_STATE_OR_PROVINCE, PR_OTHER_ADDRESS_STREET,
            PR_PAGER_TELEPHONE_NUMBER, pr_business_address_city,
            pr_business_address_country, PR_BUSINESS_FAX_NUMBER, PR_OFFICE_TELEPHONE_NUMBER,
            pr_business_address_postal_code, pr_business_address_state,
            pr_business_address_street, PR_BUSINESS_HOME_PAGE, PR_BIRTHDAY,
            pr_contact_user1_idx, pr_contact_user2_idx, pr_contact_user3_idx,
            pr_contact_user4_idx, pr_contact_oneoffmemebrs, pr_imaddress,
            PR_WEDDING_ANNIVERSARY
        }
    };

    ULONG cVals = 0;

    if (FAILED(hr = m_pMessage->GetProps((LPSPropTagArray) & contactProps, fMapiUnicode, &cVals,
            &m_pPropVals)))
        throw MAPIContactException(hr, L"Init(): GetProps Failed.",
		ERR_MAPI_CONTACT, __LINE__, __FILE__);


    // see if there is a file-as id
    LONG zimbraFileAsId = 0;

    if (m_bPersonalDL)                          // PDL's always have a custom file-as
    {
        zimbraFileAsId = 8;
        Type(L"group");
    }
    else if (m_pPropVals[C_FILEASID].ulPropTag == contactProps.aulPropTag[C_FILEASID])
    {
        switch (m_pPropVals[C_FILEASID].Value.l)
        {
        case OFA_LAST_C_FIRST:
            zimbraFileAsId = 1;
            break;
        case OFA_FIRST_LAST:
            zimbraFileAsId = 2;
            break;
        case OFA_COMPANY:
            zimbraFileAsId = 3;
            break;
        case OFA_LAST_C_FIRST_COMPANY:
            zimbraFileAsId = 4;
            break;
        case OFA_COMPANY_LAST_C_FIRST:
            zimbraFileAsId = 6;
            break;
        case OFA_CUSTOM:
            zimbraFileAsId = 8;
            break;
        }
    }
    // process all "String" properties
    if (m_pPropVals[C_CALLBACK_TELEPHONE_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_CALLBACK_TELEPHONE_NUMBER])
        CallbackPhone(m_pPropVals[C_CALLBACK_TELEPHONE_NUMBER].Value.lpszW);
    if (m_pPropVals[C_CAR_TELEPHONE_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_CAR_TELEPHONE_NUMBER])
        CarPhone(m_pPropVals[C_CAR_TELEPHONE_NUMBER].Value.lpszW);
    if (m_pPropVals[C_COMPANY_NAME].ulPropTag == contactProps.aulPropTag[C_COMPANY_NAME])
        Company(m_pPropVals[C_COMPANY_NAME].Value.lpszW);
    if (m_pPropVals[C_FILEAS].ulPropTag == contactProps.aulPropTag[C_FILEAS])
    {
        if (zimbraFileAsId == 8)
        {
            LPWSTR pwszFileAsValue = m_pPropVals[C_FILEAS].Value.lpszW;

            if ((pwszFileAsValue != NULL) && (wcsicmp(pwszFileAsValue, L"") != 0))
            {
                LPWSTR pwszTemp = new WCHAR[wcslen(m_pPropVals[C_FILEAS].Value.lpszW) + 3];

                // there is a legit string for the custom fileas value
                wsprintf(pwszTemp, L"8:%s", pwszFileAsValue);
                FileAs(pwszTemp);
                // PDL's require a nickname
                if (m_bPersonalDL)
                    NickName(m_pPropVals[C_FILEAS].Value.lpszW);
                delete[] pwszTemp;
            }
            else
            {
                LPWSTR pwszNONAME = new WCHAR[wcslen(L"NO_NAME") + 1];

                wsprintf(pwszNONAME, L"%s", L"NO_NAME");

                LPWSTR pwszTemp = new WCHAR[wcslen(pwszNONAME) + 3];

                // there is a legit string for the custom fileas value
                wsprintf(pwszTemp, L"8:%s", pwszNONAME);
                FileAs(pwszTemp);
                // PDL's require a nickname
                if (m_bPersonalDL)
                    NickName(pwszNONAME);
                delete[] pwszTemp;
                delete[] pwszNONAME;
            }
        }
        else if (zimbraFileAsId)
        {
            WCHAR pwszTemp[3];

            _ltow(zimbraFileAsId, pwszTemp, 10);
            FileAs(pwszTemp);
        }
    }
    if (m_pPropVals[C_GIVEN_NAME].ulPropTag == contactProps.aulPropTag[C_GIVEN_NAME])
        FirstName(m_pPropVals[C_GIVEN_NAME].Value.lpszW);
    if (m_pPropVals[C_HOME_ADDRESS_CITY].ulPropTag ==
        contactProps.aulPropTag[C_HOME_ADDRESS_CITY])
        HomeCity(m_pPropVals[C_HOME_ADDRESS_CITY].Value.lpszW);
    if (m_pPropVals[C_HOME_ADDRESS_COUNTRY].ulPropTag ==
        contactProps.aulPropTag[C_HOME_ADDRESS_COUNTRY])
        HomeCountry(m_pPropVals[C_HOME_ADDRESS_COUNTRY].Value.lpszW);
    if (m_pPropVals[C_HOME_FAX_NUMBER].ulPropTag == contactProps.aulPropTag[C_HOME_FAX_NUMBER])
        HomeFax(m_pPropVals[C_HOME_FAX_NUMBER].Value.lpszW);
    if (m_pPropVals[C_HOME_TELEPHONE_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_HOME_TELEPHONE_NUMBER])
        HomePhone(m_pPropVals[C_HOME_TELEPHONE_NUMBER].Value.lpszW);
    if (m_pPropVals[C_HOME2_TELEPHONE_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_HOME2_TELEPHONE_NUMBER])
        HomePhone2(m_pPropVals[C_HOME2_TELEPHONE_NUMBER].Value.lpszW);
    if (m_pPropVals[C_HOME_ADDRESS_POSTAL_CODE].ulPropTag ==
        contactProps.aulPropTag[C_HOME_ADDRESS_POSTAL_CODE])
        HomePostalCode(m_pPropVals[C_HOME_ADDRESS_POSTAL_CODE].Value.lpszW);
    if (m_pPropVals[C_HOME_ADDRESS_STATE_OR_PROVINCE].ulPropTag ==
        contactProps.aulPropTag[C_HOME_ADDRESS_STATE_OR_PROVINCE])
        HomeState(m_pPropVals[C_HOME_ADDRESS_STATE_OR_PROVINCE].Value.lpszW);
    if (m_pPropVals[C_HOME_ADDRESS_STREET].ulPropTag ==
        contactProps.aulPropTag[C_HOME_ADDRESS_STREET])
        HomeStreet(m_pPropVals[C_HOME_ADDRESS_STREET].Value.lpszW);
    if (m_pPropVals[C_TITLE].ulPropTag == contactProps.aulPropTag[C_TITLE])
        JobTitle(m_pPropVals[C_TITLE].Value.lpszW);
    if (m_pPropVals[C_SURNAME].ulPropTag == contactProps.aulPropTag[C_SURNAME])
        LastName(m_pPropVals[C_SURNAME].Value.lpszW);
    if (m_pPropVals[C_MIDDLE_NAME].ulPropTag == contactProps.aulPropTag[C_MIDDLE_NAME])
        MiddleName(m_pPropVals[C_MIDDLE_NAME].Value.lpszW);
    if (m_pPropVals[C_CELLULAR_TELEPHONE_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_CELLULAR_TELEPHONE_NUMBER])
        MobilePhone(m_pPropVals[C_CELLULAR_TELEPHONE_NUMBER].Value.lpszW);
    if (m_pPropVals[C_DISPLAY_NAME_PREFIX].ulPropTag ==
        contactProps.aulPropTag[C_DISPLAY_NAME_PREFIX])
        NamePrefix(m_pPropVals[C_DISPLAY_NAME_PREFIX].Value.lpszW);
    if (m_pPropVals[C_GENERATION].ulPropTag == contactProps.aulPropTag[C_GENERATION])
        NameSuffix(m_pPropVals[C_GENERATION].Value.lpszW);
    if (m_pPropVals[C_OTHER_ADDRESS_CITY].ulPropTag ==
        contactProps.aulPropTag[C_OTHER_ADDRESS_CITY])
        OtherCity(m_pPropVals[C_OTHER_ADDRESS_CITY].Value.lpszW);
    if (m_pPropVals[C_OTHER_ADDRESS_COUNTRY].ulPropTag ==
        contactProps.aulPropTag[C_OTHER_ADDRESS_COUNTRY])
        OtherCountry(m_pPropVals[C_OTHER_ADDRESS_COUNTRY].Value.lpszW);
    if (m_pPropVals[C_PRIMARY_FAX_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_PRIMARY_FAX_NUMBER])
        OtherFax(m_pPropVals[C_PRIMARY_FAX_NUMBER].Value.lpszW);
    if (m_pPropVals[C_OTHER_TELEPHONE_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_OTHER_TELEPHONE_NUMBER])
        OtherPhone(m_pPropVals[C_OTHER_TELEPHONE_NUMBER].Value.lpszW);
    if (m_pPropVals[C_OTHER_ADDRESS_POSTAL_CODE].ulPropTag ==
        contactProps.aulPropTag[C_OTHER_ADDRESS_POSTAL_CODE])
        OtherPostalCode(m_pPropVals[C_OTHER_ADDRESS_POSTAL_CODE].Value.lpszW);
    if (m_pPropVals[C_OTHER_ADDRESS_STATE_OR_PROVINCE].ulPropTag ==
        contactProps.aulPropTag[C_OTHER_ADDRESS_STATE_OR_PROVINCE])
        OtherState(m_pPropVals[C_OTHER_ADDRESS_STATE_OR_PROVINCE].Value.lpszW);
    if (m_pPropVals[C_OTHER_ADDRESS_STREET].ulPropTag ==
        contactProps.aulPropTag[C_OTHER_ADDRESS_STREET])
        OtherStreet(m_pPropVals[C_OTHER_ADDRESS_STREET].Value.lpszW);
    if (m_pPropVals[C_PAGER_TELEPHONE_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_PAGER_TELEPHONE_NUMBER])
        Pager(m_pPropVals[C_PAGER_TELEPHONE_NUMBER].Value.lpszW);
    if (m_pPropVals[C_BUSINESS_ADDRESS_CITY].ulPropTag ==
        contactProps.aulPropTag[C_BUSINESS_ADDRESS_CITY])
        WorkCity(m_pPropVals[C_BUSINESS_ADDRESS_CITY].Value.lpszW);
    if (m_pPropVals[C_BUSINESS_ADDRESS_COUNTRY].ulPropTag ==
        contactProps.aulPropTag[C_BUSINESS_ADDRESS_COUNTRY])
        WorkCountry(m_pPropVals[C_BUSINESS_ADDRESS_COUNTRY].Value.lpszW);
    if (m_pPropVals[C_BUSINESS_FAX_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_BUSINESS_FAX_NUMBER])
        WorkFax(m_pPropVals[C_BUSINESS_FAX_NUMBER].Value.lpszW);
    if (m_pPropVals[C_OFFICE_TELEPHONE_NUMBER].ulPropTag ==
        contactProps.aulPropTag[C_OFFICE_TELEPHONE_NUMBER])
        WorkPhone(m_pPropVals[C_OFFICE_TELEPHONE_NUMBER].Value.lpszW);
    if (m_pPropVals[C_BUSINESS_ADDRESS_POSTAL_CODE].ulPropTag ==
        contactProps.aulPropTag[C_BUSINESS_ADDRESS_POSTAL_CODE])
        WorkPostalCode(m_pPropVals[C_BUSINESS_ADDRESS_POSTAL_CODE].Value.lpszW);
    if (m_pPropVals[C_BUSINESS_ADDRESS_STATE].ulPropTag ==
        contactProps.aulPropTag[C_BUSINESS_ADDRESS_STATE])
        WorkState(m_pPropVals[C_BUSINESS_ADDRESS_STATE].Value.lpszW);
    if (m_pPropVals[C_BUSINESS_ADDRESS_STREET].ulPropTag ==
        contactProps.aulPropTag[C_BUSINESS_ADDRESS_STREET])
        WorkStreet(m_pPropVals[C_BUSINESS_ADDRESS_STREET].Value.lpszW);
    if (m_pPropVals[C_BUSINESS_HOME_PAGE].ulPropTag ==
        contactProps.aulPropTag[C_BUSINESS_HOME_PAGE])
        WorkURL(m_pPropVals[C_BUSINESS_HOME_PAGE].Value.lpszW);
    if (m_pPropVals[C_CONTACT_USER1_IDX].ulPropTag ==
        contactProps.aulPropTag[C_CONTACT_USER1_IDX])
        UserField1(m_pPropVals[C_CONTACT_USER1_IDX].Value.lpszW);
    if (m_pPropVals[C_CONTACT_USER2_IDX].ulPropTag ==
        contactProps.aulPropTag[C_CONTACT_USER2_IDX])
        UserField2(m_pPropVals[C_CONTACT_USER2_IDX].Value.lpszW);
    if (m_pPropVals[C_CONTACT_USER3_IDX].ulPropTag ==
        contactProps.aulPropTag[C_CONTACT_USER3_IDX])
        UserField3(m_pPropVals[C_CONTACT_USER3_IDX].Value.lpszW);
    if (m_pPropVals[C_CONTACT_USER4_IDX].ulPropTag ==
        contactProps.aulPropTag[C_CONTACT_USER4_IDX])
        UserField4(m_pPropVals[C_CONTACT_USER4_IDX].Value.lpszW);
    if (m_pPropVals[C_BIRTHDAY].ulPropTag == contactProps.aulPropTag[C_BIRTHDAY])
    {
        SYSTEMTIME st = { 0 };

        FileTimeToSystemTime(&(m_pPropVals[C_BIRTHDAY].Value.ft), &st);

        // We get PR_BIRTHDAY in UTC so let's convert it into local time
        TIME_ZONE_INFORMATION tzInfo = { 0 };

        GetTimeZoneInformation(&tzInfo);
        SystemTimeToTzSpecificLocalTime(&tzInfo, &st, &st);

        TCHAR pszBDay[11];

        swprintf(pszBDay, 11, _T("%4d-%02d-%02d"), st.wYear, st.wMonth, st.wDay);

        Birthday(pszBDay);
    }
    if (m_pPropVals[C_ANNIVERSARY].ulPropTag == contactProps.aulPropTag[C_ANNIVERSARY])
    {
        SYSTEMTIME st = { 0 };

        FileTimeToSystemTime(&(m_pPropVals[C_ANNIVERSARY].Value.ft), &st);

        // We get PR_ANNIVERSARY in UTC so let's convert it into local time
        TIME_ZONE_INFORMATION tzInfo = { 0 };

        GetTimeZoneInformation(&tzInfo);
        SystemTimeToTzSpecificLocalTime(&tzInfo, &st, &st);

        TCHAR pszAnniv[11];

        swprintf(pszAnniv, 11, _T("%4d-%02d-%02d"), st.wYear, st.wMonth, st.wDay);

        Anniversary(pszAnniv);
    }

    // email 1
    RECIP_INFO tempRecip;

    if ((m_pPropVals[C_MAIL1TYPE].ulPropTag == contactProps.aulPropTag[C_MAIL1TYPE]) &&
        (m_pPropVals[C_MAIL1ADDRESS].ulPropTag == contactProps.aulPropTag[C_MAIL1ADDRESS]))
    {
        if (wcscmp(m_pPropVals[C_MAIL1TYPE].Value.lpszW, L"SMTP") == 0)
        {
            Email(m_pPropVals[C_MAIL1ADDRESS].Value.lpszW);
        }
        else if (wcscmp(m_pPropVals[C_MAIL1TYPE].Value.lpszW, L"EX") == 0)
        {
            tempRecip.pAddrType = m_pPropVals[C_MAIL1TYPE].Value.lpszW;
            tempRecip.pEmailAddr = m_pPropVals[C_MAIL1ADDRESS].Value.lpszW;
            tempRecip.cbEid = m_pPropVals[C_MAIL1EID].Value.bin.cb;
            tempRecip.pEid = (LPENTRYID)(m_pPropVals[C_MAIL1EID].Value.bin.lpb);

            wstring strSenderEmail(_TEXT(""));
            HRESULT hr = Zimbra::MAPI::Util::HrMAPIGetSMTPAddress(*m_session, tempRecip,
                strSenderEmail);

            if (hr != S_OK)
                Email(m_pPropVals[C_MAIL1DISPNAME].Value.lpszW);

            else
                Email((LPTSTR)strSenderEmail.c_str());
        }
    }
    // email 2
    if ((m_pPropVals[C_MAIL2TYPE].ulPropTag == contactProps.aulPropTag[C_MAIL2TYPE]) &&
        (m_pPropVals[C_MAIL2ADDRESS].ulPropTag == contactProps.aulPropTag[C_MAIL2ADDRESS]))
    {
        if (wcscmp(m_pPropVals[C_MAIL2TYPE].Value.lpszW, L"SMTP") == 0)
        {
            Email2(m_pPropVals[C_MAIL2ADDRESS].Value.lpszW);
        }
        else if (wcscmp(m_pPropVals[C_MAIL2TYPE].Value.lpszW, L"EX") == 0)
        {
            tempRecip.pAddrType = m_pPropVals[C_MAIL2TYPE].Value.lpszW;
            tempRecip.pEmailAddr = m_pPropVals[C_MAIL2ADDRESS].Value.lpszW;
            tempRecip.cbEid = m_pPropVals[C_MAIL2EID].Value.bin.cb;
            tempRecip.pEid = (LPENTRYID)(m_pPropVals[C_MAIL2EID].Value.bin.lpb);

            wstring strSenderEmail(_TEXT(""));
            HRESULT hr = Zimbra::MAPI::Util::HrMAPIGetSMTPAddress(*m_session, tempRecip,
                strSenderEmail);

            if (hr != S_OK)
                Email(m_pPropVals[C_MAIL2DISPNAME].Value.lpszW);

            else
                Email2((LPTSTR)strSenderEmail.c_str());
        }
    }
    // email 3
    if ((m_pPropVals[C_MAIL3TYPE].ulPropTag == contactProps.aulPropTag[C_MAIL3TYPE]) &&
        (m_pPropVals[C_MAIL3ADDRESS].ulPropTag == contactProps.aulPropTag[C_MAIL3ADDRESS]))
    {
        if (wcscmp(m_pPropVals[C_MAIL3TYPE].Value.lpszW, L"SMTP") == 0)
        {
            Email3(m_pPropVals[C_MAIL3ADDRESS].Value.lpszW);
        }
        else if (wcscmp(m_pPropVals[C_MAIL3TYPE].Value.lpszW, L"EX") == 0)
        {
            tempRecip.pAddrType = m_pPropVals[C_MAIL3TYPE].Value.lpszW;
            tempRecip.pEmailAddr = m_pPropVals[C_MAIL3ADDRESS].Value.lpszW;
            tempRecip.cbEid = m_pPropVals[C_MAIL3EID].Value.bin.cb;
            tempRecip.pEid = (LPENTRYID)(m_pPropVals[C_MAIL3EID].Value.bin.lpb);

            wstring strSenderEmail(_TEXT(""));
            HRESULT hr = Zimbra::MAPI::Util::HrMAPIGetSMTPAddress(*m_session, tempRecip,
                strSenderEmail);

            if (hr != S_OK)
                Email(m_pPropVals[C_MAIL3DISPNAME].Value.lpszW);

            else
                Email3((LPTSTR)strSenderEmail.c_str());
        }
    }
    if (m_pPropVals[C_IMADDRESS].ulPropTag == contactProps.aulPropTag[C_IMADDRESS])
        IMAddress1(m_pPropVals[C_IMADDRESS].Value.lpszW);
    // add the 'notes' section
    if (m_mapiMessage->HasTextPart())
    {
        LPTSTR pBody = NULL;
        UINT nText = 0;

        m_mapiMessage->TextBody(&pBody, nText);

        LPTSTR psz = pBody;

        if (psz)
        {
            const char SPACE = ' ', TAB = '\t', CR = 0x0d, LF = 0x0a;

            while (*psz)
            {
                // Replace control characters with space
                // Exclude carriage return and new line characters while doing the same
                if ((*psz < SPACE) && (*psz != CR) && (*psz != LF))
                    *psz = _T(' ');
                psz++;
            }

            // We'll add the body only if it has data other than white spaces and new lines
            bool bHasValidChars = false;

            psz = pBody;
            while (*psz)
            {
                if ((*psz == SPACE) || (*psz == TAB) || (*psz == CR) || (*psz == LF))
                {
                    psz++;
                    continue;
                }
                else
                {
                    bHasValidChars = true;
                    break;
                }
            }
            if (bHasValidChars)
                Notes(pBody);
            MAPIFreeBuffer(pBody);
        }
    }

	// if its a distribution list, add the dist list members to the property
	wstring strInvalidGroupContacts;
    if (m_bPersonalDL)
    {
        std::wstring dlist = L"";

        if (m_pPropVals[C_ONEOFFMEMEBRS_IDX].ulPropTag ==
            contactProps.aulPropTag[C_ONEOFFMEMEBRS_IDX])
        {
            bool bFirst = true;

            for (ULONG i = 0; i < m_pPropVals[C_ONEOFFMEMEBRS_IDX].Value.MVbin.cValues; i++)
            {
                DWORD dwObjType;
                SBinary &bin = m_pPropVals[C_ONEOFFMEMEBRS_IDX].Value.MVbin.lpbin[i];
                IMailUser *pUser = NULL;

                hr = m_session->OpenEntry(bin.cb, (LPENTRYID)bin.lpb, NULL, 0, &dwObjType,
                    (LPUNKNOWN *)&pUser);
                if (FAILED(hr) || !pUser)
                    continue;

                LPSPropValue pDNProp = NULL;
                LPSPropValue pAddrProp = NULL;
                std::wstring user = L"";
                BOOL bIsInvalidContact = TRUE;

                HrGetOneProp(pUser, PR_DISPLAY_NAME_W, &pDNProp);
                HrGetOneProp(pUser, PR_EMAIL_ADDRESS_W, &pAddrProp);
                if (pDNProp && (pDNProp->ulPropTag == PR_DISPLAY_NAME_W) && wcslen(
                    pDNProp->Value.lpszW))
                    user += pDNProp->Value.lpszW;
                if (pAddrProp && (pAddrProp->ulPropTag == PR_EMAIL_ADDRESS_W) && wcslen(
                    pAddrProp->Value.lpszW))
                {
                    std::wstring temp = pAddrProp->Value.lpszW;

                    if (temp.find(L'@') != std::wstring::npos)
                        bIsInvalidContact = FALSE;
                    if (!user.empty())
                        user += L" ";
                    user += L"<";
                    user += temp;
                    user += L">";
                }
                if (bIsInvalidContact)
                {
                    if (!user.empty())
                    {
						if (!strInvalidGroupContacts.empty())
                            strInvalidGroupContacts += _T(", ");
                        strInvalidGroupContacts += user.c_str();
                    }
                }
                else
                {
                    if (bFirst)
                        bFirst = false;
                    else
                        dlist += L",";
                    dlist += user;
                }
                pUser->Release();
                MAPIFreeBuffer(pDNProp);
                MAPIFreeBuffer(pAddrProp);
            }
        }
		//set DL values
		DList((LPTSTR)dlist.c_str());
	}

	//user define props
	if (!m_bPersonalDL)
	{
		LPMAPINAMEID FAR *lppPropNames = NULL;
		LPSPropTagArray tagArray;
		ULONG lCount = 0;

		hr = m_pMessage->GetPropList(MAPI_UNICODE, &tagArray);
		if (hr == S_OK)
		{
			hr = m_pMessage->GetNamesFromIDs(&tagArray, (LPGUID)&PS_PUBLIC_STRINGS, 0, &lCount,
				&lppPropNames);
			if (SUCCEEDED(hr))
			{
				WCHAR wszProps2GUID[40] = { 0 };
				Zimbra::Util::Guid nameProps2Guid(OUTLOOK_NAME_PROPS_GUID_2);

				nameProps2Guid.toString(wszProps2GUID);

				WCHAR wszContactPropGUID[40] = { 0 };
				WCHAR wszVal[1024]={0};                 

				for (ULONG i = 0; i < lCount; i++)
				{
					Zimbra::Util::ScopedBuffer<SPropValue> pPropVal;

					hr = HrGetOneProp(m_pMessage, tagArray->aulPropTag[i], pPropVal.getptr());
                                        if (lppPropNames[i] != NULL)    // FBS bug 71786 -- 3/20/12
                                        {
					    if (lppPropNames[i]->ulKind == MNID_STRING)
					    {
						    Zimbra::Util::Guid propGuid(*lppPropNames[i]->lpguid);

						    propGuid.toString(wszContactPropGUID);
						    if (lstrcmpiW(wszContactPropGUID, wszProps2GUID) == 0)
						    {
							    LPWSTR szPropName = lppPropNames[i]->Kind.lpwstrName;

							    // now format a string depending on the type
							    ULONG ulPropType = PROP_TYPE(pPropVal->ulPropTag);
							    BOOL bSetAttribute = TRUE;

							    switch (ulPropType)
							    {
							    case PT_UNICODE:
								    wcscpy(wszVal, pPropVal->Value.lpszW);
								    break;

							    case PT_SYSTIME:
							    {
								    SYSTEMTIME sysTime = { 0 };

								    if (FileTimeToSystemTime(&(pPropVal->Value.ft), &sysTime))
								    {
									    TIME_ZONE_INFORMATION tzInfo = { 0 };

									    GetTimeZoneInformation(&tzInfo);
									    SystemTimeToTzSpecificLocalTime(&tzInfo, &sysTime, &sysTime);
									    wsprintf(wszVal, L"%4d-%02d-%02d", sysTime.wYear,
										    sysTime.wMonth, sysTime.wDay);
								    }
								    break;
							    }

							    case PT_LONG:
								    wsprintf(wszVal, L"%d", pPropVal->Value.l);
								    break;

							    case PT_DOUBLE:
							    {
								    CHAR tmp[36];

								    _gcvt(pPropVal->Value.dbl, 6, tmp);

								    LPWSTR wszTmp = Zimbra::Util::AnsiiToUnicode(tmp);

								    wcscpy(wszVal, wszTmp);
								    break;
							    }

							    case PT_BOOLEAN:
								    if (pPropVal->Value.b)
									    wcscpy(wszVal, L"TRUE");
								    else
									    wcscpy(wszVal, L"FALSE");
								    break;

							    case PT_CURRENCY:
							    {
								    LONGLONG lCurrency;
								    CURRENCY currency;

								    currency = pPropVal->Value.cur;
								    lCurrency = currency.int64;
								    lCurrency = lCurrency / 10000;
								    wsprintf(wszVal, L"$%I64d", lCurrency);
								    break;
							    }

							    default:                // can't deal with these other types 
								    bSetAttribute = FALSE;
								    //LOG("%hs: MAPI type %0x not supported: user defined field %s will not be synced"),
								    //		__FUNCTION__, ulPropType, szPropName);
							    }

							    ContactUDFields cudf;
							    cudf.Name = szPropName;
							    cudf.value = wszVal;
							    AddUserDefinedField(cudf);
						    }
					    }
                                        }
				}
				MAPIFreeBuffer(lppPropNames);
			}
			MAPIFreeBuffer(tagArray);
		}
	}

    // Save image path
    wstring wstrImagePath;

    if (m_mapiMessage->HasAttach())
    {
        if (!FAILED(hr = GetContactImage(wstrImagePath)))
            ContactImagePath((LPTSTR)wstrImagePath.c_str());
    }
    return S_OK;
}