/* CIcy() */ CIcy::CIcy(LPCSTR pUrl /*= NULL*/,int nPort /*= HTTP_DEFAULT_PORT*/) { Reset(); m_nPort = nPort; if(pUrl) { URL url; SplitUrl(pUrl,&url); strcpyn(m_szHost,StripUrlType(url.host),sizeof(m_szHost)); if(!strnull(url.dir)) strcpyn(m_szDir,url.dir,sizeof(m_szDir)); if(!strnull(url.file)) strcpyn(m_szFile,url.file,sizeof(m_szFile)); m_nPort = url.port; } if(m_nPort <= 0) m_nPort = HTTP_DEFAULT_PORT; }
LRESULT SiteWizRemote::FillList (/*[in]*/ WPARAM wParam, /*[in]*/ LPARAM lParam) { UNUSED_ALWAYS (wParam); UNUSED_ALWAYS (lParam); CPropertySheet * pSheet = reinterpret_cast<CPropertySheet*>(GetParent()); ASSERT_KINDOF (CPropertySheet, pSheet); try { if (! listControl.DeleteAllItems()) { FATAL_WINDOWS_ERROR ("CListCtrl::DeleteAllItems", 0); } bool selected = false; string url; if (! pManager->TryGetRemotePackageRepository(url)) { url = ""; } int idx = 0; for (vector<RepositoryInfo>::const_iterator it = repositories.begin(); it != repositories.end(); ++ it, ++ idx) { #if MIKTEX_RELEASE_STATE < 4 if (it->packageLevel == PackageLevel::None) { continue; } #endif LV_ITEM lvitem; lvitem.iItem = idx; lvitem.mask = LVIF_PARAM; lvitem.lParam = idx; lvitem.iSubItem = 0; if (listControl.InsertItem(&lvitem) < 0) { FATAL_WINDOWS_ERROR ("CListCtrl::InsertItem", 0); } string protocol; string host; SplitUrl (it->url, protocol, host); SetItemText (idx, 0, it->country.c_str()); CString protUC (protocol.c_str()); protUC.MakeUpper (); SetItemText (idx, 1, TU_(protUC)); SetItemText (idx, 2, host.c_str()); SetItemText (idx, 3, TU_(CTime(it->timeDate).Format(_T("%d-%b-%y")))); SetItemText (idx, 4, it->description.c_str()); if (it->url == url) { if (! listControl.SetItemState(idx, LVIS_SELECTED, LVIS_SELECTED)) { FATAL_WINDOWS_ERROR ("CListCtrl::SetItemState", 0); } selected = true; } } pSheet->SetWizardButtons (PSWIZB_BACK | (selected ? PSWIZB_FINISH : 0)); } catch (const MiKTeXException & e) { ErrorDialog::DoModal (this, e); } catch (const exception & e) { ErrorDialog::DoModal (this, e); } return (0); }
LRESULT RemoteRepositoryPage::OnFillList (/*[in]*/ WPARAM wParam, /*[in]*/ LPARAM lParam) { UNUSED_ALWAYS (wParam); UNUSED_ALWAYS (lParam); try { if (pSheet->GetCancelFlag() || pSheet->GetErrorFlag()) { SetProgressText (pSheet->GetCancelFlag() ? T_("Cancelled") : T_("Unsuccessful")); pSheet->EnableCloseButton (); return (0); } if (! listControl.DeleteAllItems()) { FATAL_WINDOWS_ERROR ("CListCtrl::DeleteAllItems", 0); } bool selected = false; int idx = 0; for (vector<RepositoryInfo>::const_iterator it = repositories.begin(); it != repositories.end(); ++ it, ++ idx) { #if MIKTEX_RELEASE_STATE < 4 if (it->packageLevel < theApp.GetPackageLevel()) { continue; } #endif LV_ITEM lvitem; lvitem.iItem = idx; lvitem.mask = LVIF_PARAM; lvitem.lParam = idx; lvitem.iSubItem = 0; if (listControl.InsertItem(&lvitem) < 0) { FATAL_WINDOWS_ERROR ("CListCtrl::InsertItem", 0); } string protocol; string host; SplitUrl (it->url, protocol, host); SetItemText (idx, 0, it->country.c_str()); CStringW protUC = UW_(protocol.c_str()); protUC.MakeUpper (); SetItemText (idx, 1, WU_(protUC)); SetItemText (idx, 2, host.c_str()); SetItemText (idx, 3, TU_(CTime(it->timeDate).Format(_T("%d-%b-%y")))); #if SHOW_DESCRIPTION SetItemText (idx, 4, it->description.c_str()); #endif if (it->url == theApp.GetRemotePackageRepository()) { if (! listControl.SetItemState(idx, LVIS_SELECTED, LVIS_SELECTED)) { FATAL_WINDOWS_ERROR ("CListCtrl::SetItemState", 0); } selected = true; } } pSheet->SetWizardButtons (PSWIZB_BACK | (selected ? PSWIZB_NEXT : 0)); } catch (const MiKTeXException & e) { pSheet->ReportError (e); } catch (const exception & e) { pSheet->ReportError (e); } return (0); }
/* Open() */ SOCKET CIcy::Open(LPCSTR pUrl/* = NULL*/,int nPort/* = HTTP_DEFAULT_PORT*/,int icydata/* = 1*/) { // per evitare la ricorsione infinita sui codici 301/302 static int nRecurse = 0; // chiude il socket Close(); // resetta i codice d'errore m_nResponse = 0; m_dwLastError = 0L; memset(m_szLastError,'\0',sizeof(m_szLastError)); CSock::SetWSALastError(0); // resetta e normalizza l'url memset(m_szUrl,'\0',sizeof(m_szUrl)); memset(m_szHost,'\0',sizeof(m_szHost)); strcpy(m_szDir,"/"); memset(m_szFile,'\0',sizeof(m_szFile)); m_nPort = nPort; if(pUrl) { URL url; SplitUrl(pUrl,&url); strcpyn(m_szHost,StripUrlType(url.host),sizeof(m_szHost)); if(strcmp("",url.dir)!=0) strcpyn(m_szDir,url.dir,sizeof(m_szDir)); if(strcmp("",url.file)!=0) strcpyn(m_szFile,url.file,sizeof(m_szFile)); m_nPort = url.port; } if(m_nPort <= 0) m_nPort = HTTP_DEFAULT_PORT; // apre il socket if(CSock::Open(AF_INET,SOCK_STREAM)) { // si collega all'host BOOL bConnected = FALSE; if(GetProxyAddress() && GetProxyPortNumber() > 0) bConnected = CSock::Connect(GetProxyAddress(),GetProxyPortNumber()); else bConnected = CSock::Connect(m_szHost,m_nPort); if(bConnected) { // costruisce la richiesta char szBuffer[4096]; int n = 0; if(GetProxyAddress() && GetProxyPortNumber() > 0) n += _snprintf(szBuffer,sizeof(szBuffer)-1,"GET http://%s:%ld%s%s HTTP/1.0\r\n",m_szHost,m_nPort,m_szDir,m_szFile); else n += _snprintf(szBuffer,sizeof(szBuffer)-1,"GET %s%s HTTP/1.0\r\n",m_szDir,m_szFile); if(strcmp(GetProxyAuth(),"")!=0) { n += _snprintf(szBuffer+n, sizeof(szBuffer) - (1 + n), "Proxy-Authorization: Basic %s\r\n", GetProxyAuth() ); } if(m_szUserAgent[0]!='\0' && n > 0) n += _snprintf(szBuffer+n,sizeof(szBuffer)-1-n,"Host: %s:%ld\r\nAccept: *.*, */*\r\nUser-Agent: %s\r\n",m_szHost,m_nPort,m_szUserAgent); if(icydata==1 && n > 0) n += _snprintf(szBuffer+n,sizeof(szBuffer)-1-n,"Icy-Metadata: 1\r\n"); if(n > 0) n = _snprintf(szBuffer+n,sizeof(szBuffer)-1-n,"\r\n"); // invia TRACEEXPR((_TRACE_FLAG_INFO,__NOFILE__,__NOLINE__,"CIcy::Open(): Send():\n[%s]\n",szBuffer)); if((n = CSock::Send(szBuffer,strlen(szBuffer)))!=SOCKET_ERROR) { // Send() e Receive() a raffica scasinano, sopratutto con ICY ::Sleep((DWORD)CSock::GetDelay()); // riceve if((n = CSock::Receive(szBuffer,sizeof(szBuffer)-1))!=SOCKET_ERROR) { TRACEEXPR((_TRACE_FLAG_INFO,__NOFILE__,__NOLINE__,"CIcy::Open(): Receive():\n[%s]\n",szBuffer)); // carica i campi dell'header if((m_nResponse = ParseHeader(szBuffer))==ICY_CODE_OK) { m_Socket = CSock::GetHandle(); char* p = strstr(szBuffer,"\r\n\r\n"); if(p) { // il primo blocco di dati arriva insieme all'header p+=4; int tot = n - (p-szBuffer); memcpy(m_szFirstChunk,p,tot); m_nFirstChunkLen = tot; /*CBinFile binFile; if(binFile.Create("chunk.dat")) { binFile.Write(m_szFirstChunk,tot); binFile.Close(); }*/ } } else { switch(m_nResponse) { case HTTP_CODE_MOVED_PERMANENTLY: case HTTP_CODE_MOVED_TEMPORARILY: if(++nRecurse > 2) { nRecurse = 0; break; } else return(CIcy::Open(m_szLocation)); default: break; } } } } } } return(m_Socket); }