void PanelView::Reload(void)
////////////////////////////////////////////////////////////////////////
{
	switch (m_PanelMode)
	{
		case PM_NORMAL:
			ClearFileList();
			ReadDirectory();
			break;
		case PM_DISKS:
			ClearFileList();
			ReadDisks();
			break;
	}
}
void PanelView::Reload(const char *itemname)
////////////////////////////////////////////////////////////////////////
{
	switch (m_PanelMode)
	{
		case PM_NORMAL:
			ClearFileList();
			ReadDirectory(itemname);
			break;
		case PM_DISKS:
			ClearFileList();
			ReadDisks();
			break;
	}
}
void CPRJ3_0613Dlg::OnBnClickedGengxinliebiao()
{
	int retval;

	//清空原有的文件列表
	ClearFileList();
	if (filelist_sock != 0){
		closesocket(filelist_sock);
		filelist_sock = 0;
		fl_sock_status = S_CLOSE;
	}

	//Recurse(_T("E:\\实验程序"));
	// TODO:  在此添加控件通知处理程序代码
	CtlPDU *sendbuff = (CtlPDU *)malloc(sizeof(CtlPDU));
	sendbuff->type = CTL_PDU_TYPE;
	sendbuff->cmd = REQ_FILELIST;
	sendbuff->len = 0;
	retval = send(CtlSock, (char *)sendbuff, 1 + 1 + 1, 0);

	if (retval < 1 + 1 + 1){
		MessageBox(_T("发送文件列表请求失败!"), _T("发送错误"), MB_OK);
		return;
	}

}
void PanelView::GotoDisks(void)
////////////////////////////////////////////////////////////////////////
{
	SetPanelMode(PM_DISKS);
	m_PathStringView->SetText("Mounted disks:");
	ClearFileList();
	ReadDisks();
}
void PanelView::GotoRoot(void)
////////////////////////////////////////////////////////////////////////
{
	SetPanelMode(PM_NORMAL);
	m_Path.SetTo("/");
	SetPathStringView();
	ClearFileList();
	ReadDirectory();
}
void PanelView::Reload(int index)
////////////////////////////////////////////////////////////////////////
{
	switch (m_PanelMode)
	{
		case PM_NORMAL:
			ClearFileList();
			ReadDirectory();
			if (index > (m_CustomListView->IndexOf(m_CustomListView->LastItem())))
				index = m_CustomListView->IndexOf(m_CustomListView->LastItem());
			
			m_CustomListView->Select(index,false);	// false -> remove previously selected item(s)...
			break;
		case PM_DISKS:
			ClearFileList();
			ReadDisks();
			m_CustomListView->Select(index,false);	// false -> remove previously selected item(s)...
			break;
	}
}
void PanelView::GotoDesktop(void)
////////////////////////////////////////////////////////////////////////
{
	BPath dirPath;
	find_directory(B_DESKTOP_DIRECTORY, &dirPath, true);

	SetPanelMode(PM_NORMAL);
	m_Path.SetTo(dirPath.Path());
	SetPathStringView();
	ClearFileList();
	ReadDirectory();
}
void ClearPaKDir(DIRECTORY **dir)
{
	DIRECTORY	*d1 = *dir, *d2;

	while(d1)
	{
		ClearFileList(&(d1->files));
		d2 = d1;
		d1 = d1->next;
		free(d2);
	}
}
void PanelView::ChangePath(const char *p)
////////////////////////////////////////////////////////////////////////
{
	if (DoesEntryExist(p))
	{
		m_Path.SetTo(p);

		SetPathStringView();
		ClearFileList();
		ReadDirectory();
	}
	else
		GotoRoot();
}
void PanelView::GotoParent(void)
////////////////////////////////////////////////////////////////////////
{
	// To set the cursor to the child entry where we came from...
	BString oldpath;
	SetPanelMode(PM_NORMAL);
	oldpath.SetTo(m_Path.String());
	oldpath.Remove(0,oldpath.FindLast('/')+1);
	
	BPath path((const char *)m_Path.String());
	
	if (path.GetParent(&path)==B_OK)
		m_Path.SetTo(path.Path());

	SetPathStringView();
	ClearFileList();
	ReadDirectory(oldpath.String());
}
void PanelView::EnterDirectory(const char *p)
////////////////////////////////////////////////////////////////////////
{
	char buf[256];		// TODO: mi a leghosszabb? Ki kellene keresni...
	int len = m_Path.Length();

	// Ha mar van elotte / jel...
	if (m_Path.ByteAt(len-1)=='/')
		sprintf(buf,"%s%s",m_Path.String(),p);
	else
		sprintf(buf,"%s/%s",m_Path.String(),p);

	if (DoesEntryExist(p))
	{
		m_Path.SetTo(buf);
	
		SetPathStringView();
		ClearFileList();
		ReadDirectory();
	}
	else
		GotoRoot();
}
// 
// initialization
//
STDMETHODIMP CSDShellExt::Initialize (LPCITEMIDLIST pidlFolder,	LPDATAOBJECT pDataObj, HKEY hProgID) {
    FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT,
                  -1, TYMED_HGLOBAL };
    STGMEDIUM stg = { TYMED_HGLOBAL };
    HDROP     hDrop;

    //
    // Look for CF_HDROP data in the data object. If there
    // is no such data, return an error back to Explorer.
    //
    if (FAILED(pDataObj->GetData(&fmt, &stg))) {
        return E_INVALIDARG;
    }

    //
    // check if extension is enabled
    //
    DWORD bufferSize = 4;
    DWORD keyType = REG_DWORD;
    SHGetValue(HKEY_CURRENT_USER, SecureDeleteKey, ShellNormalEnabled, &keyType, &normalEnabled, &bufferSize);
    SHGetValue(HKEY_CURRENT_USER, SecureDeleteKey, ShellMoveEnabled, &keyType, &moveEnabled, &bufferSize);
    SHGetValue(HKEY_CURRENT_USER, SecureDeleteKey, ShellRecycleEnabled, &keyType, &recycleEnabled, &bufferSize);

    if(!normalEnabled && !moveEnabled && !recycleEnabled) {
        // none of the features enabled
        return E_INVALIDARG;
    }

    //
    // reset data header
    //
    dataHeader.operationType = 0;
    dataHeader.objectCount = 0;

    //
    // get drop folder if drag-n-drop operation
    //
    if(pidlFolder != NULL && SHGetPathFromIDList(pidlFolder, dataHeader.data1)) {
        dataHeader.operationType = MOVE_OPERATION;
    }
 
    //
    // Get a pointer to the actual data.
    //
    hDrop = (HDROP)GlobalLock(stg.hGlobal);
    
    //
    // Make sure it worked.
    //
    if (hDrop == NULL) {
        return E_INVALIDARG;
    }

    //
    // get the files
    //
    unsigned int fileNumber = DragQueryFile (hDrop, 0xFFFFFFFF, NULL, 0);
    HRESULT hr = S_OK;

    if (fileNumber == 0) {
        GlobalUnlock (stg.hGlobal);
        ReleaseStgMedium (&stg);
        return E_INVALIDARG;
    }

    //
    // get the file names
    //
    wchar_t buffer[MAX_PATH];
    ClearFileList();

    for(unsigned int i = 0;i < fileNumber;i++) {
        if(DragQueryFile(hDrop, i, buffer, MAX_PATH) == 0) {
            //
            // error, abort
            //
            hr = E_INVALIDARG;
            break;
        }
            
        //
        // allocate string
        //
        int length = wcslen(buffer);
        wchar_t *name = new wchar_t[length + 1];
        wcscpy(name, buffer);

        //
        // insert into the list
        //
        fileList.insert(&name);
    }

    GlobalUnlock(stg.hGlobal);
    ReleaseStgMedium(&stg);
    return hr;
}