#include "wumf.h"

PWumf new_wumf( DWORD dwID, 
				LPTSTR szUser, 
				LPTSTR szPath, 
				LPTSTR szComp, 
				LPTSTR szUNC, 
				DWORD dwSess, 
				DWORD dwPerm, 
				DWORD dwAttr)
{
	//TCHAR szID[10];

	PWumf w = (PWumf)malloc(sizeof(Wumf));
	if(!w)return NULL;
	
	//#define SCPY(X) if(X){w->X = (LPTSTR)malloc(1+_tcslen(X));if(!w->X)return NULL;_tcscpy(w->X, X);} else { w->X = NULL;}
	//#define SCPYW(X) if(X){w->X = (LPTSTR)malloc(1+lstrlenW((LPWSTR)X));if(!w->X)return NULL;wsprintfA(w->X, "%S", X);} else { w->X = NULL;}

    //#define SCCPY(X, Y) w->X = (LPSTR)malloc(1+strlen(Y));if(!w->X)return NULL;strcpy(w->X, Y)

	_tcscpy(w->szUser, szUser);
	_tcscpy(w->szPath, szPath);
	_tcscpy(w->szComp, szComp);
	_tcscpy(w->szUNC, szUNC);

	switch(dwPerm)
	{
	case PERM_FILE_READ: _tcscpy(w->szPerm, _T("Read"));break;
		case PERM_FILE_WRITE: _tcscpy(w->szPerm, _T("Write"));break;
		case PERM_FILE_CREATE: _tcscpy(w->szPerm, _T("Create"));break;
		default: _tcscpy(w->szPerm, _T("Execute"));//w->szPerm = NULL;
	};
	wsprintf(w->szID, _T("%i"), dwID);
	//_tcscpy(w->szID, szID);
	//SCPY(szID);

	//#undef SCPY
	w->dwID = dwID;
	w->dwSess = dwSess;
	w->dwAttr = dwAttr;
	w->dwPerm = dwPerm;
	w->mark = FALSE;
	w->next = NULL;
	return w;	
}

BOOL del_wumf(PWumf w)
{
	if(!w) return FALSE;
	free(w->szUser);
	free(w->szPath);
	free(w->szComp);
	free(w->szUNC);
	free(w->szID);
	free(w->szPerm);
	free(w);
	return TRUE;
}

BOOL  add_cell(PWumf* l, PWumf w)
{
    PWumf p;
	if(!w || !l)return FALSE;
	if(!(*l))
	{
		*l = w;
	}
	else
	{
		p = *l;
		while(p->next) p = p->next;
		p->next = w;
	}
	w->next = NULL;
	return TRUE;
}

BOOL  del_cell(PWumf *l, PWumf w)
{
	PWumf p;
	if(!l || !*l || !w)return FALSE;
	p = *l;
	if(w == *l)
		*l = p->next;
	else
	{
		while(p && p->next != w) p = p->next;
		if(!p) return FALSE;
		p->next = w->next;
	}
	return del_wumf(w);
	
};

BOOL  cpy_cell(PWumf *l, PWumf w)
{
	PWumf w1;
	w1 = new_wumf(w->dwID, w->szUser, w->szPath, w->szComp,w->szUNC, w->dwSess, w->dwPerm, w->dwAttr);
	if(!w1) return FALSE;
	w1->mark = w->mark;
	return add_cell(l, w1);
};

PWumf cpy_list(PWumf *l)
{
	PWumf w, p = NULL;

	if(!l || !*l) return NULL;
	w = *l;
	while(w) 
	{
		if(!cpy_cell(&p, w))return NULL;
		w = w->next;
	}
	return p;
}

PWumf fnd_cell(PWumf *l, DWORD dwID)
{
	PWumf w;
	if(!l || !*l)return NULL;
	w = *l;
	while(w && w->dwID != dwID) w = w->next;
	return w;
}
	
BOOL del_all(PWumf *l)
{
	PWumf w, p;
	if(!l || !*l) return FALSE;
	w = *l;
	while(w)
	{
		p = w->next;
		if(!del_cell(l, w)) 
		{	
			return FALSE;
		}
		w = p;
	}
	*l = NULL;
	
	return TRUE;
}

BOOL del_marked(PWumf *l)
{
	PWumf w, p;
	if(!l)return FALSE;
	w = *l;
	while(w)
	{
		p = w->next;
		if(w->mark)
		{
			if(!del_cell(l, w)) return FALSE;
		};
		w = p;
	}
	return TRUE;
}

void mark_all(PWumf *l, BOOL mark)
{
	PWumf w;
	w = *l;
	while(w)
	{
		w->mark = mark;
		w = w->next;
	}
}