123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- #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;
- }
|