123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- #include "api.h"
- #include "main.h"
- #include "images.h"
- #include "SongListDownloader.h"
- #include "../../..\Components\wac_network\wac_network_http_receiver_api.h"
- #include <api/service/waServiceFactory.h>
- #include <strsafe.h>
- WifiXML::WifiXML(obj_xml *parser) : parser(parser)
- {
- wifi_track = 0;
- wifi_playlist = 0;
- parser->xmlreader_registerCallback(L"items", this);
- parser->xmlreader_registerCallback(L"items\fdevice", &info_xml);
- parser->xmlreader_registerCallback(L"items\fspace", &info_xml);
- parser->xmlreader_registerCallback(L"items\fitem", this);
- parser->xmlreader_registerCallback(L"items\fplaylist", this);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem", this);
- parser->xmlreader_registerCallback(L"items\fitem\fartist", &artist);
- parser->xmlreader_registerCallback(L"items\fitem\falbum", &album);
- parser->xmlreader_registerCallback(L"items\fitem\fcomposer", &composer);
- parser->xmlreader_registerCallback(L"items\fitem\fduration", &duration);
- parser->xmlreader_registerCallback(L"items\fitem\ftrack", &track);
- parser->xmlreader_registerCallback(L"items\fitem\fyear", &year);
- parser->xmlreader_registerCallback(L"items\fitem\fsize", &size);
- parser->xmlreader_registerCallback(L"items\fitem\ftitle", &title);
- parser->xmlreader_registerCallback(L"items\fitem\fmime", &mime_type);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\fartist", &artist);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\falbum", &album);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\fcomposer", &composer);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\fduration", &duration);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\ftrack", &track);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\fyear", &year);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\fsize", &size);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\ftitle", &title);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\fmime", &mime_type);
- parser->xmlreader_registerCallback(L"items\fplaylist\fitem\fmodified", &modified);
- }
- WifiXML::~WifiXML()
- {
- parser->xmlreader_unregisterCallback(this);
- parser->xmlreader_unregisterCallback(&info_xml);
- parser->xmlreader_unregisterCallback(&artist);
- parser->xmlreader_unregisterCallback(&album);
- parser->xmlreader_unregisterCallback(&composer);
- parser->xmlreader_unregisterCallback(&duration);
- parser->xmlreader_unregisterCallback(&track);
- parser->xmlreader_unregisterCallback(&year);
- parser->xmlreader_unregisterCallback(&size);
- parser->xmlreader_unregisterCallback(&title);
- parser->xmlreader_unregisterCallback(&mime_type);
- parser->xmlreader_unregisterCallback(&modified);
- }
- void WifiXML::xmlReaderOnStartElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
- {
- if (!wcscmp(xmltag, L"item"))
- {
- const wchar_t *value = params->getItemValue(L"id");
- if (value)
- {
- wifi_track = new WifiTrack;
- wifi_track->id = _wcsdup(value);
- }
- }
- else if (!wcscmp(xmltag, L"playlist"))
- {
- const wchar_t *value = params->getItemValue(L"id");
- const wchar_t *name = params->getItemValue(L"name");
- if (value && name)
- {
- wifi_playlist = new WifiPlaylist;
- wifi_playlist->id = _wcsdup(value);
- wifi_playlist->name = _wcsdup(name);
- }
- }
- }
- void WifiXML::xmlReaderOnEndElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag)
- {
- if (!wcscmp(xmltag, L"item") && wifi_track)
- {
- wifi_track->artist = _wcsdup(artist.GetString()); artist.Reset();
- wifi_track->album = _wcsdup(album.GetString()); album.Reset();
- wifi_track->composer = _wcsdup(composer.GetString()); composer.Reset();
- wifi_track->duration = _wtoi(duration.GetString()); duration.Reset();
- wifi_track->track = _wtoi(track.GetString()); track.Reset();
- wifi_track->year = _wtoi(year.GetString()); year.Reset();
- wifi_track->size = _wtoi(size.GetString()); size.Reset();
- wifi_track->title = _wcsdup(title.GetString()); title.Reset();
- wifi_track->mime_type = _wcsdup(mime_type.GetString()); mime_type.Reset();
- wifi_track->last_updated = _wtoi64(modified.GetString()); modified.Reset();
- if (wifi_playlist)
- wifi_playlist->tracks.push_back(wifi_track);
- else
- tracks.push_back(wifi_track);
- wifi_track=0;
- }
- else if (!wcscmp(xmltag, L"playlist") && wifi_playlist)
- {
- playlists.push_back(wifi_playlist);
- wifi_playlist = 0;
- }
- }
- /* ------------------------------------------------------------------------------------------------------------ */
- SongListDownloader::SongListDownloader(const char *root_url, WifiDevice *wifi_device) : root_url(root_url), wifi_device(wifi_device)
- {
- device=0;
- wifi_device->AddRef();
- waServiceFactory *parserFactory = plugin.service->service_getServiceByGuid(obj_xmlGUID);
- if (parserFactory)
- parser = (obj_xml *)parserFactory->getInterface();
- parser->xmlreader_setCaseSensitive();
- wifi = new WifiXML(parser);
- parser->xmlreader_open();
- }
- SongListDownloader::~SongListDownloader()
- {
- waServiceFactory *parserFactory = plugin.service->service_getServiceByGuid(obj_xmlGUID);
- if (parserFactory)
- {
- delete wifi;
- parser->xmlreader_close();
- parserFactory->releaseInterface(parser);
- }
- }
- void SongListDownloader::OnInit(DownloadToken token)
- {
- api_httpreceiver *jnet = WAC_API_DOWNLOADMANAGER->GetReceiver(token);
- if (jnet)
- {
- jnet->AddHeaderValue("X-Winamp-ID", winamp_id_str);
- jnet->AddHeaderValue("X-Winamp-Name", winamp_name);
- }
- }
- void SongListDownloader::OnData(DownloadToken token, void *data, size_t datalen)
- {
- if (parser->xmlreader_feed(data, datalen) != OBJ_XML_SUCCESS)
- {
- WAC_API_DOWNLOADMANAGER->CancelDownload(token);
- }
- }
- void SongListDownloader::OnCancel(DownloadToken token)
- {
- wifi_device->OnConnectionFailed();
- wifi_device->Release();
- this->Release();
- }
- void SongListDownloader::OnError(DownloadToken token, int error)
- {
- wifi_device->OnConnectionFailed();
- wifi_device->Release();
- this->Release();
- }
- void SongListDownloader::OnFinish(DownloadToken token)
- {
- parser->xmlreader_feed(0, 0);
- device = new TemplateDevice(wifi_device, root_url, &wifi->info_xml.device_info, &wifi->tracks, &wifi->playlists);
- wifi_device->OnConnected(device);
- wifi_device->Release();
- PostMessage(plugin.hwndPortablesParent,WM_PMP_IPC,(intptr_t)device,PMP_IPC_DEVICECONNECTED);
- this->Release();
- }
|