Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/rarfilesource.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOV2 <overfiend@sessionclan.de>2008-12-13 22:41:06 +0300
committerOctaneSnail <os@v12pwr.com>2008-12-14 12:40:29 +0300
commiteec02175a222f21d09e0f58891835e7ac9b28c71 (patch)
tree87cd446de26b7dce8d0f48574d029f8ccec86f1c /RFS.cpp
parent82e5a3271ae675ddfd4f9153b3e19e8c0f911097 (diff)
Implement automatic media file detection.
Signed-off-by: OctaneSnail <os@v12pwr.com>
Diffstat (limited to 'RFS.cpp')
-rw-r--r--RFS.cpp87
1 files changed, 61 insertions, 26 deletions
diff --git a/RFS.cpp b/RFS.cpp
index cad52fa..3f03c4e 100644
--- a/RFS.cpp
+++ b/RFS.cpp
@@ -24,6 +24,7 @@
#include "RAR.h"
#include "Anchor.h"
#include "resource.h"
+#include "Mediatype.h"
// {9FFE11D2-29F2-463f-AD5F-C04A5EE2E58D}
@@ -251,6 +252,9 @@ int CRARFileSource::ScanArchive (wchar_t *archive_name, List<File> *file_list, i
*ok_files_found = 0;
LARGE_INTEGER zero = {0};
+ MediaType *mType;
+ List<MediaType> mediaTypeList;
+
Anchor<File> af (&file);
ArrayAnchor<wchar_t> acrf (&current_rar_filename);
@@ -276,6 +280,9 @@ int CRARFileSource::ScanArchive (wchar_t *archive_name, List<File> *file_list, i
}
Anchor<HANDLE> ha(&hFile);
+ if(getMediaTypeList(&mediaTypeList)==-1)
+ return FALSE; // this means out of memory
+
// Scan through archive volume(s)
while (true)
{
@@ -466,32 +473,6 @@ int CRARFileSource::ScanArchive (wchar_t *archive_name, List<File> *file_list, i
DbgLog ((LOG_TRACE, 2, L"Compressed files are not supported."));
file->unsupported = true;
}
-
- char *ext = strrchr (rh.fh.filename, '.');
-
- if (ext)
- {
- ext ++;
- int i;
-
- for (i = 0; s_file_types [i].extension; i ++)
- {
- if (!_stricmp (ext, s_file_types [i].extension))
- break;
- }
-
- if (s_file_types [i].extension)
- {
- file->media_type.SetSubtype (s_file_types [i].guid);
- file->type_known = true;
- if (!file->unsupported)
- (*ok_files_found) ++;
- }
- else
- DbgLog ((LOG_TRACE, 2, L"Unknown file extension."));
- }
- else
- DbgLog ((LOG_TRACE, 2, L"No file extension."));
}
if (!file->unsupported)
@@ -561,6 +542,60 @@ int CRARFileSource::ScanArchive (wchar_t *archive_name, List<File> *file_list, i
}
}
+ if(!file->unsupported)
+ {
+ if(!checkFileForMediaType(file,&mediaTypeList,&mType))
+ return FALSE; // this means out of memory
+
+ if(mType)
+ {
+#ifdef _DEBUG
+ LPOLESTR majorType,subType;
+ StringFromCLSID(mType->majorType,&majorType);
+ StringFromCLSID(mType->subType,&subType);
+ DbgLog ((LOG_TRACE, 2, L"Filetype detection determined:\nMajor type: %s\nSubtype: %s",majorType,subType));
+ CoTaskMemFree(majorType);
+ CoTaskMemFree(subType);
+#endif
+ file->media_type.SetType(&mType->majorType);
+ file->media_type.SetSubtype(&mType->subType);
+ file->type_known = true;
+ (*ok_files_found)++;
+ }
+ }
+
+ //TODO: should we fall back to extensions if automatic detection does not work ?
+ /*
+ if(!file->type_known)
+ {
+ char *ext = strrchr (file->filename, '.');
+
+ if (ext)
+ {
+ ext ++;
+ int i;
+
+ for (i = 0; s_file_types [i].extension; i ++)
+ {
+ if (!_stricmp (ext, s_file_types [i].extension))
+ break;
+ }
+
+ if (s_file_types [i].extension)
+ {
+ file->media_type.SetSubtype (s_file_types [i].guid);
+ file->type_known = true;
+ if (!file->unsupported)
+ (*ok_files_found) ++;
+ }
+ else
+ DbgLog ((LOG_TRACE, 2, L"Unknown file extension."));
+ }
+ else
+ DbgLog ((LOG_TRACE, 2, L"No file extension."));
+ }*/
+
+
if (filename != file->filename)
delete filename;