📄 fileconnect.c
字号:
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 + -