// MBOrgListMgr.cpp : implementation file // #include "stdafx.h" #include "mborg.h" #include "MBOrgListMgr.h" #include "MBOrgFunc.h" #include "MBCmdPropName.h" ///////////////////////////////////////////////////////////////////////////// // CMBOrgListMgr CMBOrgListMgr::CMBOrgListMgr() { m_mapView.RemoveAll(); m_mapGroup.RemoveAll(); m_mapRole.RemoveAll(); m_mapUser.RemoveAll(); m_mapUserAliasName.RemoveAll(); m_mapUserPhoto.RemoveAll(); m_mapDefaultUserPhoto.RemoveAll(); InitDeaultUserPhoto( ); } CMBOrgListMgr::~CMBOrgListMgr() { DetachAllMap(); } ///////////////////////////////////////////////////////////////////////////// // CMBOrgListMgr message handlers void CMBOrgListMgr::DetachAllMap() { DetachMap( _T("m_mapView") ); DetachMap( _T("m_mapGroup") ); DetachMap( _T("m_mapRole") ); DetachMap( _T("m_mapUser") ); DetachMap( _T("m_mapUserPhoto") ); DetachMap( _T("m_mapDefaultUserPhoto") ); m_mapUserAliasName.RemoveAll(); m_mapUserReamrksName.RemoveAll(); } void CMBOrgListMgr::DetachMap( CString strMapName ) { POSITION pos; CString strKey; if ( strMapName == _T( "m_mapView" ) ) { CMBOrgView *pView = NULL; for ( pos = m_mapView.GetStartPosition(); pos; ) { m_mapView.GetNextAssoc( pos,strKey,pView ); if ( pView ) delete pView; pView = NULL; } m_mapView.RemoveAll(); return; } if ( strMapName == _T( "m_mapGroup" ) ) { CMBOrgGroup *pGroup = NULL; for ( pos = m_mapGroup.GetStartPosition(); pos; ) { m_mapGroup.GetNextAssoc( pos,strKey,pGroup ); if ( pGroup ) delete pGroup; pGroup = NULL; } m_mapGroup.RemoveAll(); return; } if ( strMapName == _T( "m_mapRole" ) ) { CMBOrgRole *pRole = NULL; for ( pos = m_mapRole.GetStartPosition(); pos; ) { m_mapRole.GetNextAssoc( pos,strKey,pRole ); if ( pRole ) delete pRole; pRole = NULL; } m_mapRole.RemoveAll(); return; } if ( strMapName == _T( "m_mapUser" ) ) { CMBOrgUser *pUser = NULL; for ( pos = m_mapUser.GetStartPosition(); pos; ) { m_mapUser.GetNextAssoc( pos,strKey,pUser ); if ( pUser ) delete pUser; pUser = NULL; } m_mapUser.RemoveAll(); m_mapUserAliasName.RemoveAll(); m_mapUserReamrksName.RemoveAll(); return; } if ( strMapName == _T( "m_mapUserPhoto" ) ) { IBitmap *pBitmap = NULL; for ( pos = m_mapUserPhoto.GetStartPosition(); pos; ) { m_mapUserPhoto.GetNextAssoc( pos,strKey,pBitmap ); if ( pBitmap ) pBitmap->Release(); } m_mapUserPhoto.RemoveAll(); return; } if ( strMapName == _T( "m_mapDefaultUserPhoto" ) ) { IBitmap *pBitmap = NULL; for ( pos = m_mapDefaultUserPhoto.GetStartPosition(); pos; ) { m_mapDefaultUserPhoto.GetNextAssoc( pos,strKey,pBitmap ); if ( pBitmap ) pBitmap->Release(); } m_mapDefaultUserPhoto.RemoveAll(); return; } } void CMBOrgListMgr::InitDeaultUserPhoto( ) { IBitmap * pBmp = LOADIMAGE(_T("PNG"),_T("png_crowd_m")); m_mapDefaultUserPhoto.SetAt(_T("crowd"),pBmp); pBmp = LOADIMAGE(_T("PNG"),_T("png_user_m")); m_mapDefaultUserPhoto.SetAt(_T("0"),pBmp); pBmp = LOADIMAGE(_T("PNG"),_T("png_user_manm")); m_mapDefaultUserPhoto.SetAt(_T("1"),pBmp); pBmp = LOADIMAGE(_T("PNG"),_T("png_user_womanm")); m_mapDefaultUserPhoto.SetAt(_T("2"),pBmp); } BOOL CMBOrgListMgr::LookupView( CString strViewID,CMBOrgView*& pView ) { pView = NULL; if ( strViewID.IsEmpty() ) return FALSE; if ( m_mapView.Lookup(strViewID,pView )) { return TRUE; } return FALSE; } BOOL CMBOrgListMgr::LookupGroup( CString strGroupID,CMBOrgGroup*& pGroup ) { pGroup = NULL; if ( strGroupID.IsEmpty() ) return FALSE; if ( m_mapGroup.Lookup(strGroupID,pGroup )) { return TRUE; } return FALSE; } BOOL CMBOrgListMgr::LookupRole( CString strRoleID ,CMBOrgRole*& pRole ) { pRole = NULL; if ( strRoleID.IsEmpty() ) return FALSE; if ( m_mapRole.Lookup(strRoleID,pRole )) { return TRUE; } return FALSE; } BOOL CMBOrgListMgr::LookupUser( CString strLoginName,CMBOrgUser*& pUser ) { pUser = NULL; if ( strLoginName.IsEmpty() ) return FALSE; if ( m_mapUser.Lookup(strLoginName,pUser )) { return TRUE; } return FALSE; } BOOL CMBOrgListMgr::LookupUserFromAliasName( CString strAliasName,CString &strLoginName ) { strLoginName = _T(""); if ( strAliasName.IsEmpty() ) return NULL; if ( m_mapUserAliasName.Lookup(strAliasName,strLoginName )) { return TRUE; } return FALSE; } BOOL CMBOrgListMgr::LookupUserPhoto( CString strUserLogin,IBitmap *&pBitmap ) { pBitmap = NULL; if ( strUserLogin.IsEmpty() ) return FALSE; strUserLogin.MakeLower(); if ( m_mapUserPhoto.Lookup(strUserLogin,pBitmap )) { return TRUE; } return FALSE; } BOOL CMBOrgListMgr::LookupDeaultUserPhoto(IBitmap *&pBitmap, CString strUserSex ) { pBitmap = NULL; if(strUserSex.IsEmpty()) strUserSex = _T("0"); strUserSex.MakeLower(); if ( m_mapDefaultUserPhoto.Lookup(strUserSex,pBitmap )) { return TRUE; } return FALSE; } BOOL CMBOrgListMgr::GetUserPhotoBitmap( IBitmap *&pBitmap ,CString strUserLogin,CString strUserSex) { pBitmap = NULL; if ( strUserLogin.IsEmpty() ) return FALSE; strUserLogin.MakeLower(); if ( m_mapUserPhoto.Lookup(strUserLogin,pBitmap )) { return TRUE; } if ( LookupDeaultUserPhoto(pBitmap,strUserSex )) { return TRUE; } return FALSE; } void CMBOrgListMgr::AddUserPhoto( CString strLoginName, IBitmap*pBmp) { if ( strLoginName.IsEmpty() || !pBmp) return ; strLoginName.MakeLower(); IBitmap *pBitmap = NULL; if ( m_mapUserPhoto.Lookup(strLoginName,pBitmap )) { if(pBitmap) pBitmap->Release(); m_mapUserPhoto.RemoveKey(strLoginName); } m_mapUserPhoto.SetAt(strLoginName,pBmp ); } void CMBOrgListMgr::AddDeaultUserPhoto( IBitmap*pBmp,CString strUserSex ) { if ( strUserSex.IsEmpty() || !pBmp) return ; strUserSex.MakeLower(); IBitmap *pBitmap = NULL; if ( m_mapDefaultUserPhoto.Lookup(strUserSex,pBitmap )) { if(pBitmap) pBitmap->Release(); m_mapDefaultUserPhoto.RemoveKey(strUserSex); } m_mapDefaultUserPhoto.SetAt(strUserSex,pBmp ); } CString CMBOrgListMgr::GetUserName( CString strLoginName ) { CMBOrgUser *pUser = NULL; if ( !LookupUser( strLoginName,pUser ) ) return _T( "" ); if ( !pUser ) return _T( "" ); return pUser->m_strUserName; } CString CMBOrgListMgr::GetMemberName( int nMemberType, CString strMemberID) { CString strName = _T(""); if ( strMemberID.IsEmpty() ) return strName; switch ( nMemberType ) { case AM_VIEWITEMTYPE_USER: // User { CMBOrgUser *pUser = NULL; if ( LookupUser( strMemberID, pUser) ) { if( pUser) strName= pUser->m_strUserName; } } break; case AM_VIEWITEMTYPE_VIEW: // Custom Group { CMBOrgView *pView = NULL; if ( LookupView( strMemberID,pView ) ) { if( pView) strName= pView->m_strName; } } break; case AM_VIEWITEMTYPE_GROUP: // System Group case AM_VIEWITEMTYPE_CUSTGROUP: // Custom Group { CMBOrgGroup *pGroup = NULL; if ( LookupGroup( strMemberID,pGroup ) ) { if( pGroup) strName= pGroup->m_strName; } } break; case AM_VIEWITEMTYPE_ROLE: // Role { CMBOrgRole *pRole = NULL; if ( LookupRole( strMemberID,pRole ) ) { if( pRole) strName= pRole->m_strName; } } break; default: break; } return strName; } void CMBOrgListMgr::AddView( CString strViewID, long nLevel, CString strViewName, CString strGener ) { CMBOrgView *pView = NULL; if ( strViewID.IsEmpty() || strViewName.IsEmpty() ) return ; if ( !LookupView( strViewID,pView ) ) { pView = new CMBOrgView; pView->m_strID = strViewID; pView->m_nLevel = nLevel; pView->m_strGener = strGener; m_mapView.SetAt(strViewID, pView ); } pView->m_strName = strViewName; } void CMBOrgListMgr::AddMember( int nMemberType, CString strMemberID, CString strName, int nLevel /*= 0*/ ) { if ( strMemberID.IsEmpty() ) return ; switch ( nMemberType ) { case AM_VIEWITEMTYPE_USER: // User { CMBOrgUser *pUser = NULL; if ( LookupUser( strMemberID,pUser ) ) { if( !pUser) m_mapUser.RemoveKey(strMemberID); } if( !pUser) { pUser = new CMBOrgUser; m_mapUser.SetAt(strMemberID, pUser ); pUser->m_strLoginName = strMemberID; if( !strName.IsEmpty() ) pUser->m_strUserName = strName; else pUser->m_strUserName = pUser->m_strLoginName; pUser->m_nLevel = nLevel; } else { if( !strName.IsEmpty() ) pUser->m_strUserName = strName; if(nLevel >= 0) pUser->m_nLevel = nLevel; } } break; case AM_VIEWITEMTYPE_VIEW: // View { CMBOrgView *pView = NULL; if ( LookupView( strMemberID,pView ) ) { if( !pView) m_mapView.RemoveKey(strMemberID); } if( !pView) { pView = new CMBOrgView; m_mapView.SetAt(strMemberID, pView ); pView->m_strID = strMemberID; if( !strName.IsEmpty() ) pView->m_strName = strName; else pView->m_strName = strMemberID; pView->m_nLevel = nLevel; } else { if( !strName.IsEmpty() ) pView->m_strName = strName; } } break; case AM_VIEWITEMTYPE_GROUP: // System Group case AM_VIEWITEMTYPE_CUSTGROUP: // Custom Group { CMBOrgGroup *pGroup = NULL; if ( LookupGroup( strMemberID,pGroup ) ) { if( !pGroup) m_mapGroup.RemoveKey(strMemberID); } if( !pGroup) { pGroup = new CMBOrgGroup; pGroup->m_strID = strMemberID; if ( nMemberType == AM_VIEWITEMTYPE_GROUP ) pGroup->m_bIsSysGroup = true; pGroup->m_nMUserCount = 0; m_mapGroup.SetAt( strMemberID, pGroup ); if( !strName.IsEmpty() ) pGroup->m_strName = strName; else pGroup->m_strName = strMemberID; } else { if( !strName.IsEmpty() ) pGroup->m_strName = strName; } pGroup->m_nLevel = nLevel; pGroup->m_bHasSub = TRUE; } break; case AM_VIEWITEMTYPE_ROLE: // Role { CMBOrgRole *pRole = NULL; if ( LookupRole( strMemberID,pRole) ) { if( !pRole) m_mapRole.RemoveKey(strMemberID); } if( !pRole) { pRole = new CMBOrgRole; pRole->m_strID = strMemberID; m_mapRole.SetAt(strMemberID, pRole ); if( !strName.IsEmpty() ) pRole->m_strName = strName; else pRole->m_strName = strMemberID; } else { if( !strName.IsEmpty() ) pRole->m_strName = strName; } } break; default: break; } return ; } void CMBOrgListMgr::RemoveMember( int nMemberType, CString strMemberID,bool bDelete ) { if ( strMemberID.IsEmpty() ) return ; switch ( nMemberType ) { case AM_VIEWITEMTYPE_USER: // User { CMBOrgUser *pUser = NULL; if ( LookupUser( strMemberID,pUser ) ) { m_mapUser.RemoveKey(strMemberID); if(bDelete) { if(pUser) delete pUser; } } } break; case AM_VIEWITEMTYPE_VIEW: // View { CMBOrgView *pView = NULL; if ( LookupView( strMemberID,pView ) ) { m_mapView.RemoveKey(strMemberID); if(bDelete) { if(pView) delete pView; } } } break; case AM_VIEWITEMTYPE_GROUP: // System Group case AM_VIEWITEMTYPE_CUSTGROUP: // Custom Group { CMBOrgGroup *pGroup = NULL; if ( LookupGroup( strMemberID,pGroup ) ) { m_mapGroup.RemoveKey(strMemberID); if(bDelete) { if(pGroup) delete pGroup; } } } break; case AM_VIEWITEMTYPE_ROLE: // Role { CMBOrgRole *pRole = NULL; if ( LookupRole( strMemberID,pRole) ) { m_mapRole.RemoveKey(strMemberID); if(bDelete) { if(pRole) delete pRole; } } } break; default: break; } } BOOL CMBOrgListMgr::SetUserStatus( CString strLoginName, int nUserStatus ) { CMBOrgUser *pUser = NULL; if ( strLoginName.IsEmpty() || nUserStatus < AM_USERSTATUS_FLN ) return FALSE; if ( !LookupUser( strLoginName,pUser ) ) return FALSE; if ( !pUser ) return FALSE; pUser->m_nStatus = nUserStatus; return TRUE; } int CMBOrgListMgr::GetUserStatus( const CString strLoginName ) { CMBOrgUser *pUser = NULL; if ( strLoginName.IsEmpty() ) return AM_USERSTATUS_NONE; if ( !LookupUser( strLoginName,pUser ) ) return AM_USERSTATUS_NONE; if ( pUser == NULL ) return AM_USERSTATUS_NONE; return pUser->m_nStatus; } int CMBOrgListMgr::GetUserLevel( const CString strLoginName ) { CMBOrgUser *pUser = NULL; if ( strLoginName.IsEmpty() ) return -1; if ( !LookupUser( strLoginName,pUser ) ) return -1; if ( pUser == NULL ) return -1; return pUser->m_nLevel; } void CMBOrgListMgr::SetUserVer( CString strLoginName, int nUserInfoVer, int nUserPhotoVer) { CMBOrgUser *pUser = NULL; if ( strLoginName.IsEmpty() ) return; if(nUserInfoVer <= 0 && nUserPhotoVer <= 0) return; if ( !LookupUser( strLoginName,pUser ) ) return; if ( !pUser) return; if(nUserInfoVer> 0) pUser->m_nUserVer = nUserInfoVer; if(nUserPhotoVer> 0) pUser->m_nUserPhotoVer = nUserPhotoVer; } BOOL CMBOrgListMgr::GetUserVer( const CString strLoginName, int &nUserInfoVer, int &nUserPhotoVer ) { CMBOrgUser *pUser = NULL; if ( strLoginName.IsEmpty() ) return FALSE; if ( !LookupUser( strLoginName,pUser ) ) return FALSE; if ( !pUser) return FALSE; nUserInfoVer = pUser->m_nUserVer; nUserPhotoVer = pUser->m_nUserPhotoVer ; return TRUE; } BOOL CMBOrgListMgr::DelView( CString strViewID ) { CMBOrgView *pView = NULL; if ( !LookupView( strViewID,pView ) ) return false; if ( pView ) delete pView; m_mapView.RemoveKey( strViewID ); return true; } CString CMBOrgListMgr::GetAllOnLineUser( ) { POSITION pos; CMBOrgUser *pUser = NULL; CString strValue, strItem; CString strKey; for ( pos = m_mapUser.GetStartPosition( ); pos; ) { m_mapUser.GetNextAssoc( pos,strKey,pUser ); if ( !pUser ) continue; if ( CMBOrgFunc::IsOnlineUser( pUser->m_nStatus ) ) { strValue += _T(";"); if ( pUser->m_nLevel == 10000 ) strItem.Format( _T("LoginName=%s,UserName=%s"), pUser->m_strLoginName, pUser->m_strUserName ); else strItem.Format( _T("LoginName=%s,UserName=%s,Level=%d"), pUser->m_strLoginName, pUser->m_strUserName, pUser->m_nLevel ); strValue += strItem; } } if ( !strValue.IsEmpty() ) strValue.Delete( 0 ); return strValue; } void CMBOrgListMgr::OffLineAllUser( ) { POSITION pos; CMBOrgUser *pUserItem = NULL; CMBOrgGroup *pGroup = NULL; CString strKey; for ( pos = m_mapUser.GetStartPosition( ); pos; ) { m_mapUser.GetNextAssoc( pos,strKey,pUserItem ); if ( !pUserItem ) continue; if ( pUserItem->m_nStatus != AM_USERSTATUS_FLN ) pUserItem->m_nStatus = AM_USERSTATUS_FLN; } for ( pos = m_mapGroup.GetStartPosition( ); pos; ) { m_mapGroup.GetNextAssoc( pos,strKey,pGroup ); if ( !pGroup ) continue; pGroup->m_nOnLineUser = 0; } } BOOL CMBOrgListMgr::ParseOrgXml(int nMemberType, CString strMemberID, CString strCmder, CString strXml, bool bCover) { COIXMLParser xmlParser; IXMLDOMElementPtr ptrBody; CString strNodeName,strNodeValue,strAttrValue; CMBOrgMember itemMember; BOOL bRet; if(strXml.IsEmpty()) return FALSE; if( !xmlParser.ParseXMLStr(strXml, ptrBody) ) { return FALSE; } COIXMLParser::GetNodeContent(ptrBody, strNodeName, strNodeValue); if(strCmder.Compare(CMD_UBGI) == 0 || strCmder.Compare(CMD_UBUP) == 0 ) { if( strNodeName == CPN_NODE_USER) ParseOrgUserInfo(ptrBody, &itemMember,true); return TRUE; } if(strNodeName == CPN_NODE_BODY) { if(strCmder.Compare(CMD_OBGL) == 0 || strCmder.Compare(CMD_UQCR) == 0 || strCmder.Compare(CMD_RBGL) == 0 || strCmder.Compare(CMD_RMGT) == 0 ) { bRet = ParsOrgUserList(nMemberType, strMemberID, ptrBody,bCover); } else if(strCmder.Compare(CMD_OMGU) == 0 ) { bRet = ParsOrgUserList(nMemberType, strMemberID, ptrBody,bCover); CMBOrgGroup *pGroup = NULL; CMBOrgView *pView = NULL; if(nMemberType == AM_VIEWITEMTYPE_GROUP || nMemberType == AM_VIEWITEMTYPE_CUSTGROUP) { if(LookupGroup(strMemberID, pGroup)) { if(pGroup) pGroup->m_bIsLoadedUserSuccess = true; } } else if(nMemberType == AM_VIEWITEMTYPE_VIEW) { if(LookupView(strMemberID, pView)) { if(pView) pView->m_bIsLoadedUserSuccess = true; } } } else if( strCmder.Compare(CMD_UAGO) == 0 ) { bRet = ParsUAGOrgList(nMemberType, strMemberID, ptrBody,bCover); } else if(strCmder.Compare(CMD_MFLG) == 0 ) { bRet = ParseContactGroupInfo(nMemberType, strMemberID, ptrBody,bCover); } else if(strCmder.Compare(CMD_MFGU) == 0 ) { bRet = ParsOrgUserList(nMemberType, strMemberID, ptrBody,bCover); } } return TRUE; } BOOL CMBOrgListMgr::ParsOrgUserList(int nMemberType, CString strMemberID, IXMLDOMElementPtr ptrBody ,bool bCover ) { IXMLDOMNodePtr ptrNode,ptrNext; CString strNodeName,strNodeValue,strAttrValue; int nNameLen; CMBOrgGroup *pGroup = NULL; CMBOrgView *pView = NULL; CMBOrgRole *pRole = NULL; CMBOrgUser *pUser = NULL; int nSortLevel; if ( ptrBody == NULL ) return FALSE; nSortLevel = 0; if(nMemberType == AM_VIEWITEMTYPE_GROUP || nMemberType == AM_VIEWITEMTYPE_CUSTGROUP) { LookupGroup(strMemberID,pGroup); } else if(nMemberType == AM_VIEWITEMTYPE_VIEW) { LookupView(strMemberID,pView); } else if(nMemberType == AM_VIEWITEMTYPE_ROLE) { LookupRole(strMemberID,pRole); } ptrBody->get_firstChild( &ptrNode); while(ptrNode) { CMBOrgMember itemMember; COIXMLParser::GetNodeContent(ptrNode, strNodeName, strNodeValue); nNameLen = strNodeName.GetLength(); switch( nNameLen ) { case 4: if ( strNodeName.CompareNoCase(CPN_NODE_USER ) == 0 ) { ParseOrgUserInfo(ptrNode, &itemMember ,false); } else if ( strNodeName.CompareNoCase(CPN_NODE_ROLE ) == 0 ) { ParseOrgRoleInfo(ptrNode, &itemMember ); } break; case 3: if ( strNodeName.CompareNoCase( CPN_NODE_ORG ) == 0 ) { CArrayMember arParentMember; arParentMember.RemoveAll(); ParseOrgInfo(ptrNode, &itemMember, arParentMember, nSortLevel); nSortLevel++; } break; default: break; } if(nMemberType == AM_VIEWITEMTYPE_GROUP || nMemberType == AM_VIEWITEMTYPE_CUSTGROUP) { if(pGroup) { if( !pGroup->FindMember(itemMember.m_nType,itemMember.m_strID)) { if(LookupUser(itemMember.m_strID,pUser)) { if(pUser && CMBOrgFunc::IsOnlineUser( pUser->m_nStatus )) { pGroup->m_nOnLineUser++; } } } POSITION pos2; CMBOrgMember *pMember2 = NULL; pos2 = pGroup->FindMember( itemMember.m_nType, itemMember.m_strID ); if ( pos2 ) { pMember2 = (CMBOrgMember *)pGroup->m_listMember.GetAt( pos2 ); *pMember2 = itemMember; } else { pMember2 = new CMBOrgMember; *pMember2 = itemMember; pGroup->m_listMember.AddTail( pMember2 ); } pGroup->SetLoaded(); } } else if(nMemberType == AM_VIEWITEMTYPE_VIEW) { if(pView) { POSITION pos2; CMBOrgMember *pMember2 = NULL; pos2 = pView->FindMember( itemMember.m_nType, itemMember.m_strID ); if ( pos2 ) { pMember2 = (CMBOrgMember *)pView->m_listMember.GetAt( pos2 ); *pMember2 = itemMember; } else { pMember2 = new CMBOrgMember; *pMember2 = itemMember; pView->m_listMember.AddTail( pMember2 ); } pView->SetLoaded(); } } else if(nMemberType == AM_VIEWITEMTYPE_ROLE) { if(pRole) { POSITION pos2; CMBOrgMember *pMember2 = NULL; pos2 = pRole->FindUser( itemMember.m_strID ); if ( pos2 ) { pMember2 = (CMBOrgMember *)pRole->m_listMember.GetAt( pos2 ); *pMember2 = itemMember; } else { pMember2 = new CMBOrgMember; *pMember2 = itemMember; pRole->m_listMember.AddTail( pMember2 ); } // pRole->FindUser(itemMember.m_strID,itemMember.m_strName,itemMember.m_strDesc,nSortLevel); pRole->SetLoaded(); } } ptrNode->get_nextSibling( &ptrNext); ptrNode = ptrNext; } if(nMemberType == AM_VIEWITEMTYPE_GROUP || nMemberType == AM_VIEWITEMTYPE_CUSTGROUP) { if(pGroup) { if(pGroup->m_nMUserCount < 1) pGroup->m_nMUserCount = pGroup->GetUserMemberCount(); } } else if(nMemberType == AM_VIEWITEMTYPE_VIEW) { if(pView) { if(pView->m_nMemUsers < 1) pView->m_nMemUsers = pView->GetUserMemberCount(); } } return TRUE; } BOOL CMBOrgListMgr::ParsUAGOrgList(int nMemberType, CString strMemberID, IXMLDOMElementPtr ptrBody ,bool bCover) { IXMLDOMNodePtr ptrChildNode,ptrChildNext; IXMLDOMNodePtr ptrNode,ptrNext; CString strNodeName,strNodeValue,strAttrValue; int nNameLen; CMBOrgView *pView = NULL; int nSortLevel; BOOL bFlag = FALSE; if ( ptrBody == NULL ) return FALSE; nSortLevel = 0; if( !LookupView(strMemberID,pView)) return FALSE; if( !pView) return FALSE; ptrBody->get_firstChild( &ptrNode); while(ptrNode) { CMBOrgMember itemMember; bFlag = FALSE; COIXMLParser::GetNodeContent(ptrNode, strNodeName, strNodeValue); nNameLen = strNodeName.GetLength(); switch( nNameLen ) { case 3: if ( strNodeName.CompareNoCase( CPN_NODE_ORG ) == 0 ) { CArrayMember arParentMember; arParentMember.RemoveAll(); if( COIXMLParser::GetNodeAttrValue(ptrNode, CPN_ORG_PARENTINFO,strAttrValue )) { CString strItem; CStringArray arNames; CStringArray arValue; while( CMBOrgFunc::GetElementItem(strAttrValue,strItem, _T("},") )) { CMBOrgMember itemMemberParent; strItem += _T("}"); ParseParentInfo(strItem, &itemMemberParent); arParentMember.Add(itemMemberParent); } } POSITION pos2; CMBOrgMember *pMember2 = NULL; ParseOrgInfo(ptrNode, &itemMember, arParentMember, nSortLevel); pos2 = pView->FindMember( itemMember.m_nType, itemMember.m_strID); if ( pos2 ) { pMember2 = (CMBOrgMember *)pView->m_listMember.GetAt( pos2 ); *pMember2 = itemMember; } else { pMember2 = new CMBOrgMember; *pMember2 = itemMember; pView->m_listMember.AddTail( pMember2 ); } pView->SetLoaded(); pView->m_arParentMember.RemoveAll(); nSortLevel++; } break; default: break; } ptrNode->get_nextSibling( &ptrNext); ptrNode = ptrNext; } return TRUE; } void CMBOrgListMgr::ParseOrgUserInfo( IXMLDOMElementPtr ptrItem ,CMBOrgMember *pMember,bool bCover) { IXMLDOMNodePtr ptrNode,ptrNext; CString strNodeName,strNodeValue; CString strAttrValue; int nAttrValue; CMBOrgUser *pUser = NULL; CMBOrgUser itemUser; POSITION pos = NULL; if ( !ptrItem ) return ; pMember->m_nType = AM_VIEWITEMTYPE_USER; if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_LOGIN,strAttrValue )) { itemUser.m_strLoginName = strAttrValue.MakeLower(); pMember->m_strID = strAttrValue; } if ( LookupUser( itemUser.m_strLoginName,pUser ) ) { if(pUser) itemUser = *pUser; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_NAME,strAttrValue )) { itemUser.m_strUserName = strAttrValue; pMember->m_strName = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_DISPNAME,strAttrValue )) { itemUser.m_strDispName = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_ALIASNAME,strAttrValue )) { itemUser.m_strAliasName = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_LEVEL,nAttrValue )) { itemUser.m_nLevel = nAttrValue; pMember->m_nSortLevel = itemUser.m_nLevel; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_TITLE,strAttrValue )) { itemUser.m_strPlace = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_SEX,strAttrValue )) { itemUser.m_strSex = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_WECHAT,strAttrValue )) { itemUser.m_strWeChat = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_TEL,strAttrValue )) { itemUser.m_strTel = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_TELEXT,strAttrValue )) { itemUser.m_strTelExt = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_MOBILE,strAttrValue )) { itemUser.m_strMobileNO = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_MOBILECORNET,strAttrValue )) { itemUser.m_strCornet = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_EMAIL,strAttrValue )) { itemUser.m_strEMail = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_STATUS,nAttrValue )) { itemUser.m_nStatus = nAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_DEPART,strAttrValue )) { itemUser.m_strDeptInfo = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_MLGI_UNIT,strAttrValue )) { itemUser.m_strUnitInfo = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_PHOTOVER,nAttrValue )) { itemUser.m_nUserPhotoVer = nAttrValue; pMember->m_nUserPhotoVer = nAttrValue; } if(itemUser.m_strUserName.IsEmpty()) { itemUser.m_strUserName = itemUser.m_strLoginName; pMember->m_strName = pMember->m_strID; } if( !itemUser.m_strAliasName.IsEmpty()) m_mapUserAliasName.SetAt(itemUser.m_strAliasName,itemUser.m_strLoginName); if(!pUser) { pUser = new CMBOrgUser; *pUser = itemUser; m_mapUser.SetAt(itemUser.m_strLoginName,pUser); bCover = true; ptrItem->get_firstChild( &ptrNode); while(ptrNode) { COIXMLParser::GetNodeContent(ptrNode, strNodeName, strNodeValue); if ( strNodeName.CompareNoCase( CPN_MLGI_SIGN ) == 0 ) { strNodeValue.Replace( _T("]]>"), _T("]]>") ); pUser->m_strSign= strNodeValue; break; } ptrNode->get_nextSibling( &ptrNext); ptrNode = ptrNext; } return; } if(bCover)// && itemUser.m_nUserVer >= pUser->m_nUserVer { *pUser = itemUser; ptrItem->get_firstChild( &ptrNode); while(ptrNode) { COIXMLParser::GetNodeContent(ptrNode, strNodeName, strNodeValue); if ( strNodeName.CompareNoCase( CPN_MLGI_SIGN ) == 0 ) { strNodeValue.Replace( _T("]]>"), _T("]]>") ); pUser->m_strSign= strNodeValue; break; } ptrNode->get_nextSibling( &ptrNext); ptrNode = ptrNext; } } else { if(pUser->m_nLevel < 0 ) pUser->m_nLevel = itemUser.m_nLevel; } } void CMBOrgListMgr::ParseOrgInfo( IXMLDOMElementPtr ptrItem, CMBOrgMember *pMember, CArrayMember &arParentMember, int nSortLevel) { IXMLDOMNodePtr ptrNode,ptrNext; CString strNodeName,strNodeValue; CString strAttrValue; int nAttrValue; CMBOrgGroup *pGroup = NULL; CMBOrgView *pView = NULL; CString strCode = _T(""); CString strType = _T(""); int bIsUnit = false; int nMemUsers = 0; int bHasSub = false; POSITION pos = NULL; int nMemOrgs = 0; if ( !ptrItem ) return ; if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_NAME,strAttrValue )) { pMember->m_strName = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_SNAME,strAttrValue )) { pMember->m_strSName = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_ID,strAttrValue )) { pMember->m_strID = strAttrValue; } COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_HASSUB,bHasSub ); COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_ISUNIT,bIsUnit ); if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_MEMUSERS,nAttrValue )) { nMemUsers = nAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_UNITTYPE,strAttrValue )) { pMember->m_strGener = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_SUBORGS,nAttrValue )) { nMemOrgs = nAttrValue; } pMember->m_nSortLevel = nSortLevel; if(bIsUnit) { if ( !LookupView( pMember->m_strID ,pView ) ) { pView = new CMBOrgView; m_mapView.SetAt(pMember->m_strID ,pView); } pMember->m_nType = AM_VIEWITEMTYPE_VIEW ; pView->m_strID = pMember->m_strID; pView->m_strSName = pMember->m_strSName; pView->m_strName = pMember->m_strName; pView->m_strGener = pMember->m_strGener; pView->m_nMemOrgs = nMemOrgs; pView->m_nMemUsers = nMemUsers; pView->m_nLevel = pMember->m_nSortLevel; pView->m_bHasSub = bHasSub; if(nMemUsers > 0 || nMemOrgs > 0) pView->m_bHasSub = TRUE; pView->m_arParentMember.RemoveAll(); pView->m_arParentMember.Copy(arParentMember); } else { if ( !LookupGroup( pMember->m_strID,pGroup ) ) { pGroup = new CMBOrgGroup; m_mapGroup.SetAt(pMember->m_strID,pGroup); } pMember->m_nType = AM_VIEWITEMTYPE_GROUP; pGroup->m_nLevel = pMember->m_nSortLevel; pGroup->m_strSName = pMember->m_strSName; pGroup->m_strID = pMember->m_strID; pGroup->m_strName = pMember->m_strName; pGroup->m_nMUserCount = nMemUsers; pGroup->m_nMemOrgs = nMemOrgs; pGroup->m_bHasSub = bHasSub; if(nMemUsers > 0 || nMemOrgs > 0) pGroup->m_bHasSub = TRUE; pGroup->m_arParentMember.RemoveAll(); pGroup->m_arParentMember.Copy(arParentMember); } } BOOL CMBOrgListMgr::ParseContactGroupInfo(int nMemberType, CString strMemberID,IXMLDOMElementPtr ptrBody, bool bCover ) { IXMLDOMNodePtr ptrNode,ptrNext; CString strNodeName,strNodeValue,strAttrValue; CMBOrgGroup *pGroup = NULL; CMBOrgView *pView = NULL; if ( ptrBody == NULL ) return FALSE; if(nMemberType == AM_VIEWITEMTYPE_GROUP || nMemberType == AM_VIEWITEMTYPE_CUSTGROUP) { LookupGroup(strMemberID, pGroup); } else if(nMemberType == AM_VIEWITEMTYPE_VIEW) { LookupView(strMemberID, pView); } ptrBody->get_firstChild( &ptrNode); while(ptrNode) { COIXMLParser::GetNodeContent(ptrNode, strNodeName, strNodeValue); if ( strNodeName.CompareNoCase(CPN_NODE_GROUP ) == 0 ) { CMBOrgMember itemMember; itemMember.m_nSortLevel = 1; COIXMLParser::GetNodeAttrValue(ptrNode, CPN_ORG_ID,itemMember.m_strID ); COIXMLParser::GetNodeAttrValue(ptrNode, CPN_ORG_NAME,itemMember.m_strName ); itemMember.m_nType = AM_VIEWITEMTYPE_CUSTGROUP; if(itemMember.m_strID == _T("{00000000-0000-0000-0000-000000000000}")) { itemMember.m_nSortLevel = 0; itemMember.m_strID = SUBVIEW_TOPCONTACTS; } if( !itemMember.m_strName.IsEmpty()&& !itemMember.m_strID.IsEmpty()) { AddMember(itemMember.m_nType ,itemMember.m_strID,itemMember.m_strName,itemMember.m_nSortLevel ); if(nMemberType == AM_VIEWITEMTYPE_GROUP || nMemberType == AM_VIEWITEMTYPE_CUSTGROUP) { if(pGroup) { POSITION pos2; CMBOrgMember *pMember2 = NULL; pos2 = pGroup->FindMember( itemMember.m_nType, itemMember.m_strID ); if ( pos2 ) { pMember2 = (CMBOrgMember *)pGroup->m_listMember.GetAt( pos2 ); *pMember2 = itemMember; } else { pMember2 = new CMBOrgMember; *pMember2 = itemMember; pGroup->m_listMember.AddTail( pMember2 ); } pGroup->SetLoaded(); } } else if(nMemberType == AM_VIEWITEMTYPE_VIEW) { if(pView) { POSITION pos2; CMBOrgMember *pMember2 = NULL; pos2 = pView->FindMember( itemMember.m_nType, itemMember.m_strID ); if ( pos2 ) { pMember2 = (CMBOrgMember *)pView->m_listMember.GetAt( pos2 ); *pMember2 = itemMember; } else { pMember2 = new CMBOrgMember; *pMember2 = itemMember; pView->m_listMember.AddTail( pMember2 ); } pView->SetLoaded(); } } pGroup = NULL; LookupGroup(itemMember.m_strID, pGroup); if(pGroup) pGroup->m_bHasSub = true; } } ptrNode->get_nextSibling( &ptrNext); ptrNode = ptrNext; } return TRUE; } CString CMBOrgListMgr::GetUserMobile( CString strLoginName) { CMBOrgUser *pUser = NULL; if ( strLoginName.IsEmpty() ) return _T(""); if ( !LookupUser( strLoginName, pUser ) ) return _T(""); if ( !pUser) return _T(""); return pUser->m_strMobileNO; } bool CMBOrgListMgr::ParseParentInfo(CString strBuff, CMBOrgMember *pMember ) { CString strData; CString strItem; CString strName; CString strValue; CString strTemp; strData = strBuff; strData.TrimLeft(); strData.TrimRight(); strData.TrimLeft(_T("{")); strData.TrimRight(_T("}")); while( CMBOrgFunc::GetElementItem(strData,strItem, _T(",") )) { if( !strItem.IsEmpty() ) { strName = _T(""); strValue = _T(""); CMBOrgFunc::GetElementItem(strItem,strTemp, _T(":") ); if(strTemp.GetLength() > 2) { if(strTemp.Left(1) != _T("\"")) continue; if(strTemp.Right(1) != _T("\"")) continue; strName = strTemp.Mid(1,strTemp.GetLength() - 2); } if( strName.IsEmpty() ) continue; CMBOrgFunc::GetElementItem(strItem,strTemp, _T(":") ); if(strTemp.GetLength() > 2) { if(strTemp.Left(1) != _T("\"")) continue; if(strTemp.Right(1) != _T("\"")) continue; strValue = strTemp.Mid(1,strTemp.GetLength() - 2); } pMember->m_nType =AM_VIEWITEMTYPE_GROUP; if( strName.CompareNoCase(CPN_ORG_NAME)== 0 ) { pMember->m_strName = strValue; } else if( strName.CompareNoCase(CPN_ORG_SNAME)== 0 ) { pMember->m_strSName = strValue; } else if( strName.CompareNoCase(CPN_ORG_ISUNIT)== 0 ) { if(_tstol(strValue)) pMember->m_nType =AM_VIEWITEMTYPE_VIEW; } else if( strName.CompareNoCase(CPN_ORG_UNITTYPE)== 0 ) { pMember->m_strGener = strValue; } } } return true; } void CMBOrgListMgr::ParseOrgRoleInfo( IXMLDOMElementPtr ptrItem, CMBOrgMember *pMember) { IXMLDOMNodePtr ptrNode,ptrNext; CString strNodeName,strNodeValue; CString strAttrValue; if ( !ptrItem ) return ; if ( !pMember ) return ; pMember->m_nType = AM_VIEWITEMTYPE_ROLE; if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_ID,strAttrValue )) { pMember->m_strID = strAttrValue; } if( COIXMLParser::GetNodeAttrValue(ptrItem, CPN_ORG_NAME,strAttrValue )) { pMember->m_strName = strAttrValue; } } CString CMBOrgListMgr::GetUserLogins( ) { CString strUsers = _T(""); CMBOrgUser *pUser = NULL; CString strKey = _T(""); POSITION pos; for ( pos = m_mapUser.GetStartPosition(); pos; ) { m_mapUser.GetNextAssoc( pos,strKey,pUser ); if ( pUser ) strUsers += pUser->m_strLoginName + _T(";"); } return strUsers; } void CMBOrgListMgr::SetUserAliasName( CString strLoginName,CString strAliasName) { if(strAliasName.IsEmpty() || strLoginName.IsEmpty()) return; m_mapUserAliasName.SetAt(strAliasName, strLoginName); } void CMBOrgListMgr::RemoveAllUserRemarks( ) { m_mapUserReamrksName.RemoveAll(); } CString CMBOrgListMgr::GetUserRemarksName( CString strLoginName) { CString strRemarksName = _T(""); if ( strLoginName.IsEmpty() ) return strRemarksName; strLoginName.MakeLower(); m_mapUserReamrksName.Lookup(strLoginName,strRemarksName ); return strRemarksName; } void CMBOrgListMgr::SetUserRemarksName( CString strLoginName,CString strRemarksName ) { if ( strLoginName.IsEmpty() ) return; strLoginName.MakeLower(); if ( strRemarksName.IsEmpty() ) { m_mapUserReamrksName.RemoveKey(strLoginName); } else m_mapUserReamrksName.SetAt(strLoginName,strRemarksName); } CString CMBOrgListMgr::GetUserShowName( CString strLoginName) { CString strName = _T(""); if ( strLoginName.IsEmpty() ) return strName; strLoginName.MakeLower(); m_mapUserReamrksName.Lookup(strLoginName,strName ); if ( !strName.IsEmpty() ) return strName; CMBOrgUser *pUser = NULL; if ( m_mapUser.Lookup( strLoginName,pUser ) ) { if( !pUser) return strName; if(strName.IsEmpty()) strName = pUser->m_strDispName; if(strName.IsEmpty()) strName= pUser->m_strUserName; } return strName; } CString CMBOrgListMgr::GetUserListShowName( CString strLoginName) { CString strName = _T(""); if ( strLoginName.IsEmpty() ) return strName; strLoginName.MakeLower(); m_mapUserReamrksName.Lookup(strLoginName,strName ); if ( !strName.IsEmpty() ) return strName; CMBOrgUser *pUser = NULL; if ( m_mapUser.Lookup( strLoginName,pUser ) ) { if( !pUser) return strName; if(strName.IsEmpty()) strName= pUser->m_strUserName; } return strName; }