// Takes an IP address and port number, and the Gnutella index (do) // Connects to the remote computer, and makes a CHandshake object about it in m_pList // Returns true if the connection is made, false if we couldn't connect BOOL CHandshakes::PushTo(IN_ADDR* pAddress, WORD nPort, DWORD nIndex) { CSingleLock pLock1( &Transfers.m_pSection ); if ( pLock1.Lock( 250 ) && Uploads.AllowMoreTo( pAddress ) ) { pLock1.Unlock(); // Make a new CHandshake object, and open a connection to the computer at pAddress and pPort if ( CHandshake* pHandshake = new CHandshake() ) { if ( pHandshake->Push( pAddress, nPort, nIndex ) ) { Add( pHandshake ); return TRUE; } delete pHandshake; } } else theApp.Message( MSG_ERROR, IDS_UPLOAD_PUSH_BUSY, (LPCTSTR)CString( inet_ntoa( *pAddress ) ) ); return FALSE; }
void CLibraryMetaPanel::Update() { CSingleLock pLock1( &Library.m_pSection, TRUE ); CSingleLock pLock2( &m_pSection, TRUE ); CLibraryListPtr pSel( GetViewSelection() ); m_nSelected = pSel ? static_cast< int >( pSel->GetCount() ) : 0; // Show info for library files only CLibraryFile* pFirst = NULL; if ( m_nSelected ) { const CLibraryListItem& pItem = pSel->GetHead(); if ( pItem.Type == CLibraryListItem::LibraryFile ) pFirst = Library.LookupFile( pItem ); if ( pFirst == NULL ) m_nSelected = 0; } m_nIcon32 = m_nIcon48 = -1; if ( m_nSelected == 1 ) { m_nIndex = pFirst->m_nIndex; m_sName = pFirst->m_sName; m_sPath = pFirst->GetPath(); m_sFolder = pFirst->GetFolder(); m_sSize = Settings.SmartVolume( pFirst->GetSize() ); m_sType = ShellIcons.GetTypeString( m_sName ); m_nIcon32 = ShellIcons.Get( pFirst->GetPath(), 32 ); m_nIcon48 = ShellIcons.Get( pFirst->GetPath(), 48 ); m_nRating = pFirst->m_nRating; } else if ( m_nSelected > 1 ) { CString strFormat; LoadString( strFormat, IDS_LIBPANEL_MULTIPLE_FILES ); m_sName.Format( strFormat, m_nSelected ); QWORD nSize = 0; m_sFolder = pFirst->GetFolder(); m_nIcon32 = ShellIcons.Get( pFirst->GetPath(), 32 ); m_nIcon48 = ShellIcons.Get( pFirst->GetPath(), 48 ); m_nRating = 0; for ( POSITION pos = pSel->GetHeadPosition() ; pos ; ) { CLibraryFile* pFile = Library.LookupFile( pSel->GetNext( pos ) ); if ( pFile == NULL ) continue; nSize += pFile->GetSize() / 1024; if ( pFile->IsAvailable() && pFile->GetFolder().CompareNoCase( m_sFolder ) ) { LoadString( m_sFolder, IDS_LIBPANEL_MULTIPLE_FOLDERS ); } int nIcon = ShellIcons.Get( pFile->GetPath(), 48 ); if ( nIcon != m_nIcon48 ) m_nIcon48 = -1; nIcon = ShellIcons.Get( pFile->GetPath(), 32 ); if ( nIcon != m_nIcon32 ) m_nIcon32 = -1; } m_sSize = Settings.SmartVolume( nSize ); m_sPath.Empty(); m_sType.Empty(); } m_pSchema = NULL; if ( pSel ) { for ( POSITION pos = pSel->GetHeadPosition() ; pos ; ) { const CLibraryListItem& pItem = pSel->GetNext( pos ); if ( pItem.Type != CLibraryListItem::LibraryFile ) continue; CLibraryFile* pFile = Library.LookupFile( pItem ); if ( pFile == NULL ) continue; m_pSchema = pFile->m_pSchema; if ( m_pSchema ) break; } } if ( m_pServiceData ) { m_pMetadata->Setup( m_pServiceData ); } else { m_pMetadata->Setup( m_pSchema ); if ( m_pSchema && pSel ) { for ( POSITION pos = pSel->GetHeadPosition() ; pos ; ) { const CLibraryListItem& pItem = pSel->GetNext( pos ); if ( pItem.Type != CLibraryListItem::LibraryFile ) continue; if ( CLibraryFile* pFile = Library.LookupFile( pItem ) ) { if ( pFile->m_pMetadata != NULL && m_pSchema->Equals( pFile->m_pSchema ) ) { m_pMetadata->Combine( pFile->m_pMetadata ); } } } } } m_pMetadata->CreateLinks(); m_pMetadata->Clean( 4096 ); CClientDC dc( this ); if ( Settings.General.LanguageRTL ) SetLayout( dc.m_hDC, LAYOUT_BITMAPORIENTATIONPRESERVED ); SCROLLINFO pInfo; CRect rc; GetClientRect( &rc ); int nThumbSize = min( max( rc.Height() - 16, 64 ), (int)Settings.Library.ThumbSize ); int nHeight = 54 + m_pMetadata->Layout( &dc, rc.Width() - 24 - nThumbSize ); pInfo.cbSize = sizeof(pInfo); pInfo.fMask = SIF_ALL & ~SIF_TRACKPOS; pInfo.nMin = 0; pInfo.nMax = nHeight; pInfo.nPage = rc.Height(); pInfo.nPos = GetScrollPos( SB_VERT ); pInfo.nPos = max( 0, min( pInfo.nPos, pInfo.nMax - (int)pInfo.nPage + 1 ) ); SetScrollInfo( SB_VERT, &pInfo, TRUE ); if ( m_bForceUpdate || ( m_sThumb != m_sPath ) ) { m_bForceUpdate = FALSE; if ( m_bmThumb.m_hObject ) m_bmThumb.DeleteObject(); if ( ! IsThreadAlive() ) { BeginThread( "CtrlLibraryMetaPanel" ); } } pLock2.Unlock(); pLock1.Unlock(); Invalidate(); }
CPrivateChatFrame* CChatWindows::OpenPrivate(GGUID* pGUID, SOCKADDR_IN* pHost, BOOL bMustPush, PROTOCOLID nProtocol, SOCKADDR_IN* pServer) { CPrivateChatFrame* pFrame = NULL; ASSERT ( pHost != NULL ); if ( ( nProtocol == PROTOCOL_BT ) || ( nProtocol == PROTOCOL_FTP ) ) return NULL; if ( ! MyProfile.IsValid() ) { CString strMessage; LoadString( strMessage, IDS_CHAT_NEED_PROFILE ); if ( AfxMessageBox( strMessage, MB_YESNO|MB_ICONQUESTION ) == IDYES ) AfxGetMainWnd()->PostMessage( WM_COMMAND, ID_TOOLS_PROFILE ); return NULL; } if ( nProtocol == PROTOCOL_ED2K ) { CEDClient* pClient; // First, check if it's a low ID user on another server. if ( bMustPush && pServer ) { // It's a firewalled user (Low ID). If they are using another server, we // can't (shouldn't) contact them. (It places a heavy load on the ed2k servers) CSingleLock pLock1( &Network.m_pSection ); if ( ! pLock1.Lock( 250 ) ) return NULL; if ( Neighbours.Get( &pServer->sin_addr ) == NULL ) return NULL; pLock1.Unlock(); } // ED2K chat is handled by the EDClient section. (Transfers) // We need to find (or create) an EDClient to handle this chat session, since everything // on ed2k shares a TCP link. // First, lock the section to prevent a problem with other threads CSingleLock pLock( &Transfers.m_pSection ); if ( ! pLock.Lock( 250 ) ) return NULL; // We need to connect to them, so either find or create an EDClient if ( pServer ) pClient = EDClients.Connect(pHost->sin_addr.S_un.S_addr, pHost->sin_port, &pServer->sin_addr, pServer->sin_port, pGUID ); else pClient = EDClients.Connect(pHost->sin_addr.S_un.S_addr, pHost->sin_port, NULL, 0, pGUID ); // If we weren't able to create a client (Low-id and no server), then exit. if ( ! pClient ) return NULL; // Have it connect (if it isn't) if ( ! pClient->m_bConnected ) pClient->Connect(); // Tell it to start a chat session as soon as it's able pClient->OpenChat(); pLock.Unlock(); // Check for / make active any existing window pFrame = FindPrivate( &pHost->sin_addr ); // Check for an empty frame if ( pFrame == NULL ) { if ( bMustPush ) pFrame = FindED2KFrame( pHost->sin_addr.S_un.S_addr, pServer ); else pFrame = FindED2KFrame( pHost ); } if ( pFrame != NULL ) { // Open window if we found one CWnd* pParent = pFrame->GetParent(); if ( pParent->IsIconic() ) pParent->ShowWindow( SW_SHOWNORMAL ); pParent->BringWindowToTop(); pParent->SetForegroundWindow(); // And exit return pFrame; } // Open an empty (blank) chat frame. This is totally unnecessary- The EDClient will open // one as required, but it looks better to open one here. pFrame = new CPrivateChatFrame(); // Set name (Also used to match incoming connection) if ( bMustPush && pServer ) // Firewalled user (Low ID) { pFrame->m_sNick.Format( _T("%lu@%s:%hu"), pHost->sin_addr.S_un.S_addr, (LPCTSTR)CString( inet_ntoa( pServer->sin_addr ) ), pServer->sin_port ); } else // Regular user (High ID) { pFrame->m_sNick.Format( _T("%s:%hu"), (LPCTSTR)CString( inet_ntoa( pHost->sin_addr ) ), pHost->sin_port ); } // Open window CWnd* pParent = pFrame->GetParent(); if ( pParent->IsIconic() ) pParent->ShowWindow( SW_SHOWNORMAL ); pParent->BringWindowToTop(); pParent->SetForegroundWindow(); // Put a 'connecting' message in the window CString strMessage, strConnecting; LoadString( strConnecting, IDS_CHAT_CONNECTING_TO ); strMessage.Format( strConnecting, pFrame->m_sNick ); pFrame->OnStatusMessage( 0, strMessage ); return pFrame; } if ( pGUID != NULL ) pFrame = FindPrivate( pGUID ); if ( pFrame == NULL ) pFrame = FindPrivate( &pHost->sin_addr ); if ( pFrame == NULL ) { pFrame = new CPrivateChatFrame(); pFrame->Initiate( pGUID, pHost, bMustPush ); } pFrame->PostMessage( WM_COMMAND, ID_CHAT_CONNECT ); CWnd* pParent = pFrame->GetParent(); if ( pParent->IsIconic() ) pParent->ShowWindow( SW_SHOWNORMAL ); pParent->BringWindowToTop(); pParent->SetForegroundWindow(); return pFrame; }
CPrivateChatWnd* CChatWindows::OpenPrivateED2K(const Hashes::Guid& oGUID, const SOCKADDR_IN* pHost, BOOL bMustPush, SOCKADDR_IN* pServer) { // First, check if it's a low ID user on another server. if ( bMustPush && pServer ) { // It's a firewalled user (Low ID). If they are using another server, // we can't (shouldn't) contact them. (Places heavy load on ed2k servers) CSingleLock pLock1( &Network.m_pSection ); if ( ! pLock1.Lock( 250 ) ) return NULL; if ( Neighbours.Get( pServer->sin_addr ) == NULL ) return NULL; pLock1.Unlock(); } // ED2K chat is handled by the EDClient section. (Transfers) // We need to find (or create) an EDClient to handle this chat session, // since everything on ed2k shares a TCP link. // First, lock the section to prevent a problem with other threads CSingleLock pLock( &Transfers.m_pSection ); if ( ! pLock.Lock( 250 ) ) return NULL; // We need to connect to them, so either find or create an EDClient CEDClient* pClient; if ( pServer ) pClient = EDClients.Connect(pHost->sin_addr.s_addr, ntohs( pHost->sin_port ), &pServer->sin_addr, ntohs( pServer->sin_port ), oGUID ); else pClient = EDClients.Connect(pHost->sin_addr.s_addr, ntohs( pHost->sin_port ), NULL, 0, oGUID ); // If we weren't able to create a client (Low-id and no server), then exit. if ( ! pClient ) return NULL; // Have it connect (if it isn't) if ( ! pClient->m_bConnected ) pClient->Connect(); // Tell it to start a chat session as soon as it's able pClient->OpenChat(); pLock.Unlock(); // Check for / make active any existing window CPrivateChatWnd* pFrame = FindPrivate( pHost ); // Check for an empty frame if ( pFrame == NULL ) { if ( bMustPush ) pFrame = FindED2KFrame( pHost->sin_addr.s_addr, pServer ); else pFrame = FindED2KFrame( pHost ); } if ( pFrame != NULL ) { // Open window if we found one //CWnd* pParent = pFrame->GetParent(); //if ( pParent->IsIconic() ) pParent->ShowWindow( SW_SHOWNORMAL ); //pParent->BringWindowToTop(); //pParent->SetForegroundWindow(); pFrame->Open(); // And exit return pFrame; } // Set name (Also used to match incoming connection) CString strNick; if ( bMustPush && pServer ) // Firewalled user (Low ID) { strNick.Format( L"%lu@%s:%hu", pHost->sin_addr.S_un.S_addr, (LPCTSTR)CString( inet_ntoa( pServer->sin_addr ) ), ntohs( pServer->sin_port ) ); } else // Regular user (High ID) { strNick.Format( L"%s:%hu", (LPCTSTR)CString( inet_ntoa( pHost->sin_addr ) ), ntohs( pHost->sin_port ) ); } // Open an empty (blank) chat frame. This is totally unnecessary- The EDClient will open // one as required, but it looks better to open one here. pFrame = new CPrivateChatWnd(); pFrame->Setup( strNick ); // Obsolete: for reference & deletion // // Open window // CWnd* pParent = pFrame->GetParent(); // if ( pParent->IsIconic() ) pParent->ShowWindow( SW_SHOWNORMAL ); // pParent->BringWindowToTop(); // pParent->SetForegroundWindow(); // // Put a 'connecting' message in the window // CString strMessage; // strMessage.Format( LoadString( IDS_CHAT_CONNECTING_TO ), (LPCTSTR)pFrame->m_sNick ); // pFrame->OnStatusMessage( 0, strMessage ); // // if ( oGUID ) // pFrame = FindPrivate( oGUID ); // if ( pFrame == NULL ) // pFrame = FindPrivate( &pHost->sin_addr ); // if ( pFrame == NULL ) // { // pFrame = new CPrivateChatWnd(); // pFrame->Initiate( oGUID, pHost, bMustPush ); // } // // pFrame->PostMessage( WM_COMMAND, ID_CHAT_CONNECT ); // // CWnd* pParent = pFrame->GetParent(); // if ( pParent->IsIconic() ) pParent->ShowWindow( SW_SHOWNORMAL ); // pParent->BringWindowToTop(); // pParent->SetForegroundWindow(); return pFrame; }