⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileconnect.c

📁 java 1.1 gemini 08_16
💻 C
📖 第 1 页 / 共 3 页
字号:
    nameLen = KNI_GetArrayLength(oldfilename) * 2;
    
    pszOldUCS2Filename = (kal_wchar*)midpMalloc(nameLen+2);
    if (pszOldUCS2Filename == NULL) {
        KNI_ThrowNew("java/lang/OutOfMemoryError", "rename");
    } else {
        KNI_GetRawArrayRegion(oldfilename, 0, nameLen, (jbyte*)pszOldUCS2Filename);
        pszOldUCS2Filename[nameLen >> 1] = 0;
        nameLen = KNI_GetArrayLength(newfilename) * 2;
        pszNewUCS2Filename = (kal_wchar*)midpMalloc(nameLen+2);
        if (pszNewUCS2Filename == NULL) {
            KNI_ThrowNew("java/lang/OutOfMemoryError", "rename");
            midpFree(pszOldUCS2Filename);
        } else {
            KNI_GetRawArrayRegion(newfilename, 0, nameLen, (jbyte*)pszNewUCS2Filename);
            pszNewUCS2Filename[nameLen >> 1] = 0;
            if(FS_Rename(pszOldUCS2Filename, pszNewUCS2Filename) != FS_NO_ERROR)
                KNI_ThrowNew("java/io/IOException", "Rename failed.");
            midpFree(pszOldUCS2Filename);
            midpFree(pszNewUCS2Filename);
        }
    }
    KNI_EndHandles();
    KNI_ReturnVoid();
}

KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_deleteFile(void){
    kal_wchar* pszUCS2Filename;
    int   nameLen;

    KNI_StartHandles(1);
    KNI_DeclareHandle(filename);

    KNI_GetParameterAsObject(1, filename);

    nameLen = KNI_GetArrayLength(filename) * 2;
    
    pszUCS2Filename = (kal_wchar*)midpMalloc(nameLen+2);
    if (pszUCS2Filename == NULL) {
        KNI_ThrowNew("java/lang/OutOfMemoryError", "delete File");
    } else {
        KNI_GetRawArrayRegion(filename, 0, nameLen, (jbyte*)pszUCS2Filename);
        pszUCS2Filename[nameLen >> 1] = 0;
        if(FS_Delete(pszUCS2Filename) != FS_NO_ERROR)
            KNI_ThrowNew("java/io/IOException", "File removal failed.");
        midpFree(pszUCS2Filename);
    }
    KNI_EndHandles();
    KNI_ReturnVoid();
}

KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_deleteDir(void){
    kal_wchar* pszUCS2Filename;
    int   nameLen;

    KNI_StartHandles(1);
    KNI_DeclareHandle(filename);

    KNI_GetParameterAsObject(1, filename);

    nameLen = KNI_GetArrayLength(filename) * 2;
    
    pszUCS2Filename = (kal_wchar*)midpMalloc(nameLen+2);
    if (pszUCS2Filename == NULL) {
        KNI_ThrowNew("java/lang/OutOfMemoryError", "delete Dir");
    } else {
        KNI_GetRawArrayRegion(filename, 0, nameLen, (jbyte*)pszUCS2Filename);
        pszUCS2Filename[nameLen >> 1] = 0;
        if(FS_RemoveDir(pszUCS2Filename) != FS_NO_ERROR)
            KNI_ThrowNew("java/io/IOException", "Directory removal failed.");
        midpFree(pszUCS2Filename);
    }
    KNI_EndHandles();
    KNI_ReturnVoid();
}

KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_createDir(void){
    kal_wchar* pszUCS2Filename;
    int   nameLen;

    KNI_StartHandles(1);
    KNI_DeclareHandle(filename);

    KNI_GetParameterAsObject(1, filename);

    nameLen = KNI_GetArrayLength(filename) * 2;
    
    pszUCS2Filename = (kal_wchar*)midpMalloc(nameLen+2);
    if (pszUCS2Filename == NULL) {
        KNI_ThrowNew("java/lang/OutOfMemoryError", "create dir");
    } else {
        KNI_GetRawArrayRegion(filename, 0, nameLen, (jbyte*)pszUCS2Filename);
        pszUCS2Filename[nameLen >> 1] = 0;
        if(FS_CreateDir(pszUCS2Filename) != FS_NO_ERROR)
            KNI_ThrowNew("java/io/IOException", "Directory exists or operation not allowed.");
        midpFree(pszUCS2Filename);
    }
    KNI_EndHandles();
    KNI_ReturnVoid();
}

KNIEXPORT KNI_RETURNTYPE_INT
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_FindFirstFile(void){
    kal_wchar* pszUCS2Filename;
    kal_wchar* pszResultUCS2Filename;
    SHORTARRAY resultArray;
    jboolean includeHidden = KNI_GetParameterAsBoolean(3);
    int   nameLen;
    int   returnHandle = -1;
    KNI_StartHandles(2);
    KNI_DeclareHandle(thisObject);
    KNI_DeclareHandle(filename);

    KNI_GetThisPointer(thisObject);
    KNI_GetParameterAsObject(1, filename);
    KNI_GetParameterAsObject(2, (jobject)&resultArray);
    pszResultUCS2Filename = (kal_wchar*) resultArray->sdata;

    nameLen = KNI_GetArrayLength(filename) * 2;
    
    pszUCS2Filename = (kal_wchar*)midpMalloc(nameLen+2);
    if (pszUCS2Filename == NULL) {
        KNI_ThrowNew("java/lang/OutOfMemoryError", "FindFirstFile");
    } else {
        FS_DOSDirEntry fileInfo;
        unsigned char excludedattr;
        KNI_GetRawArrayRegion(filename, 0, nameLen, (jbyte*)pszUCS2Filename);

        pszUCS2Filename[nameLen >> 1] = 0;
        
        if(includeHidden){
            excludedattr = 0;
        }else{
            excludedattr = FS_ATTR_HIDDEN;
        }
        returnHandle = FS_FindFirst(pszUCS2Filename, 0, excludedattr, &fileInfo, pszResultUCS2Filename, 
                                    resultArray->length);
        if(returnHandle == FS_NO_MORE_FILES){
            pszResultUCS2Filename[0] = 0;
            FS_FindClose(returnHandle);
        }else{
        	if(FS_CountUsedFH(FS_FH_COUNT_CURRENT_TASK) >= handle_count){
        		FS_FindClose(returnHandle);
				KNI_ThrowNew("java/io/IOException", "Find first file failed. File handler not enough.");
        	}
            if(returnHandle < 0){
                KNI_ThrowNew("java/io/IOException", "Find first file failed.");
            }else if(FS_CountUsedFH(FS_FH_COUNT_CURRENT_TASK) < handle_count){
				resouceRegistering(JAVA_SYS_FILE_DEVICE, returnHandle, NULL, NULL, &RSFindNextClose);
	
	            KNI_registerCleanup(thisObject, findNextCleanup);
	
	            if(fileInfo.Attributes & FS_ATTR_DIR){
	                nameLen = kal_wstrlen(pszResultUCS2Filename);
	                pszResultUCS2Filename[nameLen] = '/';
	                pszResultUCS2Filename[nameLen + 1] = 0;
	            }
        	}
        }
        midpFree(pszUCS2Filename);
    }
    KNI_EndHandles();
    KNI_ReturnInt(returnHandle);
}

KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_FindNextFile(void){
    kal_wchar* pszResultUCS2Filename;
    SHORTARRAY resultArray;
    /*jboolean includeHidden = KNI_GetParameterAsBoolean(3); not used */
    int   handle = KNI_GetParameterAsInt(1);
    FS_DOSDirEntry fileInfo;
    int   nameLen;
    int   returnCode;

    KNI_StartHandles(1);

    KNI_GetParameterAsObject(2, (jobject)&resultArray);
    pszResultUCS2Filename = (kal_wchar*) resultArray->sdata;

    returnCode = FS_FindNext(handle, &fileInfo, pszResultUCS2Filename, resultArray->length);
    if(returnCode != FS_NO_ERROR){
        if(returnCode == FS_NO_MORE_FILES){
            pszResultUCS2Filename[0] = 0;
			resouceDereg(JAVA_SYS_FILE_DEVICE, handle);
            FS_FindClose(handle) ;
        }else{
			resouceDereg(JAVA_SYS_FILE_DEVICE, handle);
            returnCode = FS_FindClose(handle) ;
            KNI_ThrowNew("java/io/IOException", "Find next file failed.");
        }
    }else if(fileInfo.Attributes & FS_ATTR_DIR){
        nameLen = kal_wstrlen(pszResultUCS2Filename);
        pszResultUCS2Filename[nameLen] = '/';
        pszResultUCS2Filename[nameLen + 1] = 0;
    }

    KNI_EndHandles();
    KNI_ReturnVoid();
}


const kal_wchar dir_dot1[] = {'.', 0};
const kal_wchar dir_dot2[] = {'.', '.', 0};
const kal_wchar dir_dot3[] = {'.', '\\', 0};
const kal_wchar dir_dot4[] = {'.', '.', '\\', 0};

int get_folder_recursive(kal_wchar* pszUCS2Filename, kal_wchar* temp_buffer, int temp_name_len,
                         int recursive_level){
    int handle;
    int returnSize = 0;
    int nameLen = kal_wstrlen(pszUCS2Filename);
    FS_DOSDirEntry fileInfo;
    if(pszUCS2Filename[nameLen - 1] != '\\'){
        pszUCS2Filename[nameLen] = '\\';
        pszUCS2Filename[nameLen + 1] = '*';
        pszUCS2Filename[nameLen + 2] = 0;
    }else{
        pszUCS2Filename[nameLen] = '*';
        pszUCS2Filename[nameLen + 1] = 0;
    }

    /* the file handler may be used out when recursive level > 10 */
    if(recursive_level > 10)
        return 0;
    recursive_level ++;

    handle = FS_FindFirst(pszUCS2Filename, 0, 0, &fileInfo, temp_buffer, temp_name_len);
    if(handle < 0){
        if(handle != FS_NO_MORE_FILES)
            KNI_ThrowNew("java/io/IOException", "getFolderSize FS_FindFirst error.");
    }else{
        int returnCode;
        if(fileInfo.Attributes & FS_ATTR_DIR){
            if(kal_wstrcmp(dir_dot1, temp_buffer) != 0 && kal_wstrcmp(dir_dot2, temp_buffer) != 0 &&
               kal_wstrcmp(dir_dot3, temp_buffer) != 0 && kal_wstrcmp(dir_dot4, temp_buffer) != 0){
                kal_wchar temp_file_name[MAX_WCHAR_FILENAME_LEN];
                pszUCS2Filename[nameLen] = 0;
                kal_wstrcpy(temp_file_name, pszUCS2Filename);
                kal_wstrcat(temp_file_name, temp_buffer);
                returnSize += get_folder_recursive(temp_file_name, temp_buffer, temp_name_len, recursive_level);
            }
        }else
            returnSize += fileInfo.FileSize;

        returnCode = FS_FindNext(handle, &fileInfo, temp_buffer, temp_name_len); 
        while(returnCode == FS_NO_ERROR){
            if(fileInfo.Attributes & FS_ATTR_DIR){
                if(kal_wstrcmp(dir_dot1, temp_buffer) != 0 && kal_wstrcmp(dir_dot2, temp_buffer) != 0 &&
                   kal_wstrcmp(dir_dot3, temp_buffer) != 0 && kal_wstrcmp(dir_dot4, temp_buffer) != 0){
                    kal_wchar temp_file_name[MAX_WCHAR_FILENAME_LEN];
                    pszUCS2Filename[nameLen] = 0;
                    kal_wstrcpy(temp_file_name, pszUCS2Filename);
                    kal_wstrcat(temp_file_name, temp_buffer);
                    returnSize += get_folder_recursive(temp_file_name, temp_buffer, temp_name_len, recursive_level);
                }
            }else
                returnSize += fileInfo.FileSize;
            returnCode = FS_FindNext(handle, &fileInfo, temp_buffer, temp_name_len); 
        }
        if(returnCode != FS_NO_MORE_FILES){
            KNI_ThrowNew("java/io/IOException", "Find next file failed.");
        }
        FS_FindClose(handle);
    }
    return returnSize;
}

KNIEXPORT KNI_RETURNTYPE_INT
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_getFolderSize(void){
    kal_wchar* pszUCS2Filename;
    int   nameLen;
    int   returnSize = 0;
    BOOL   includeSubDirs = KNI_GetParameterAsBoolean(2);

    KNI_StartHandles(1);
    KNI_DeclareHandle(filename);

    KNI_GetParameterAsObject(1, filename);

    nameLen = KNI_GetArrayLength(filename) * 2;
    
    pszUCS2Filename = (kal_wchar*)midpMalloc(nameLen+4);
    if (pszUCS2Filename == NULL) {
        KNI_ThrowNew("java/lang/OutOfMemoryError", "get folder size");
    } else {
        KNI_GetRawArrayRegion(filename, 0, nameLen, (jbyte*)pszUCS2Filename);
        pszUCS2Filename[nameLen >> 1] = 0;

        if(includeSubDirs == TRUE){
            kal_wchar temp_file_name[MAX_WCHAR_FILENAME_LEN];
            returnSize = get_folder_recursive(pszUCS2Filename, temp_file_name, MAX_WCHAR_FILENAME_LEN, 0);
        }else{
            kal_wchar dummy[8]; /* file name is not important to get size */
            int handle;
            FS_DOSDirEntry fileInfo;
            pszUCS2Filename[nameLen >> 1] = '*';
            pszUCS2Filename[(nameLen >> 1) + 1] = 0;

            handle = FS_FindFirst(pszUCS2Filename, 0, FS_ATTR_DIR, &fileInfo, dummy, 8);
            if(handle < 0){
                if(handle != FS_NO_MORE_FILES)
                    KNI_ThrowNew("java/io/IOException", "getFolderSize FS_FindFirst error.");
            }else{
                int returnCode = FS_FindNext(handle, &fileInfo, dummy, 8); 
                returnSize += fileInfo.FileSize;
                while(returnCode == FS_NO_ERROR){
                    returnSize += fileInfo.FileSize;
                    returnCode = FS_FindNext(handle, &fileInfo, dummy, 8); 
                }
                if(returnCode != FS_NO_MORE_FILES){
                    KNI_ThrowNew("java/io/IOException", "Find next file failed.");
                }
                FS_FindClose(handle);
            }
        }
        
        midpFree(pszUCS2Filename);
    }
    KNI_EndHandles();
    KNI_ReturnInt(returnSize);
}

KNIEXPORT KNI_RETURNTYPE_BOOLEAN
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_existsImpl(void){
    kal_wchar* pszUCS2Filename;
    int   nameLen;
    int   returnValue = 0;

    KNI_StartHandles(1);
    KNI_DeclareHandle(filename);

    KNI_GetParameterAsObject(1, filename);

    nameLen = KNI_GetArrayLength(filename) * 2;
    
    pszUCS2Filename = (kal_wchar*)midpMalloc(nameLen+2);
    if (pszUCS2Filename == NULL) {
        KNI_ThrowNew("java/lang/OutOfMemoryError", "delete Dir");
    } else {
        int temp_handle;
        KNI_GetRawArrayRegion(filename, 0, nameLen, (jbyte*)pszUCS2Filename);
        pszUCS2Filename[nameLen >> 1] = 0;
        temp_handle = FS_Open(pszUCS2Filename, O_BINARY | FS_OPEN_DIR | O_RDONLY);
        if(temp_handle >= 0){
            returnValue = 1;
            FS_Close(temp_handle);
        }

        midpFree(pszUCS2Filename);
    }
    KNI_EndHandles();
    KNI_ReturnBoolean(returnValue);
}

/* Dennis Shih */
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_getAliasDriveCount(void) {
	kal_int32 count=0;
	
	KNI_StartHandles(1);
	count = ALIAS_DRIVE_COUNT;

	KNI_EndHandles();
	KNI_ReturnInt(count);
}

/* Dennis Shih */
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_getRootDeviceList(void)
{
	int returnValue = 0;
	int i;
	//int temp_id = FS_GetDrive(FS_DRIVE_I_SYSTEM, 1, FS_NO_ALT_DRIVE);

	for(i = 24; i >= 0; i--) {
		returnValue <<= 1;
		if(disk_info[i].is_mounted == KAL_TRUE) {
			returnValue |= 1;
		}
	}
	KNI_ReturnInt(returnValue);
}

/* Dennis Shih */
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_getAliasDriveType(void) {
	kal_int32 index = 0;
	kal_int32 drivetype = 0;
	
	KNI_StartHandles(1);
	index = KNI_GetParameterAsInt(1);
	drivetype = getAliasDriveType(index);
	KNI_EndHandles();
	KNI_ReturnInt(drivetype);
}

/* Dennis Shih */
KNIEXPORT KNI_RETURNTYPE_OBJECT
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_getAliasDrive(void) {
	kal_char* name = NULL;
	kal_int32 index = 0;
	
	KNI_StartHandles(1);
	KNI_DeclareHandle(str);
	index = KNI_GetParameterAsInt(1);
	name = getAliasDrive(index);
	KNI_NewStringUTF(name, str);
	KNI_EndHandlesAndReturnObject(str);
}

/* Dennis Shih */
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_mtk_midp_io_j2me_fileconnection_Protocol_getRealDriveN(void) {
	kal_int32 type = 0;
	kal_int32 realDrive = 0;
	
	KNI_StartHandles(1);
	type = KNI_GetParameterAsInt(1);
	realDrive = getRealDrive(type);
	KNI_EndHandles();
	KNI_ReturnInt(realDrive);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -