Milán Major

netscape-revival

1 branch
Code

lib/libnet/tests/xpfile.c

/*
#include "memory.h"
#include "net.h"
#include "structs.h"
#include "ctxtfunc.h"
*/

#include "xp_core.h"
#include "xp_file.h"
#include "xp_mcom.h"

#ifdef XP_WIN
int XP_FileRemove(const char * name, XP_FileType type)
{
   return(_unlink(XP_FileName(name, type)));
}
#endif

/* UNIX needs this!  CCM */
int XP_RemoveDirectory(const char *name, XP_FileType type)
{
   return(rmdir(XP_FileName(name, type)));
}

#ifdef XP_WIN
int XP_FileRename(const char *old, XP_FileType type1, const char *new, XP_FileType type2)
{
	return(rename(XP_FileName(old, type1), XP_FileName(new, type2)));
}

int XP_MakeDirectory(const char *name, XP_FileType type)
{
#ifdef XP_UNIX
    /* Need permissions for mkdir. Owner read/write/execute. 
       Group and other read/execute.  CCM */
    return(mkdir(XP_FileName(name, type), 0755));
#else
    return(mkdir(XP_FileName(name, type)));
#endif
}

char *XP_FileName(const char *name, XP_FileType type)
{
	if(type == xpURL)
	  {
	  	static char *new_name = 0;
	  	char *bar, *cp;
	  				 
		if(new_name)
			XP_FREE(new_name);

        /*  XP_FileName has to gurantee extra byte for an XP_Stat trick
         */
	  	new_name = XP_ALLOC(XP_STRLEN(name) + 2);
        XP_STRCPY(new_name, name);
				 
		if(!new_name)            
			return((char *)name);  /* Const problem. CCM */

		if(*name == '/')
		  {
		  	XP_MEMCPY(new_name, name+1, XP_STRLEN(name));
		  }

		bar = XP_STRCHR(new_name, '|');
		if(bar)
		  *bar = ':';

		/* convert all backslashes to slash */
		for(cp=new_name; *cp; cp++)
			if(*cp == '\\')
				*cp = '/';

	   	return(new_name);
	  }

	return(char*)name;
}

XP_File XP_FileOpen(const char* name, XP_FileType type, 
        const XP_FilePerm permissions)
{
	char *new_name = XP_FileName(name, type);
    return fopen(new_name, permissions);
}


PUBLIC XP_Dir XP_OpenDir(const char * name, XP_FileType type)
{
    XP_Dir dir;
    char * filename = XP_FileName(name, type);
    /* CString foo; */
    char *foo, *bar;

    if(!filename)
        return NULL;

    dir = (XP_Dir)malloc(sizeof(DIR));        // (XP_Dir) new DIR;

    /* 
     * For directory names we need \*.* at the end, if and only if 
     * there is an actual name specified.
     */

    /* foo += filename; */
    foo = strdup(filename);
    if(filename[strlen(filename) - 1] != '\\')
    {
        bar = (char*)malloc(strlen(foo) + 2);
        strcpy(bar, foo);
        strcat(bar, "\\");
        foo = bar;
        /* foo += '\\'; */
    }

    bar = (char*)malloc(strlen(foo) + 4);
    strcpy(bar, foo);
    strcat(bar, "*.*");
    foo = bar;
    /* foo += "*.*"; */
                                 
    dir->directoryPtr = FindFirstFile((const char *) foo, &(dir->data));

    if(dir->directoryPtr == INVALID_HANDLE_VALUE) {
        free(dir);      /* delete dir; */
        return(NULL);
    } else {
        return(dir);
    }
}

PUBLIC XP_DirEntryStruct * XP_ReadDir(XP_Dir dir)
{                                         
    static XP_DirEntryStruct dirEntry;

    if(dir && dir->directoryPtr) {
        strcpy(dirEntry.d_name, dir->data.cFileName);
        if(FindNextFile(dir->directoryPtr, &(dir->data)) == FALSE) {
            FindClose(dir->directoryPtr);
            dir->directoryPtr = NULL;
        }
        return(&dirEntry);
    } else {
        return(NULL);
    }
}

PUBLIC void XP_CloseDir(XP_Dir dir)
{
    free(dir);  /* delete dir; */
}

PUBLIC int XP_Stat(const char * name, XP_StatStruct * info, XP_FileType type)
{
    char * filename = XP_FileName(name, type);
    int res;
    int len;

    if(!info || !filename)
        return(-1);

    /* 
     * Strip off final slash on directory names 
     * BUT we will need to make sure we have c:\ NOT c:   
     */

    len = strlen(filename);

    if (        (len == 2) &&
                (filename[1] == ':') )
    {
        /*  XP_FileName has to gurantee extra byte for this trick
         */
        filename[2] = '/';
        filename[3] = '\0';
    }
    else if (   (len > 2) &&
                (filename[len - 2] != ':') &&
                (filename[len - 1] == '/') )
        filename[len - 1] = '\0';

    res = _stat(filename, info);

    return(res);
}

char * XP_TempName(XP_FileType type, const char * prefix)
{
    char *path;
    char *name;
    unsigned int size = GetTempPath(0, 0);
    path = (char*)malloc(size + 1);  /* new char[size + 1]; */
    GetTempPath(size, path);
    name = (char*)malloc(size + 1);  /* new char[size + 20]; */
    GetTempFileName(path, "nsm", 0, name);
    return name;
}
#endif