]> git.sesse.net Git - vlc/blobdiff - activex/persiststorage.cpp
* Fix the duration of the dvdread module. refs #198.
[vlc] / activex / persiststorage.cpp
index efbfa6cc5af9287b5188f2d4520c8c5099014a11..5bac3012aca1bd5cca7e078fc3e969f02d1c93d5 100644 (file)
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 #include "plugin.h"
@@ -37,38 +37,67 @@ STDMETHODIMP VLCPersistStorage::GetClassID(LPCLSID pClsID)
 
 STDMETHODIMP VLCPersistStorage::IsDirty(void)
 {
-    return S_FALSE;
+    return _p_instance->isDirty() ? S_OK : S_FALSE;
 };
 
-STDMETHODIMP VLCPersistStorage::InitNew(IStorage *pStg)
+STDMETHODIMP VLCPersistStorage::InitNew(LPSTORAGE pStg)
 {
-    if( NULL == pStg )
-        return E_POINTER;
-
     return _p_instance->onInit();
 };
 
-STDMETHODIMP VLCPersistStorage::Load(IStorage *pStg)
+STDMETHODIMP VLCPersistStorage::Load(LPSTORAGE pStg)
 {
     if( NULL == pStg )
-        return E_POINTER;
+        return E_INVALIDARG;
 
-    return _p_instance->onInit();
+    LPSTREAM pStm = NULL;
+    HRESULT result = pStg->OpenStream(L"VideoLAN ActiveX Plugin Data", NULL,
+                        STGM_READ|STGM_SHARE_EXCLUSIVE, 0, &pStm);
+
+    if( FAILED(result) )
+        return result;
+
+    LPPERSISTSTREAMINIT pPersistStreamInit;
+    if( SUCCEEDED(QueryInterface(IID_IPersistStreamInit, (void **)&pPersistStreamInit)) )
+    {
+        result = pPersistStreamInit->Load(pStm);
+        pPersistStreamInit->Release();
+    }
+
+    pStm->Release();
+
+    return result;
 };
 
-STDMETHODIMP VLCPersistStorage::Save(IStorage *pStg, BOOL fSameAsLoad)
+STDMETHODIMP VLCPersistStorage::Save(LPSTORAGE pStg, BOOL fSameAsLoad)
 {
     if( NULL == pStg )
-        return E_POINTER;
+        return E_INVALIDARG;
 
-    return S_OK;
+    if( fSameAsLoad && (S_FALSE == IsDirty()) )
+        return S_OK;
+
+    LPSTREAM pStm = NULL;
+    HRESULT result = pStg->CreateStream(L"VideoLAN ActiveX Plugin Data",
+                        STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &pStm);
+
+    if( FAILED(result) )
+        return result;
+
+    LPPERSISTSTREAMINIT pPersistStreamInit;
+    if( SUCCEEDED(QueryInterface(IID_IPersistStreamInit, (void **)&pPersistStreamInit)) )
+    {
+        result = pPersistStreamInit->Save(pStm, fSameAsLoad);
+        pPersistStreamInit->Release();
+    }
+
+    pStm->Release();
+
+    return result;
 };
 
 STDMETHODIMP VLCPersistStorage::SaveCompleted(IStorage *pStg)
 {
-    if( NULL == pStg )
-        return E_POINTER;
-
     return S_OK;
 };