00001
00002
00003
00004
00005 #include "stdafx.h"
00006 #include "vmsFlashHelper.h"
00007 #include <mflash.h>
00008 #include <mflash.c>
00009 #include <mshtml.h>
00010
00011 _COM_SMARTPTR_TYPEDEF(IShockwaveFlash, __uuidof(IShockwaveFlash));
00012
00013 #ifdef _DEBUG
00014 #undef THIS_FILE
00015 static char THIS_FILE[]=__FILE__;
00016 #define new DEBUG_NEW
00017 #endif
00018
00019 vmsFlashHelper::vmsFlashHelper()
00020 {
00021
00022 }
00023
00024 vmsFlashHelper::~vmsFlashHelper()
00025 {
00026
00027 }
00028
00029 void vmsFlashHelper::DisableFlashMovies(IHTMLDocument2Ptr spDoc, BOOL bIncludingFrames)
00030 {
00031 FLASHLIST vf;
00032 GetFlashMoviesObjList (spDoc, &vf, bIncludingFrames);
00033
00034 for (int i = 0; i < vf.size (); i++)
00035 {
00036
00037
00038 IHTMLElementPtr spElem (vf [i]);
00039 if (spElem)
00040 {
00041 IHTMLStylePtr spStyle;
00042 HRESULT hr = spElem->get_style (&spStyle);
00043 if (SUCCEEDED (hr) && spStyle != NULL)
00044 {
00045 spStyle->put_visibility (L"hidden");
00046 spStyle->put_pixelHeight (0);
00047 spStyle->put_pixelWidth (0);
00048 }
00049 }
00050 }
00051 }
00052
00053 void vmsFlashHelper::SaveFlashMovies_noframes(IHTMLDocument2Ptr spDoc, LPCSTR pszFolder)
00054 {
00055 USES_CONVERSION;
00056
00057 if (spDoc == NULL)
00058 return;
00059
00060 IHTMLElementCollectionPtr spAll;
00061 HRESULT hr = spDoc->get_all(&spAll);
00062 if (SUCCEEDED(hr) && spAll != NULL)
00063 {
00064
00065 CComVariant vTagName ("OBJECT");
00066 IDispatchPtr spTagsDisp;
00067 hr = spAll->tags (vTagName, &spTagsDisp);
00068 if (SUCCEEDED(hr) && spTagsDisp != NULL)
00069 {
00070 IHTMLElementCollectionPtr spTags (spTagsDisp);
00071 if (spTags)
00072 {
00073 long nCnt;
00074 hr = spTags->get_length(&nCnt);
00075 if (SUCCEEDED(hr))
00076 {
00077 for (long i = 0; i < nCnt; i++)
00078 {
00079 CComVariant varIdx;
00080 V_VT(&varIdx) = VT_I4;
00081 V_I4(&varIdx) = i;
00082
00083 IDispatchPtr spTagDisp;
00084 hr = spTags->item(varIdx, varIdx, &spTagDisp);
00085 if (SUCCEEDED(hr) && spTagDisp != NULL)
00086 {
00087 IHTMLObjectElementPtr spObject(spTagDisp);
00088 if (spObject != NULL)
00089 {
00090 BSTR bstrClassID = NULL;
00091 hr = spObject->get_classid(&bstrClassID);
00092 if (SUCCEEDED(hr) && bstrClassID)
00093 {
00094 fsString strClassID = W2A (bstrClassID);
00095 SysFreeString (bstrClassID);
00096 if (lstrcmpi (strClassID, "CLSID:D27CDB6E-AE6D-11CF-96B8-444553540000") == 0)
00097 {
00098 IDispatchPtr spObj;
00099 spObject->get_object (&spObj);
00100 IShockwaveFlashPtr spFlash (spObj);
00101 if (spFlash != NULL)
00102 {
00103 BSTR bstr;
00104 spFlash->get_Movie (&bstr);
00105 SysFreeString (bstr);
00106 }
00107 }
00108 }
00109 }
00110 }
00111 }
00112 }
00113 }
00114 }
00115 }
00116
00117
00118 CComVariant vTagName ("EMBED");
00119 IDispatchPtr spTagsDisp;
00120 hr = spAll->tags(vTagName, &spTagsDisp);
00121 if (SUCCEEDED(hr) && spTagsDisp != NULL)
00122 {
00123 IHTMLElementCollectionPtr spTags(spTagsDisp);
00124 if (spTags != NULL)
00125 {
00126 long nCnt;
00127 hr = spTags->get_length(&nCnt);
00128 if (SUCCEEDED(hr))
00129 {
00130 for (long i = 0; i < nCnt; i++)
00131 {
00132 CComVariant varIdx;
00133 V_VT(&varIdx) = VT_I4;
00134 V_I4(&varIdx) = i;
00135
00136 IDispatchPtr spTagDisp;
00137 hr = spTags->item(varIdx, varIdx, &spTagDisp);
00138 if (SUCCEEDED(hr) && spTagDisp != NULL)
00139 {
00140 IHTMLEmbedElementPtr spObject(spTagDisp);
00141 if (spObject != NULL)
00142 {
00143 IShockwaveFlashPtr spFlash (spObject);
00144 if (spFlash != NULL)
00145 {
00146 BSTR bstrSrc = NULL;
00147 hr = spObject->get_src(&bstrSrc);
00148 if (SUCCEEDED(hr) && bstrSrc)
00149 {
00150 SysFreeString (bstrSrc);
00151 }
00152 }
00153 }
00154 }
00155 }
00156 }
00157 }
00158 }
00159 }
00160
00161 void vmsFlashHelper::SaveFlashMovies(IHTMLDocument2Ptr spDoc, LPCSTR pszFolder, BOOL bIncludingFrames)
00162 {
00163 SaveFlashMovies_noframes(spDoc, pszFolder);
00164
00165 if (bIncludingFrames == FALSE)
00166 return;
00167
00168
00169 IHTMLFramesCollection2Ptr spFrames;
00170 spDoc->get_frames (&spFrames);
00171 if (spFrames == NULL)
00172 return;
00173
00174 long lCount = 0;
00175 spFrames->get_length (&lCount);
00176
00177 for (long i = 0; i < lCount; i++)
00178 {
00179 CComVariant va ((long)i);
00180 CComVariant vaR;
00181
00182 spFrames->item (&va, &vaR);
00183
00184 if (vaR.pdispVal != NULL)
00185 {
00186 IHTMLWindow2Ptr spWnd = vaR.pdispVal;
00187 if (spWnd != NULL)
00188 {
00189 IHTMLDocument2Ptr spFDoc;
00190 spWnd->get_document (&spFDoc);
00191 if (spFDoc != NULL)
00192 SaveFlashMovies (spFDoc, pszFolder, TRUE);
00193 }
00194 }
00195 }
00196 }
00197
00198 void vmsFlashHelper::GetFlashMoviesList(IHTMLDocument2Ptr spDoc, std::vector <fsString> *pslURLs, std::vector <fsString> *pslHTMLs)
00199 {
00200 USES_CONVERSION;
00201
00202 FLASHLIST vf;
00203 GetFlashMoviesObjList (spDoc, &vf, TRUE);
00204
00205 IHTMLLocationPtr spLoc;
00206 spDoc->get_location (&spLoc);
00207 BSTR bstrHref = NULL;
00208 spLoc->get_href (&bstrHref);
00209 fsString strParent = W2A (bstrHref);
00210 SysFreeString (bstrHref);
00211
00212 for (int i = 0; i < vf.size (); i++)
00213 {
00214 IDispatch* pTag = vf [i];
00215 fsString strMovieURL;
00216 fsString strMovieHTML;
00217
00218
00219 IHTMLObjectElementPtr spObject (pTag);
00220 if (spObject != NULL)
00221 {
00222 IDispatchPtr spObj;
00223 spObject->get_object (&spObj);
00224 IShockwaveFlashPtr spFlash (spObj);
00225 if (spFlash != NULL)
00226 {
00227 BSTR bstr;
00228 spFlash->get_Movie (&bstr);
00229 strMovieURL = W2A (bstr);
00230 SysFreeString (bstr);
00231 }
00232 }
00233 else
00234 {
00235
00236 IHTMLEmbedElementPtr spObject(pTag);
00237 BSTR bstrSrc = NULL;
00238 spObject->get_src(&bstrSrc);
00239 strMovieURL = W2A (bstrSrc);
00240 SysFreeString (bstrSrc);
00241 }
00242
00243
00244 if (pslHTMLs != NULL)
00245 {
00246 IHTMLElementPtr spElement (pTag);
00247 BSTR bstr = NULL;
00248 spElement->get_outerHTML (&bstr);
00249 strMovieHTML = W2A (bstr);
00250 SysFreeString (bstr);
00251 }
00252
00253 pslURLs->push_back (strMovieURL);
00254 if (pslHTMLs)
00255 pslHTMLs->push_back (strMovieHTML);
00256 }
00257 }
00258
00259 void vmsFlashHelper::GetFlashMoviesObjList(IHTMLDocument2Ptr spDoc, LPFLASHLIST pv, BOOL bIncludingFrames)
00260 {
00261
00262 GetFlashMoviesObjList_noframes (spDoc, pv);
00263
00264 if (bIncludingFrames == FALSE)
00265 return;
00266
00267
00268 IHTMLFramesCollection2Ptr spFrames;
00269 spDoc->get_frames (&spFrames);
00270 if (spFrames == NULL)
00271 return;
00272
00273 long lCount = 0;
00274 spFrames->get_length (&lCount);
00275
00276 for (long i = 0; i < lCount; i++)
00277 {
00278 CComVariant va ((long)i);
00279 CComVariant vaR;
00280
00281 spFrames->item (&va, &vaR);
00282
00283 if (vaR.pdispVal != NULL)
00284 {
00285 IHTMLWindow2Ptr spWnd = vaR.pdispVal;
00286 if (spWnd != NULL)
00287 {
00288 IHTMLDocument2Ptr spFDoc;
00289 spWnd->get_document (&spFDoc);
00290 if (spFDoc != NULL)
00291 GetFlashMoviesObjList (spFDoc, pv, TRUE);
00292 }
00293 }
00294 }
00295 }
00296
00297 void vmsFlashHelper::GetFlashMoviesObjList_noframes(IHTMLDocument2Ptr spDoc, LPFLASHLIST pv)
00298 {
00299 USES_CONVERSION;
00300
00301 if (spDoc == NULL)
00302 return;
00303
00304 IHTMLElementCollectionPtr spAll;
00305 HRESULT hr = spDoc->get_all(&spAll);
00306 if (SUCCEEDED(hr) && spAll != NULL)
00307 {
00308
00309 CComVariant vTagName ("OBJECT");
00310 IDispatchPtr spTagsDisp;
00311 hr = spAll->tags (vTagName, &spTagsDisp);
00312 if (SUCCEEDED(hr) && spTagsDisp != NULL)
00313 {
00314 IHTMLElementCollectionPtr spTags (spTagsDisp);
00315 if (spTags)
00316 {
00317 long nCnt;
00318 hr = spTags->get_length(&nCnt);
00319 if (SUCCEEDED(hr))
00320 {
00321 for (long i = 0; i < nCnt; i++)
00322 {
00323 CComVariant varIdx;
00324 V_VT(&varIdx) = VT_I4;
00325 V_I4(&varIdx) = i;
00326
00327 IDispatchPtr spTagDisp;
00328 hr = spTags->item(varIdx, varIdx, &spTagDisp);
00329 if (SUCCEEDED(hr) && spTagDisp != NULL)
00330 {
00331 IHTMLObjectElementPtr spObject(spTagDisp);
00332 if (spObject != NULL)
00333 {
00334 BSTR bstrClassID = NULL;
00335 hr = spObject->get_classid(&bstrClassID);
00336 if (SUCCEEDED(hr) && bstrClassID)
00337 {
00338 fsString strClassID = W2A (bstrClassID);
00339 SysFreeString (bstrClassID);
00340 if (lstrcmpi (strClassID, "CLSID:D27CDB6E-AE6D-11CF-96B8-444553540000") == 0)
00341 pv->push_back (spTagDisp);
00342 }
00343 }
00344 }
00345 }
00346 }
00347 }
00348 }
00349 }
00350
00351
00352 CComVariant vTagName ("EMBED");
00353 IDispatchPtr spTagsDisp;
00354 hr = spAll->tags(vTagName, &spTagsDisp);
00355 if (SUCCEEDED(hr) && spTagsDisp != NULL)
00356 {
00357 IHTMLElementCollectionPtr spTags(spTagsDisp);
00358 if (spTags != NULL)
00359 {
00360 long nCnt;
00361 hr = spTags->get_length(&nCnt);
00362 if (SUCCEEDED(hr))
00363 {
00364 for (long i = 0; i < nCnt; i++)
00365 {
00366 CComVariant varIdx;
00367 V_VT(&varIdx) = VT_I4;
00368 V_I4(&varIdx) = i;
00369
00370 IDispatchPtr spTagDisp;
00371 hr = spTags->item(varIdx, varIdx, &spTagDisp);
00372 if (SUCCEEDED(hr) && spTagDisp != NULL)
00373 {
00374 IHTMLEmbedElementPtr spObject(spTagDisp);
00375 if (spObject != NULL)
00376 {
00377 IShockwaveFlashPtr spFlash (spObject);
00378 if (spFlash != NULL)
00379 pv->push_back (spTagDisp);
00380 }
00381 }
00382 }
00383 }
00384 }
00385 }
00386 }
00387
00388 BOOL vmsFlashHelper::is_FlashElement(IHTMLElementPtr spEl, IDispatchPtr& spFlashDisp, IDispatchPtr& spFlashObject)
00389 {
00390 USES_CONVERSION;
00391
00392 IHTMLObjectElementPtr spObject (spEl);
00393 if (spObject != NULL)
00394 {
00395 BSTR bstrClassID = NULL;
00396 HRESULT hr = spObject->get_classid(&bstrClassID);
00397 if (SUCCEEDED (hr) && bstrClassID)
00398 {
00399 fsString strClassID = W2A (bstrClassID);
00400 SysFreeString (bstrClassID);
00401 if (lstrcmpi (strClassID, "CLSID:D27CDB6E-AE6D-11CF-96B8-444553540000") == 0)
00402 {
00403 spFlashDisp = spObject;
00404 spObject->get_object (&spFlashObject);
00405 return TRUE;
00406 }
00407 }
00408
00409 return FALSE;
00410 }
00411
00412 IHTMLEmbedElementPtr spEmbed (spEl);
00413 if (spEmbed != NULL)
00414 {
00415 IShockwaveFlashPtr spFlash (spEmbed);
00416 if (spFlash != NULL)
00417 {
00418 spFlashDisp = spEmbed;
00419 spFlashObject = spEmbed;
00420 return TRUE;
00421 }
00422
00423 return FALSE;
00424 }
00425
00426
00427
00428 return FALSE;
00429 }
00430
00431 void vmsFlashHelper::GetFlashInfo(IDispatchPtr spFlash, IHTMLDocument2Ptr spDoc, fsString *pstrMovieURL, fsString *pstrMovieHTML)
00432 {
00433 USES_CONVERSION;
00434
00435 IHTMLLocationPtr spLoc;
00436 spDoc->get_location (&spLoc);
00437 BSTR bstrHref = NULL;
00438 spLoc->get_href (&bstrHref);
00439 fsString strParent = W2A (bstrHref);
00440 SysFreeString (bstrHref);
00441
00442
00443 IHTMLObjectElementPtr spObject (spFlash);
00444 if (spObject != NULL)
00445 {
00446 IDispatchPtr spObj;
00447 spObject->get_object (&spObj);
00448 IShockwaveFlashPtr spFlash (spObj);
00449 if (spFlash != NULL)
00450 {
00451 BSTR bstr;
00452 spFlash->get_Movie (&bstr);
00453 *pstrMovieURL = W2A (bstr);
00454 SysFreeString (bstr);
00455 }
00456 }
00457 else
00458 {
00459
00460 IHTMLEmbedElementPtr spObject (spFlash);
00461 BSTR bstrSrc = NULL;
00462 spObject->get_src(&bstrSrc);
00463 *pstrMovieURL = W2A (bstrSrc);
00464 SysFreeString (bstrSrc);
00465 }
00466
00467
00468 if (pstrMovieHTML != NULL)
00469 {
00470 IHTMLElementPtr spElement (spFlash);
00471 BSTR bstr = NULL;
00472 spElement->get_outerHTML (&bstr);
00473 *pstrMovieHTML = W2A (bstr);
00474 SysFreeString (bstr);
00475 }
00476 }