#include "stdafx.h"

PWumf new_wumf( DWORD dwID, 
				LPTSTR szUser, 
				LPTSTR szPath, 
				LPTSTR szComp, 
				LPTSTR szUNC, 
				DWORD dwSess, 
				DWORD dwPerm, 
				DWORD dwAttr)
{
	PWumf w = (PWumf)mir_calloc(sizeof(Wumf));
	if (!w)
		return nullptr;

	w->szUser = mir_wstrdup(szUser);
	w->szPath = mir_wstrdup(szPath);
	w->szComp = mir_wstrdup(szComp);
	w->szUNC  = mir_wstrdup(szUNC);

	switch(dwPerm) {
		case PERM_FILE_READ: mir_wstrcpy(w->szPerm, L"Read");break;
		case PERM_FILE_WRITE: mir_wstrcpy(w->szPerm, L"Write");break;
		case PERM_FILE_CREATE: mir_wstrcpy(w->szPerm, L"Create");break;
		default: mir_wstrcpy(w->szPerm, L"Execute");
	}
	mir_snwprintf(w->szID, L"%i", dwID);

	w->dwID = dwID;
	w->dwSess = dwSess;
	w->dwAttr = dwAttr;
	w->dwPerm = dwPerm;
	w->mark = FALSE;
	w->next = nullptr;
	return w;	
}

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

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

BOOL del_cell(PWumf *l, PWumf w)
{
	if (!l || !*l || !w)return FALSE;
	PWumf 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 = 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 = nullptr;

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

PWumf fnd_cell(PWumf *l, DWORD dwID)
{
	if (!l || !*l)return nullptr;
	PWumf w = *l;
	while(w && w->dwID != dwID) w = w->next;
	return w;
}

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

		w = p;
	}
	*l = nullptr;
	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 = *l;
	while(w) {
		w->mark = mark;
		w = w->next;
	}
}