aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/General/gen_ml/sendto.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/General/gen_ml/sendto.cpp')
-rw-r--r--Src/Plugins/General/gen_ml/sendto.cpp305
1 files changed, 305 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ml/sendto.cpp b/Src/Plugins/General/gen_ml/sendto.cpp
new file mode 100644
index 00000000..8efeb012
--- /dev/null
+++ b/Src/Plugins/General/gen_ml/sendto.cpp
@@ -0,0 +1,305 @@
+#include "main.h"
+#include <windowsx.h>
+#include "resource.h"
+#include "config.h"
+#include "sendto.h"
+#include "api__gen_ml.h"
+#include "../nu/AutoWideFn.h"
+#include "../Winamp/strutil.h"
+
+SendToMenu::SendToMenu()
+{
+ activePlaylist=0;
+ m_addtolibrary=0;
+ _hm=0;
+ branch=0;
+ branch_pos=0;
+ _pos=0;
+ _len=0;
+ _start=0;
+ m_start=0;
+ m_len=0;
+ plugin_start=0;
+ plugin_len=0;
+}
+
+SendToMenu::~SendToMenu()
+{
+}
+
+void SendToMenu::onAddItem(mlAddToSendToStruct *ptr)
+{
+ if (--_len < 0)
+ return;
+
+ MENUITEMINFOA mii= {sizeof(MENUITEMINFOA),};
+
+ if (ptr->desc && *ptr->desc == '-')
+ {
+ // cannot insert a seperator at the top
+ if (_pos <= 2) return;
+ mii.fMask = MIIM_TYPE;
+ mii.fType = MFT_SEPARATOR;
+ }
+ else
+ {
+ mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_DATA | MIIM_STATE;
+ mii.fType = MFT_STRING;
+ if (ptr->desc && *ptr->desc == '#')
+ {
+ mii.fState = MFS_GRAYED;
+ mii.dwTypeData = ptr->desc+1;
+ }
+ else
+ {
+ mii.fState = MFS_ENABLED;
+ mii.dwTypeData = ptr->desc;
+ }
+ mii.wID = _start++;
+ mii.dwItemData = ptr->user32;
+ mii.cch = (UINT)strlen(mii.dwTypeData);
+ }
+ InsertMenuItemA(_hm,_pos++,TRUE,&mii);
+}
+
+void SendToMenu::onAddItem(mlAddToSendToStructW *ptr)
+{
+ if (--_len < 0)
+ return;
+
+ MENUITEMINFOW mii= {sizeof(MENUITEMINFOW),};
+
+ if (ptr->desc && *ptr->desc == L'-')
+ {
+ // cannot insert a seperator at the top
+ if (_pos <= 2) return;
+ mii.fMask = MIIM_TYPE;
+ mii.fType = MFT_SEPARATOR;
+ }
+ else
+ {
+ mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_DATA | MIIM_STATE;
+ mii.fType = MFT_STRING;
+ if (ptr->desc && *ptr->desc == L'#')
+ {
+ mii.fState = MFS_GRAYED;
+ mii.dwTypeData = ptr->desc+1;
+ }
+ else
+ {
+ mii.fState = MFS_ENABLED;
+ mii.dwTypeData = ptr->desc;
+ }
+ mii.wID = _start++;
+ mii.dwItemData = ptr->user32;
+ mii.cch = (UINT)wcslen(mii.dwTypeData);
+ }
+ InsertMenuItemW(_hm,_pos++,TRUE,&mii);
+}
+
+void SendToMenu::addItemToBranch(mlAddToSendToStructW *ptr)
+{
+ if (!branch)
+ return;
+
+ if (--_len < 0)
+ return;
+
+ MENUITEMINFOW mii= {sizeof(MENUITEMINFOW),};
+
+ if (ptr->desc && *ptr->desc == L'-')
+ {
+ // cannot insert a seperator at the top
+ if (_pos <= 2) return;
+ mii.fMask = MIIM_TYPE;
+ mii.fType = MFT_SEPARATOR;
+ }
+ else
+ {
+ mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_DATA | MIIM_STATE;
+ mii.fType = MFT_STRING;
+ if (ptr->desc && *ptr->desc == L'#')
+ {
+ mii.fState = MFS_GRAYED;
+ mii.dwTypeData = ptr->desc+1;
+ }
+ else
+ {
+ mii.fState = MFS_ENABLED;
+ mii.dwTypeData = ptr->desc;
+ }
+ mii.wID = _start++;
+ mii.dwItemData = ptr->user32;
+ mii.cch = (UINT)wcslen(mii.dwTypeData);
+ }
+ InsertMenuItemW(branch,branch_pos++,TRUE,&mii);
+}
+
+void SendToMenu::startBranch()
+{
+ branch=CreateMenu();
+ branch_pos=0;
+}
+
+void SendToMenu::endBranch(const wchar_t *name)
+{
+ MENUITEMINFOW mii=
+ {
+ sizeof(MENUITEMINFOW),
+ MIIM_TYPE|MIIM_DATA|MIIM_SUBMENU,
+ MFT_STRING,
+ MFS_ENABLED,
+ 0,
+ branch,
+ NULL,
+ NULL,
+ 0,
+ (LPWSTR)name,
+ };
+ mii.cch= (UINT)wcslen(mii.dwTypeData);
+ InsertMenuItemW(_hm,_pos++,TRUE,&mii);
+ branch=0;
+}
+
+void SendToMenu::buildmenu(HMENU hMenu, int type, int simple, int true_type, int start, int len)
+{
+ _start=start;
+ _len=len;
+ _hm=hMenu;
+ _pos=0;
+ m_start=_start;
+ plugin_start=0;
+
+ while (DeleteMenu(hMenu,0,MF_BYPOSITION));
+
+ if (type == ML_TYPE_ITEMRECORDLIST || type == ML_TYPE_FILENAMES ||
+ type == ML_TYPE_ITEMRECORDLISTW || type == ML_TYPE_FILENAMESW ||
+ type == ML_TYPE_STREAMNAMES || type == ML_TYPE_CDTRACKS)
+ {
+ activePlaylist=_start++; _len--;
+
+ // hardcode playlists :)
+ MENUITEMINFOW mii=
+ {
+ sizeof(MENUITEMINFO),
+ MIIM_TYPE|MIIM_ID,
+ MFT_STRING,
+ MFS_ENABLED,
+ (UINT)activePlaylist,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ };
+
+ if(simple == FALSE)
+ {
+ mii.dwTypeData = WASABI_API_LNGSTRINGW(IDS_ENQUEUE_IN_WINAMP);
+ mii.cch = (UINT)wcslen(mii.dwTypeData);
+ InsertMenuItemW(hMenu,_pos++,TRUE,&mii);
+
+ mii.fType = MFT_SEPARATOR;
+ mii.wID=0;
+ InsertMenuItemW(hMenu,_pos++,TRUE,&mii);
+ }
+ }
+
+ plugin_start=_start;
+ plugin_SendMessage(ML_MSG_ONSENDTOBUILD,type,reinterpret_cast<INT_PTR>(this),(true_type-1));
+ plugin_len=_start - plugin_start;
+ m_len=_start-m_start;
+}
+
+int SendToMenu::isourcmd(int id)
+{
+ return id >= m_start && id < m_start+m_len;
+}
+
+void TAG_FMT_EXT(const wchar_t *filename, void *f, void *ff, void *p, wchar_t *out, int out_len, int extended);
+wchar_t *itemrecordTagFunc(wchar_t *tag, void * p);
+wchar_t *itemrecordWTagFunc(wchar_t *tag, void * p);
+void fieldTagFuncFree(wchar_t * tag, void * p);
+
+int SendToMenu::handlecmd(HWND hwndParent, int id, int type, void *data)
+{
+ if (!isourcmd(id))
+ return 0;
+
+ if (plugin_start && id >= plugin_start && id < plugin_start+plugin_len)
+ {
+ MENUITEMINFO i={sizeof(i),MIIM_DATA,};
+ GetMenuItemInfo(_hm,id,FALSE,&i);
+ return (INT)plugin_SendMessage(ML_MSG_ONSENDTOSELECT,type,reinterpret_cast<INT_PTR>(data),i.dwItemData);
+ }
+ else if (activePlaylist && id == activePlaylist)
+ {
+ if (type == ML_TYPE_FILENAMES || type == ML_TYPE_STREAMNAMES)
+ {
+ char *ptr=(char*)data;
+
+ while (ptr && *ptr)
+ {
+ COPYDATASTRUCT cds;
+ cds.dwData = IPC_PLAYFILE;
+ cds.lpData = (void *) ptr;
+ cds.cbData = (DWORD)strlen((char *)cds.lpData)+1; // include space for null char
+ SendMessage(plugin.hwndParent,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
+ ptr+=strlen(ptr)+1;
+ }
+ return 1;
+ }
+ else if (type == ML_TYPE_FILENAMESW || type == ML_TYPE_STREAMNAMESW)
+ {
+ wchar_t *ptr=(wchar_t*)data;
+
+ while (ptr && *ptr)
+ {
+ COPYDATASTRUCT cds;
+ cds.dwData = IPC_PLAYFILEW;
+ cds.lpData = (void *) ptr;
+ cds.cbData = (DWORD)sizeof(wchar_t) * wcslen((wchar_t *)cds.lpData) + sizeof(wchar_t); // include space for null char
+ SendMessage(plugin.hwndParent,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
+ ptr+=wcslen(ptr)+1;
+ }
+ return 1;
+ }
+ else if (type == ML_TYPE_ITEMRECORDLIST)
+ {
+ wchar_t title[FILETITLE_SIZE] = {0};
+
+ itemRecordList *obj = (itemRecordList *)data;
+ for (int i=0;i < obj->Size;i++)
+ {
+ AutoWideFn wfn( obj->Items[ i ].filename );
+
+ TAG_FMT_EXT(wfn, itemrecordTagFunc, fieldTagFuncFree, (void*)&obj->Items[i], title, FILETITLE_SIZE, 1);
+
+ enqueueFileWithMetaStructW enqueueFile;
+ enqueueFile.filename = wfn;
+ enqueueFile.title = title;
+ enqueueFile.ext = NULL;
+ enqueueFile.length = obj->Items[i].length;
+ SendMessage(plugin.hwndParent, WM_WA_IPC, (WPARAM)&enqueueFile, IPC_PLAYFILEW);
+ }
+ return 1;
+ }
+ else if (type == ML_TYPE_ITEMRECORDLISTW)
+ {
+ wchar_t title[FILETITLE_SIZE] = {0};
+
+ itemRecordListW *obj = (itemRecordListW *)data;
+ for (int i=0;i < obj->Size;i++)
+ {
+ TAG_FMT_EXT(obj->Items[i].filename, itemrecordWTagFunc, fieldTagFuncFree, (void*)&obj->Items[i], title, FILETITLE_SIZE, 1);
+ enqueueFileWithMetaStructW enqueueFile;
+ enqueueFile.filename = obj->Items[i].filename;
+ enqueueFile.title = title;
+ enqueueFile.ext = NULL;
+ enqueueFile.length = obj->Items[i].length;
+ SendMessage(plugin.hwndParent, WM_WA_IPC, (WPARAM)&enqueueFile, IPC_PLAYFILEW);
+ }
+ return 1;
+ }
+ }
+ return 0;
+} \ No newline at end of file