Exemple #1
0
DWORD CSubAction::GetData(DWORD nAction,BYTE* pData_,BOOL bHeader) const
{
	BYTE* pData=pData_;
	
	if (bHeader)
	{
		*((WORD*)pData)=0xFFEA;
		pData+=sizeof(WORD);
	}

	*((DWORD*)pData)=m_nSubAction;
	*((DWORD*)(pData+sizeof(DWORD)))=(DWORD)min(LONG_PTR(m_pExtraInfo),MAXDWORD);
	pData+=2*sizeof(DWORD);
	

	switch (nAction)
	{
	case CAction::ResultListItems:
		if (m_nResultList==Execute && m_szVerb!=NULL)
		{
			DWORD dwUsed=DWORD(istrlenw(m_szVerb)+1);
			MemCopyW((LPWSTR)pData,m_szVerb,dwUsed);
			pData+=dwUsed*2;
		}
		else if (m_nResultList==ExecuteCommand && m_szCommand!=NULL)
		{
			DWORD dwUsed=DWORD(istrlenw(m_szCommand)+1);
			MemCopyW((LPWSTR)pData,m_szCommand,dwUsed);
			pData+=dwUsed*2;
		}
		break;
	case CAction::Misc:
		if ((m_nMisc==SendMessage || m_nMisc==PostMessage) && 			
			m_pSendMessage!=NULL)
		{
			DWORD dwUsed=m_pSendMessage->GetData(pData);
			pData+=dwUsed;
		}
		else if (m_nMisc==ExecuteCommandMisc && m_szCommand!=NULL)
		{
			DWORD dwUsed=DWORD(istrlenw(m_szCommand)+1);
			MemCopyW((LPWSTR)pData,m_szCommand,dwUsed);
			pData+=dwUsed*2;
		}
		break;
	case CAction::Presets:
	case CAction::ChangeValue:
		if (m_szPreset!=NULL)
		{
			DWORD dwUsed=DWORD(istrlenw(m_szPreset)+1);
			MemCopyW((LPWSTR)pData,m_szPreset,dwUsed);
			pData+=dwUsed*2;
		}
		break;
	}

	return DWORD(pData-pData_);
}
HTREEITEM CTreeCtrl::FindItem(LPCWSTR pText,BOOL bBackwardDirection,BOOL bPartial,HTREEITEM hItem,HTREEITEM hEnd) const
{
	TV_ITEMW ti;
	WCHAR szBuffer[1000];
	ti.mask=TVIF_TEXT;
	ti.hItem=hItem;
	ti.pszText=szBuffer;
	ti.cchTextMax=1000;

	LPWSTR pTextMod;
	
	if (bPartial)
	{
		int iStrLen=istrlen(pText);
		pTextMod=new WCHAR[iStrLen+3];
		if (pText[0]!='*')
		{
			pTextMod[0]='*';
			MemCopyW(pTextMod+1,pText,iStrLen++);
		}
		else
			MemCopyW(pTextMod,pText,iStrLen);
		if (pTextMod[iStrLen-1]!='*')
			pTextMod[iStrLen++]='*';
		pTextMod[iStrLen]='\0';
		MakeLower(pTextMod);
	}
		
	while ((ti.hItem=bBackwardDirection?GetPrevItem(ti.hItem):GetNextItem(ti.hItem))!=NULL)
	{
		// Get next item
		if (ti.hItem==hEnd)
			return NULL;

		// Check text
		if (!GetItem(&ti))
			continue;

		

		if (bPartial)
		{
			MakeLower(szBuffer);
			if (ContainString(szBuffer,pTextMod))
			{
				delete[] pTextMod;
				return ti.hItem;
			}
		}
		else if (_wcsicmp(szBuffer,pText)==0)
			return ti.hItem;		
	}

	if (bPartial)
		delete[] pTextMod;
	return NULL;
}
Exemple #3
0
inline void CCheckFileNotificationsThread::FileCreated(LPCWSTR szFile,DWORD dwLength,CLocateDlg* pLocateDlg)
{
	//BkgDebugNumMessage("File created: %S",DWORD(szFile));

	if (pLocateDlg->m_pListCtrl==NULL)
		return;
	
	BOOL bIsDirectory=FileSystem::IsDirectory(szFile);

	WCHAR szPath[MAX_PATH];
	int nItem=pLocateDlg->m_pListCtrl->GetNextItem(-1,LVNI_ALL);
	while (nItem!=-1)
	{
		if (m_lFlags&fwStopWhenPossible)
			break;

		CLocatedItem* pItem=(CLocatedItem*)pLocateDlg->m_pListCtrl->GetItemData(nItem);
		if (pItem!=NULL)
		{
			if (pItem->GetPathLen()==dwLength)
			{
				if (pItem->IsDeleted())
				{
					MemCopyW(szPath,pItem->GetPath(),pItem->GetPathLen()+1);
					MakeLower(szPath);
					if (wcsncmp(szPath,szFile,dwLength)==0)
					{
						if (pItem->RemoveFlagsForChanged())
							pLocateDlg->m_pListCtrl->RedrawItems(nItem,nItem);
					}
				}
			}
			else if (bIsDirectory && pItem->GetPathLen()>dwLength)
			{
				if (pItem->IsDeleted() && pItem->GetPath()[dwLength]=='\\')
				{
					MemCopyW(szPath,pItem->GetPath(),dwLength);
					MakeLower(szPath,dwLength);
				
					// Can be subdiretory
					if (wcsncmp(szPath,szFile,dwLength)==0)
					{
						if (pItem->RemoveFlagsForChanged())
							pLocateDlg->m_pListCtrl->RedrawItems(nItem,nItem);
					}
				}
			}
		}
		nItem=pLocateDlg->m_pListCtrl->GetNextItem(nItem,LVNI_ALL);
	}

	//BkgDebugMessage("File created ENF");
}
Exemple #4
0
inline void CCheckFileNotificationsThread::FileModified(LPCWSTR szFile,DWORD dwLength,CLocateDlg* pLocateDlg)
{
	//BkgDebugNumMessage("File modified: %S",DWORD(szFile));

	if (pLocateDlg->m_pListCtrl==NULL)
		return;
	
	
	WCHAR szPath[MAX_PATH];
	int nItem=pLocateDlg->m_pListCtrl->GetNextItem(-1,LVNI_ALL);
	while (nItem!=-1)
	{
		if (m_lFlags&fwStopWhenPossible)
			break;

		CLocatedItem* pItem=(CLocatedItem*)pLocateDlg->m_pListCtrl->GetItemData(nItem);
		if (pItem!=NULL)
		{
			if (pItem->GetPathLen()==dwLength)
			{
				MemCopyW(szPath,pItem->GetPath(),pItem->GetPathLen()+1);
				MakeLower(szPath);
			    if (wcsncmp(szPath,szFile,dwLength)==0)
				{
					if (pItem->RemoveFlagsForChanged())
						pLocateDlg->m_pListCtrl->RedrawItems(nItem,nItem);
				}
			}
		}
		nItem=pLocateDlg->m_pListCtrl->GetNextItem(nItem,LVNI_ALL);
	}
	//BkgDebugMessage("File modified END");
}
Exemple #5
0
CAction::SendMessageInfo* CAction::SendMessageInfo::FromData(const BYTE* pData,DWORD dwDataLen,DWORD& dwUsed)
{
	if (dwDataLen<sizeof(WORD)+sizeof(DWORD)+sizeof(3))
		return NULL;
	
	if (*((WORD*)pData)!=0xFFEB)
		return NULL;

	SendMessageInfo* pSendMessage=new SendMessageInfo;
	
	// Set nMessage
	pSendMessage->nMessage=*((DWORD*)(pData+2));
	
	pData+=sizeof(DWORD)+sizeof(WORD);
	dwUsed=sizeof(DWORD)+sizeof(WORD);
	dwDataLen-=sizeof(DWORD)+sizeof(WORD);

	
	// Set szWindow
	DWORD dwLen;
	for (dwLen=0;dwLen*2<dwDataLen && ((WCHAR*)pData)[dwLen]!='\0';dwLen++);
	if (dwLen*2==dwDataLen)
	{
		delete pSendMessage;
		return NULL;
	}
	dwLen++;
	if (dwLen>1)
	{
		pSendMessage->szWindow=new WCHAR[dwLen];
		MemCopyW(pSendMessage->szWindow,(LPCWSTR)pData,dwLen);
	}
	else
		pSendMessage->szWindow=NULL;

	dwUsed+=dwLen*2;
	pData+=dwLen*2;
	dwDataLen-=dwLen*2;

	// Set szParam
	for (dwLen=0;dwLen*2<dwDataLen && ((WCHAR*)pData)[dwLen]!='\0';dwLen++);
	if (dwLen*2==dwDataLen)
	{
		delete pSendMessage;
		return NULL;
	}
	dwLen++;
	if (dwLen>1)
	{
		pSendMessage->szWParam=new WCHAR[dwLen];
		MemCopyW(pSendMessage->szWParam,(LPCWSTR)pData,dwLen);
	}
	else
		pSendMessage->szWParam=NULL;

	dwUsed+=dwLen*2;
	pData+=dwLen*2;
	dwDataLen-=dwLen*2;


	// Set szLParam
	for (dwLen=0;dwLen*2<dwDataLen && ((WCHAR*)pData)[dwLen]!='\0';dwLen++);
	if (dwLen*2==dwDataLen)
	{
		delete pSendMessage;
		return NULL;
	}
	dwLen++;
	if (dwLen>1)
	{
		pSendMessage->szLParam=new WCHAR[dwLen];
		MemCopyW(pSendMessage->szLParam,(LPCWSTR)pData,dwLen);
	}
	else
		pSendMessage->szLParam=NULL;

	dwUsed+=dwLen*2;
	pData+=dwLen*2;
	dwDataLen-=dwLen*2;


	return pSendMessage;
}
Exemple #6
0
DWORD CSubAction::FillFromData(DWORD nAction,const BYTE* pData,DWORD dwDataLen)
{
	if (dwDataLen<2*sizeof(DWORD))
		return 0;
	
	DWORD dwUsed=0;
		
	
	m_nSubAction=*((DWORD*)(pData));
	m_pExtraInfo=(void*)*((DWORD*)(pData+sizeof(DWORD)));

	pData+=2*sizeof(DWORD);
	dwUsed=2*sizeof(DWORD);
	dwDataLen-=2*sizeof(DWORD);

	switch (nAction)
	{
	case CAction::ResultListItems:
		if (m_nResultList==Execute && m_szVerb!=NULL)
		{
			DWORD dwLen;

			for (dwLen=0;dwLen<dwDataLen && ((LPCWSTR)pData)[dwLen]!='\0';dwLen++);

			if (dwLen==dwDataLen)
				return 0;

			dwLen++;
			m_szVerb=new WCHAR[dwLen];
            MemCopyW(m_szVerb,(LPCWSTR)pData,dwLen);
			dwUsed+=dwLen*2;
			pData+=dwLen*2;
			dwDataLen-=dwLen;
		}
		else if (m_nResultList==ExecuteCommand && m_szCommand!=NULL)
		{
			DWORD dwLen;

			for (dwLen=0;dwLen<dwDataLen && ((LPCWSTR)pData)[dwLen]!='\0';dwLen++);

			if (dwLen==dwDataLen)
				return 0;
			
			dwLen++;
			m_szCommand=new WCHAR[dwLen];
            MemCopyW(m_szCommand,(LPCWSTR)pData,dwLen);
			dwUsed+=dwLen*2;
			pData+=dwLen*2;
			dwDataLen-=dwLen;
		}
		break;
	case CAction::Misc:
		if ((m_nMisc==SendMessage || m_nMisc==PostMessage) && 			
			m_pSendMessage!=NULL)
		{
			DWORD dwLen;

			m_pSendMessage=SendMessageInfo::FromData(pData,dwDataLen,dwLen);

			if (m_pSendMessage==NULL)
				return 0;
			
			pData+=dwLen;
			dwUsed+=dwLen;
			dwDataLen-=dwLen;
		}
		else if (m_nMisc==ExecuteCommandMisc && m_szCommand!=NULL)
		{
			DWORD dwLen;

			for (dwLen=0;dwLen<dwDataLen && ((LPCWSTR)pData)[dwLen]!='\0';dwLen++);

			if (dwLen==dwDataLen)
				return 0;
			
			dwLen++;
			m_szCommand=new WCHAR[dwLen];
            MemCopyW(m_szCommand,(LPCWSTR)pData,dwLen);
			dwUsed+=dwLen*2;
			pData+=dwLen*2;
			dwDataLen-=dwLen;
		}
		break;
	case CAction::Presets:
	case CAction::ChangeValue:
		if (m_szPreset!=NULL)
		{
			DWORD dwLen;

			for (dwLen=0;dwLen<dwDataLen && ((LPCWSTR)pData)[dwLen]!='\0';dwLen++);

			if (dwLen==dwDataLen)
				return 0;
			
			dwLen++;
			m_szPreset=new WCHAR[dwLen];
            MemCopyW(m_szPreset,(LPCWSTR)pData,dwLen);
			dwUsed+=dwLen*2;
			pData+=dwLen*2;
			dwDataLen-=dwLen;
		}
		break;
	}
	return dwUsed;
}
Exemple #7
0
void CSubAction::DoChangeValue()
{
	CLocateDlg* pLocateDlg=GetLocateDlg();
	if (pLocateDlg==NULL || m_szValue==NULL)
		return;
	
	// Get handle to control
	CWnd Control(pLocateDlg->GetDlgItem(LOWORD(m_nControl)));
	HWND hInDialog=*pLocateDlg;

	if (Control.GetHandle()==NULL)
		Control.SetHandle(pLocateDlg->m_NameDlg.GetDlgItem(LOWORD(m_nControl)));
	if (Control.GetHandle()==NULL)
		Control.SetHandle(pLocateDlg->m_SizeDateDlg.GetDlgItem(LOWORD(m_nControl)));
	if (Control.GetHandle()==NULL)
		Control.SetHandle(pLocateDlg->m_AdvancedDlg.GetDlgItem(LOWORD(m_nControl)));

	ASSERT(Control.GetHandle()!=NULL);

	if (!Control.IsWindowEnabled())
		return;

	char szClass[100];
	GetClassName(Control,szClass,100);
	if (_stricmp(szClass,"EDIT")==0)
	{
		Control.SetWindowText(m_szValue);
		::SendMessage(Control.GetParent(),WM_COMMAND,MAKEWPARAM(m_nControl,EN_CHANGE),LPARAM((HWND)Control));
	}
	else if (_stricmp(szClass,"COMBOBOX")==0)
	{
		if ((Control.GetStyle()&CBS_DROPDOWNLIST)!=CBS_DROPDOWNLIST)
		{
			Control.SetWindowText(m_szValue);
			::SendMessage(Control.GetParent(),WM_COMMAND,MAKEWPARAM(m_nControl,CBN_EDITCHANGE),LPARAM((HWND)Control));
		}
		else
		{
			Control.SendMessage(CB_SETCURSEL,_wtoi(m_szValue));
			::SendMessage(Control.GetParent(),WM_COMMAND,MAKEWPARAM(m_nControl,CBN_SELCHANGE),LPARAM((HWND)Control));
		}
	}
	else if (_stricmp(szClass,"BUTTON")==0)
	{
		if (Control.GetStyle()&BS_CHECKBOX)  // This also takes radiobuttons
		{
			Control.SendMessage(BM_SETCHECK,_wtoi(m_szValue));
			::SendMessage(Control.GetParent(),WM_COMMAND,MAKEWPARAM(m_nControl,BN_CLICKED),LPARAM((HWND)Control));
		}
	}
	else if (_stricmp(szClass,"ComboBoxEx32")==0)
	{
		CComboBoxEx cb(Control);
		cb.SetCurSel(-1);
		cb.SetItemText(-1,m_szValue);
	}
	else if (_stricmp(szClass,"SysDateTimePick32")==0)
	{
		SYSTEMTIME st;
		GetLocalTime(&st);
		st.wHour=0;
		st.wMinute=0;
		st.wSecond=0;
		st.wMilliseconds=0;
		
		if (wcslen(m_szValue)>=8)
		{
			
		
			WCHAR szTemp[5];
			MemCopyW(szTemp,m_szValue,4);
			szTemp[4]='\0';
			st.wYear=(WORD)_wtol(szTemp);

			MemCopyW(szTemp,m_szValue+4,2);
			szTemp[2]='\0';
			st.wMonth=(WORD)_wtol(szTemp);

			MemCopyW(szTemp,m_szValue+6,2);
			szTemp[2]='\0';
			st.wDay=(WORD)_wtol(szTemp);

		}
		else
		{
			int nIndex=CTime::GetIndex(st.wDay,st.wMonth,st.wYear);
			if (m_szValue[0]='-')
				nIndex-=(WORD)_wtol(m_szValue+1);
			else 
				nIndex+=(WORD)_wtol(m_szValue);

			CTime::GetDayFromIndex(nIndex,st.wDay,st.wMonth,st.wYear);
		}
		Control.SendMessage(DTM_SETSYSTEMTIME,GDT_VALID,LPARAM(&st));
	}
}
INT IsDirectory(LPCWSTR szDirectoryName)
{
	

	HANDLE hFind;
	WIN32_FIND_DATAW fd;
	
	int ret=TRUE;
	
	if (szDirectoryName[0]==L'\0')
		return 0;
	
	if (szDirectoryName[1]==L'\0')
		return 0;
	
	if (szDirectoryName[2]==L'\0')
		return 0;
	
	if (szDirectoryName[1]==L':' && szDirectoryName[2]==L'\\' && szDirectoryName[3]==L'\0')
	{
		switch (GetDriveTypeW(szDirectoryName))
		{
		case DRIVE_UNKNOWN:
		case DRIVE_NO_ROOT_DIR:
			return 0;
		case DRIVE_FIXED:
			return 1;
		default:
			return 2;
		}
	}
	
	

	// Taking last '\\' 
	LPWSTR szPath;
	SIZE_T dwPathLen=istrlenw(szDirectoryName);
	if (szDirectoryName[dwPathLen-1]==L'\\' && dwPathLen>3)
	{
		szPath=new WCHAR[dwPathLen+5];
		--dwPathLen;
		MemCopyW(szPath,szDirectoryName,dwPathLen);
		szPath[dwPathLen]='\0';
	}
	else
		szPath=LPWSTR(szDirectoryName);

	

	hFind=FindFirstFileW(szPath,&fd);
	if (hFind!=INVALID_HANDLE_VALUE)
	{
		while (!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && ret)
			ret=FindNextFileW(hFind,&fd);
	
		if (szPath!=szDirectoryName)
			delete[] szPath;

		FindClose(hFind);	
		if (ret)
		{
			if (szDirectoryName[0]==L'\\')
			{
				if (szDirectoryName[1]==L'\\')
					return 2;
				switch (GetDriveType(NULL))
				{
				case DRIVE_UNKNOWN:
				case DRIVE_NO_ROOT_DIR:
					return 0;
				case DRIVE_FIXED:
					return 1;
				default:
					return 2;
				}
 
			}
			if (szDirectoryName[1]==L':' && szDirectoryName[2]==L'\\')
			{
				WCHAR szTemp[4]=L"X:\\";
				szTemp[0]=szDirectoryName[0];

				switch (GetDriveTypeW(szTemp))
				{
				case DRIVE_UNKNOWN:
					return 0;
				case DRIVE_FIXED:
					return 1;
				default:
					return 2;
				}
			}
		}
		return 0;
	}
	else if (szDirectoryName[0]==L'\\' && szDirectoryName[1]==L'\\')
	{
		
		// UNC share name
		if (szPath==szDirectoryName)
		{
			szPath=new WCHAR[dwPathLen+5];
			CopyMemory(szPath,szDirectoryName,dwPathLen*2);
		}		
		CopyMemory(szPath+dwPathLen,L"\\*.*",5*2);

		hFind=FindFirstFileW(szPath,&fd);
		delete[] szPath;
		if (hFind==INVALID_HANDLE_VALUE)
			return 0;
		// Is this really needed, e.g. \\pc\c$ does not have '.' in directory list
		//ret=1;
		//while ((fd.cFileName[0]!='.' || fd.cFileName[1]!='\0') && ret==1)
		//	ret=FindNextFile(hFind,&fd);
		FindClose(hFind);
		//return ret?2:0;
		return 2;
	}
	
	
	
	if (szPath!=szDirectoryName)
		delete[] szPath;
	return 0;
}
int vswprintfex( wchar_t *buffer, int buffersize, const wchar_t *format, va_list argList )
{
	int ptr=0;
	const wchar_t* in=format;
	LPWSTR end;

	int nNextArg=0,index,length;

    while (*in!='\0')
	{
		if (*in=='%')
		{
			in++;
			
			// Finding first non number
			for(index=0;in[index]>=L'0' && in[index]<=L'9';index++);

			// Now index points to nonnumberic character
			if (in[index]==L':')
			{
				// ok number was argument place
				if (index==0)
					return 0;
				nNextArg=_wtoi(in);
                
				// finding next '%'
				in+=index+1;
				for (length=0;in[length]!=L'\0' && in[length]!=L'%';length++);

				wchar_t* pTemp=new wchar_t[length+2];
				pTemp[0]=L'%';
				MemCopyW(pTemp+1,in,length);
				pTemp[length+1]=L'\0';
				HRESULT hRes=StringCbPrintfExW(buffer+ptr,(buffersize-ptr)*sizeof(wchar_t),&end,
					NULL,STRSAFE_IGNORE_NULLS,pTemp,va_getarg(argList,nNextArg));
				if (FAILED(hRes))
					return 0;
                ptr=int(end-buffer);
				delete[] pTemp;

				if (in[length]==L'\0')
					break;
				
				in+=length;
			}
			else
			{
				nNextArg++;
				for (;in[index]!=L'\0' && in[index]!=L'%';index++);
			

				wchar_t* pTemp=new wchar_t[index+2];
				pTemp[0]='%';
				MemCopyW(pTemp+1,in,index);
				pTemp[index+1]=L'\0';
				
                
				HRESULT hRes=StringCbPrintfExW(buffer+ptr,(buffersize-ptr)*sizeof(wchar_t),&end,
					NULL,STRSAFE_IGNORE_NULLS,pTemp,va_getarg(argList,nNextArg));
				if (FAILED(hRes))
					return 0;
                ptr=int(end-buffer);

				delete[] pTemp;
				
				if (in[index]==L'\0')
					break;
				
				in+=index;                
			}
		}
		else
			buffer[ptr++]=*(in++);
	}
	buffer[ptr]='\0';
	return ptr;
}
Exemple #10
0
BOOL CCheckFileNotificationsThread::RunningProcNew()
{
	FnDebugMessage("FN: RunningProcNew started");
	
	// Delete this when this functions ends
	CAutoPtr<CCheckFileNotificationsThread> thisPtr=this;

	// Creating handles
	if (!CreateHandlesNew())
		return FALSE;
	
	
	DWORD dwOut;

	for (;;)
	{
		FnDebugMessage("FN goes to sleep");
		InterlockedExchange(&m_lState,sWaiting);
		DWORD nRet=WaitForMultipleObjects(m_nHandles,m_pEventHandles,FALSE,INFINITE);
		InterlockedExchange(&m_lState,sProcessing);
		FnDebugMessage1("FN waked nRet=%X",nRet);


		if (nRet==WAIT_OBJECT_0) 
		{
			// First event signalled, this event is for stopping
			// So do nothing here and exit
			FnDebugMessage("FN stopping event signalled, exiting");
			break;
		}
		else if (nRet>WAIT_OBJECT_0 && nRet<WAIT_OBJECT_0+m_nHandles)
		{
			CLocateDlg* pLocateDlg=GetLocateDlg();
			
            // Locate dialog is also closed, stopping this process
			if (pLocateDlg==NULL)
				break;

			
			DIRCHANGEDATA* pChangeData=m_pDirDatas[nRet-WAIT_OBJECT_0];
			
			// Asking changes
			if (!pLocateDlg->IsLocating()) // if locating in process, do nothing
			{
				if (GetOverlappedResult(pChangeData->hDirHandle,&pChangeData->ol,&dwOut,FALSE))
				{
					// If GetOverlappedResults took so long that Stop() has given during this time
					// stop right now
					if (m_lFlags&fwStopWhenPossible)
						break;
					
					while (pLocateDlg->m_pBackgroundUpdater!=NULL &&
						!pLocateDlg->m_pBackgroundUpdater->m_lIsWaiting)
						Sleep(200);
					
					
					if (dwOut==0)
						UpdateItemsInRoot(pChangeData->pRoot,pLocateDlg);
					else
					{
						FILE_NOTIFY_INFORMATION* pStruct=(FILE_NOTIFY_INFORMATION*)pChangeData->pBuffer;
						while (1)
						{
							// Check stop state again
							if (m_lFlags&fwStopWhenPossible)
								break;

							DWORD dwLength=pStruct->FileNameLength/2;

							// Skip log files
							BOOL bSkipThisFile=FALSE;
							int nFilePart;
							for (nFilePart=dwLength-1;nFilePart>=0 && pStruct->FileName[nFilePart]!=L'\\';nFilePart--);
							nFilePart++;

							// Skipping ntuser.dat.log file
							if (dwLength-nFilePart==14)
							{
								if (_wcsnicmp(pStruct->FileName+nFilePart,L"ntuser.dat.log",14)==0)
									bSkipThisFile=TRUE;
							}

#ifdef _DEBUG
							// Skipping HFCDebug.log
							if (dwLength-nFilePart==12)
							{
								if (_wcsnicmp(pStruct->FileName+nFilePart,L"HFCDebug.log",12)==0)
									bSkipThisFile=TRUE;
							}
#endif

							if (!bSkipThisFile)
							{
								m_pFile=new WCHAR[pChangeData->dwRootLength+dwLength+2];
								MemCopyW(m_pFile,pChangeData->pRoot,pChangeData->dwRootLength);
								MemCopyW(m_pFile+pChangeData->dwRootLength,pStruct->FileName,dwLength);
								dwLength+=pChangeData->dwRootLength;
								m_pFile[dwLength]='\0';
								MakeLower(m_pFile);

								
								//DebugFormatMessage("BN: file=%S action=%d",m_pFile,pStruct->Action);

								switch(pStruct->Action)
								{
								case FILE_ACTION_ADDED:
								case FILE_ACTION_RENAMED_NEW_NAME:
									FileCreated(m_pFile,dwLength,pLocateDlg);
									break;
								case FILE_ACTION_REMOVED:
								case FILE_ACTION_RENAMED_OLD_NAME:
									FileDeleted(m_pFile,dwLength,pLocateDlg);
									break;
								case FILE_ACTION_MODIFIED:
									FileModified(m_pFile,dwLength,pLocateDlg);
									break;
								}
								
								delete[] m_pFile;
								m_pFile=NULL;
							}

							if (pStruct->NextEntryOffset==0)
								break;
							*((char**)&pStruct)+=pStruct->NextEntryOffset;

							
						}		
					}
				}
			}
			
			// Check this again 
			if (m_lFlags&fwStopWhenPossible)
				break;

			
			// Coing to listen changes
			FnDebugMessage("FN: going to listen changes");
			BOOL bRet=m_pReadDirectoryChangesW(pChangeData->hDirHandle,pChangeData->pBuffer,CHANGE_BUFFER_LEN,TRUE,
				FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|
				FILE_NOTIFY_CHANGE_ATTRIBUTES|FILE_NOTIFY_CHANGE_SIZE|FILE_NOTIFY_CHANGE_LAST_WRITE|
				FILE_NOTIFY_CHANGE_CREATION|FILE_NOTIFY_CHANGE_SECURITY,
				&dwOut,&pChangeData->ol,NULL);
			FnDebugMessage("FN: m_pReadDirectoryChangesW returned");
			

			if (!bRet)
			{
				// ReadDirectoryChangesW failed, reset event manually
				FnDebugMessage("FN: ReadDirectoryChangesW failed");
				ResetEvent(pChangeData->ol.hEvent);
			}


			// Finally, before going to sleep, check that shell we continue
			if (m_lFlags&fwStopWhenPossible)
				break;

		}
	}


	InterlockedExchange(&m_lState,sStopping);

	FnDebugMessage("FN RunningProcNew ends");
	return FALSE;
}
Exemple #11
0
HRESULT ShellFunctions::CreateShortcut(LPCWSTR pszShortcutFile,LPCWSTR pszLink,LPCWSTR pszDesc,LPCWSTR pszParams)
{
	HRESULT hres;
	
	if (IsUnicodeSystem())
	{
		IShellLinkW* psl;
		hres=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLinkW,(void**)&psl);
		if (SUCCEEDED(hres))
		{
			IPersistFile* ppf;
			hres=psl->QueryInterface(IID_IPersistFile,(void**)&ppf);
			if (SUCCEEDED(hres))
			{
				hres=psl->SetPath(pszLink);
				if (SUCCEEDED(hres))
				{
					
					int nIndex=LastCharIndex(pszLink,L'\\');
					if (nIndex>=0)
					{
						WCHAR szWDir[MAX_PATH];
						MemCopyW(szWDir,pszLink,nIndex);
						szWDir[nIndex]='\0';
						psl->SetWorkingDirectory(szWDir);
					}
										
					if (pszDesc!=NULL)
						psl->SetDescription(pszDesc);
					if (pszParams!=NULL)
						psl->SetArguments(pszParams);
					
					hres=ppf->Save(pszShortcutFile,TRUE);    
				}
				ppf->Release(); 
			}
			psl->Release();
		}
	}
	else
	{
		IShellLink* psl;
		hres=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl);
		if (SUCCEEDED(hres))
		{
			IPersistFile* ppf;
			hres=psl->QueryInterface(IID_IPersistFile,(void**)&ppf);
			if (SUCCEEDED(hres))
			{
				hres=psl->SetPath(W2A(pszLink));
				if (SUCCEEDED(hres))
				{
					LONG_PTR nIndex=LastCharIndex(pszLink,L'\\');
					if (nIndex>=0)
					{
						char szWDir[MAX_PATH];
						WideCharToMultiByte(CP_ACP,0,pszLink,(int)nIndex,szWDir,MAX_PATH,0,0);
						szWDir[nIndex]='\0';
						psl->SetWorkingDirectory(szWDir);
					}

					if (pszDesc!=NULL)
						psl->SetDescription(W2A(pszDesc));
					if (pszParams!=NULL)
						psl->SetArguments(W2A(pszParams));

					hres=ppf->Save(pszShortcutFile,TRUE);    
				}
				ppf->Release(); 
			}
			psl->Release();
		}
	}
	return hres;
}
Exemple #12
0
LPWSTR GetDefaultFileLocation(LPCWSTR szFileName,BOOL bMustExists,DWORD* lpdwSize)
{
	int nFileNameLen=istrlen(szFileName);
	
	// Check first that is there 
	PFNSHGETFOLDERPATH pGetFolderPath=(PFNSHGETFOLDERPATH)GetProcAddress(GetModuleHandle("shell32.dll"),"SHGetFolderPathW");
	if (pGetFolderPath!=NULL)
	{
		WCHAR szAppDataPath[MAX_PATH];
		if (SUCCEEDED(pGetFolderPath(NULL,CSIDL_APPDATA,NULL,
			SHGFP_TYPE_CURRENT,szAppDataPath)))
		{
			int nPathLen=istrlen(szAppDataPath);

			// Insert \\ if already not there
			if (szAppDataPath[nPathLen-1]!=L'\\')
				szAppDataPath[nPathLen++]=L'\\';
			
			// Buffer for default path
			LPWSTR pStr=new WCHAR[nPathLen+9+nFileNameLen+1];
			MemCopyW(pStr,szAppDataPath,nPathLen);
			MemCopyW(pStr+nPathLen,L"Locate32",9);
			nPathLen+=8;

			// Now pStr contains X:\UsersFolder\AppPath\Locate32

			// Check whether directory exists
			if (FileSystem::IsDirectory(pStr))
			{
				// Directory does exist
				// Copy file name part at tail 
				pStr[nPathLen++]='\\';
				MemCopyW(pStr+nPathLen,szFileName,nFileNameLen+1);
				if (lpdwSize!=NULL)
					*lpdwSize=nPathLen+nFileNameLen;
				
				if (!bMustExists)
					return pStr;	

				// Checking file
				if (FileSystem::IsFile(pStr))
					return pStr;
			}
			else
			{
				// Create directory if does not already exists 
				// and bMustExists is not set (this function is called
				// for default databases with bMustExists=FALSE)
				if (!bMustExists)
				{
					FileSystem::CreateDirectory(pStr);
					// Copy file name part at tail 
					pStr[nPathLen++]='\\';
					MemCopyW(pStr+nPathLen,szFileName,nFileNameLen+1);
					if (lpdwSize!=NULL)
						*lpdwSize=nPathLen+nFileNameLen;
					
					return pStr;
				}	
			
			}
				

			delete[] pStr;
		}
	}

	// Check also Locate32's directory, maybe there is that file
	int iLen;
	LPWSTR pStr;
	WCHAR szExeName[MAX_PATH];
	FileSystem::GetModuleFileName(NULL,szExeName,MAX_PATH);
	iLen=LastCharIndex(szExeName,L'\\')+1;
	pStr=new WCHAR[iLen+nFileNameLen+1];
	MemCopyW(pStr,szExeName,iLen);
	
	MemCopyW(pStr+iLen,szFileName,nFileNameLen+1);
	if (lpdwSize!=NULL)
		*lpdwSize=iLen+nFileNameLen;

	if (!bMustExists)
		return pStr;	

	if (FileSystem::IsFile(pStr))
		return pStr;

	// Return NULL
	delete[] pStr;
	return NULL;
}