00001 #ifndef __DROP_FILES__
00002 #define __DROP_FILES__
00003
00004 #if WIN32NATIVE
00005 #include <Shlobj.h>
00006 #elif defined LINUX
00007 #include "GToken.h"
00008 #elif defined MAC
00009 #include "INet.h"
00010 #endif
00011 #include "GVariant.h"
00012
00013 class GDropFiles : public GArray<char*>
00014 {
00015 public:
00016 GDropFiles(GVariant &v)
00017 {
00018 #if WIN32NATIVE
00019 DROPFILES *Df = v.IsBinary() AND v.Value.Binary.Length >= sizeof(DROPFILES) ? (DROPFILES*)v.Value.Binary.Data : 0;
00020 if (Df)
00021 {
00022 void *FilesPtr = ((char*)Df) + Df->pFiles;
00023 if (Df->fWide)
00024 {
00025 char16 *f = (char16*)FilesPtr;
00026 while (*f)
00027 {
00028 char *Utf8 = LgiNewUtf16To8(f);
00029 if (Utf8) Add(Utf8);
00030 f += StrlenW(f) + 1;
00031 }
00032 }
00033 else
00034 {
00035 char *f = (char*)FilesPtr;
00036 while (*f)
00037 {
00038 Add((char*)LgiNewConvertCp("utf-8", f, LgiAnsiToLgiCp()));
00039 f += strlen(f) + 1;
00040 }
00041 }
00042 }
00043 #elif defined LINUX
00044 if (v.IsBinary())
00045 {
00046 GToken Uri( (char*)v.Value.Binary.Data,
00047 "\r\n,",
00048 true,
00049 v.Value.Binary.Length);
00050
00051 for (int i=0; i<Uri.Length(); i++)
00052 {
00053 char *File = Uri[i];
00054
00055
00056 if (strnicmp(File, "file:", 5) == 0) File += 5;
00057
00058
00059 char *i = File, *o = File;
00060 while (*i)
00061 {
00062 if (*i == '%')
00063 {
00064 char h[3] = { i[1], i[2], 0 };
00065 *o++ = htoi(h);
00066 i += 3;
00067 }
00068 else
00069 {
00070 *o++ = *i++;
00071 }
00072 }
00073 *o++ = 0;
00074
00075
00076 if (FileExists(File))
00077 {
00078 Add(NewStr(File));
00079 }
00080 }
00081 }
00082 else printf("GDropFiles: Type not binary.\n");
00083 #elif defined MAC
00084 char *s = v.Str();
00085 if (s)
00086 {
00087 GUri u(s);
00088 if (u.Protocol AND
00089 stricmp(u.Protocol, "file") == 0 AND
00090 u.Host AND
00091 stricmp(u.Host, "localhost") == 0)
00092 {
00093 Add(NewStr(u.Path));
00094 }
00095 }
00096 #endif
00097 }
00098
00099 ~GDropFiles()
00100 {
00101 DeleteArrays();
00102 }
00103 };
00104
00105 #endif