]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/mediactrlcmn.cpp
return correct error message if NSLinkModule() fails; fixed flagrant buffer overflow
[wxWidgets.git] / src / common / mediactrlcmn.cpp
index f5994cb27be448cd155b5a2d2dde215f6be269df..17620935747b4c14e8f145c57d160b2bb2018ea8 100644 (file)
 // Pre-compiled header stuff
 //---------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "mediactrl.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
@@ -52,6 +48,7 @@ IMPLEMENT_CLASS(wxMediaCtrl, wxControl);
 IMPLEMENT_CLASS(wxMediaBackend, wxObject);
 IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent, wxEvent);
 DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED);
+DEFINE_EVENT_TYPE(wxEVT_MEDIA_LOADED);
 DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP);
 
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -60,6 +57,16 @@ DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP);
 //
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
+//---------------------------------------------------------------------------
+// wxMediaBackend Destructor
+//
+// This is here because the DARWIN gcc compiler badly screwed up and
+// needs the destructor implementation in the source
+//---------------------------------------------------------------------------
+wxMediaBackend::~wxMediaBackend()
+{
+}
+
 //---------------------------------------------------------------------------
 // wxMediaCtrl::Create (file version)
 // wxMediaCtrl::Create (URL version)
@@ -84,8 +91,10 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
 {
     if(!szBackend.empty())
     {
-        if(!DoCreate(wxClassInfo::FindClass(szBackend), parent, id,
-                     pos, size, style, validator, name))
+        wxClassInfo* pClassInfo = wxClassInfo::FindClass(szBackend);
+
+        if(!pClassInfo || !DoCreate(pClassInfo, parent, id,
+                                    pos, size, style, validator, name))
         {
             m_imp = NULL;
             return false;
@@ -108,9 +117,9 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
     {
         wxClassInfo::sm_classTable->BeginFind();
 
-        wxClassInfo* classInfo = NextBackend();
+        wxClassInfo* classInfo;
 
-        while(classInfo)
+        while((classInfo = NextBackend()) != NULL)
         {
             if(!DoCreate(classInfo, parent, id,
                          pos, size, style, validator, name))
@@ -131,8 +140,6 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
                 SetBestFittingSize(size);
                 return true;
             }
-
-            classInfo = NextBackend();
         }
 
         m_imp = NULL;
@@ -141,18 +148,19 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
 }
 
 bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
-                const wxURI& location,
-                const wxPoint& pos,
-                const wxSize& size,
-                long style,
-                const wxString& szBackend,
-                const wxValidator& validator,
-                const wxString& name)
+                         const wxURI& location,
+                         const wxPoint& pos,
+                         const wxSize& size,
+                         long style,
+                         const wxString& szBackend,
+                         const wxValidator& validator,
+                         const wxString& name)
 {
     if(!szBackend.empty())
     {
-        if(!DoCreate(wxClassInfo::FindClass(szBackend), parent, id,
-                     pos, size, style, validator, name))
+        wxClassInfo* pClassInfo = wxClassInfo::FindClass(szBackend);
+        if(!pClassInfo || !DoCreate(pClassInfo, parent, id,
+                                    pos, size, style, validator, name))
         {
             m_imp = NULL;
             return false;
@@ -172,9 +180,9 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
     {
         wxClassInfo::sm_classTable->BeginFind();
 
-        wxClassInfo* classInfo = NextBackend();
+        wxClassInfo* classInfo;
 
-        while(classInfo)
+        while((classInfo = NextBackend()) != NULL)
         {
             if(!DoCreate(classInfo, parent, id,
                          pos, size, style, validator, name))
@@ -187,8 +195,6 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
             }
             else
                 delete m_imp;
-
-            classInfo = NextBackend();
         }
 
         m_imp = NULL;
@@ -230,7 +236,7 @@ bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo,
 // of wxMediaBackend
 //
 //
-// STL isn't compatable with and will have a compilation error
+// STL isn't compatible with and will have a compilation error
 // on a wxNode, however, wxHashTable::compatibility_iterator is
 // incompatible with the old 2.4 stable version - but since
 // we're in 2.5 only we don't need to worry about this
@@ -272,6 +278,8 @@ wxMediaCtrl::~wxMediaCtrl()
 //---------------------------------------------------------------------------
 // wxMediaCtrl::Load (file version)
 // wxMediaCtrl::Load (URL version)
+// wxMediaCtrl::Load (URL & Proxy version)
+// wxMediaCtrl::Load (wxInputStream version)
 //
 // Here we call load of the backend - keeping
 // track of whether it was successful or not - which
@@ -291,6 +299,13 @@ bool wxMediaCtrl::Load(const wxURI& location)
     return false;
 }
 
+bool wxMediaCtrl::Load(const wxURI& location, const wxURI& proxy)
+{
+    if(m_imp)
+        return (m_bLoaded = m_imp->Load(location, proxy));
+    return false;
+}
+
 //---------------------------------------------------------------------------
 // wxMediaCtrl::Play
 // wxMediaCtrl::Pause
@@ -302,6 +317,11 @@ bool wxMediaCtrl::Load(const wxURI& location)
 // wxMediaCtrl::Length --> GetDuration
 // wxMediaCtrl::GetState
 // wxMediaCtrl::DoGetBestSize
+// wxMediaCtrl::SetVolume
+// wxMediaCtrl::GetVolume
+// wxMediaCtrl::ShowInterface
+// wxMediaCtrl::GetDownloadProgress
+// wxMediaCtrl::GetDownloadTotal
 //
 // 1) Check to see whether the backend exists and is loading
 // 2) Call the backend's version of the method, returning success
@@ -367,7 +387,6 @@ wxFileOffset wxMediaCtrl::Seek(wxFileOffset where, wxSeekMode mode)
 
 wxFileOffset wxMediaCtrl::Tell()
 {
-    //FIXME
     if(m_imp && m_bLoaded)
         return (wxFileOffset) m_imp->GetPosition().ToLong();
     return wxInvalidOffset;
@@ -375,7 +394,6 @@ wxFileOffset wxMediaCtrl::Tell()
 
 wxFileOffset wxMediaCtrl::Length()
 {
-    //FIXME
     if(m_imp && m_bLoaded)
         return (wxFileOffset) m_imp->GetDuration().ToLong();
     return wxInvalidOffset;
@@ -392,7 +410,42 @@ wxSize wxMediaCtrl::DoGetBestSize() const
 {
     if(m_imp)
         return m_imp->GetVideoSize();
-    return wxSize();
+    return wxSize(0,0);
+}
+
+double wxMediaCtrl::GetVolume() 
+{
+    if(m_imp && m_bLoaded)
+        return m_imp->GetVolume();
+    return 0.0;
+}
+
+bool wxMediaCtrl::SetVolume(double dVolume) 
+{
+    if(m_imp && m_bLoaded)
+        return m_imp->SetVolume(dVolume);
+    return false;
+}
+
+bool wxMediaCtrl::ShowPlayerControls(wxMediaCtrlPlayerControls flags) 
+{
+    if(m_imp)
+        return m_imp->ShowPlayerControls(flags);
+    return false;
+}
+
+wxFileOffset wxMediaCtrl::GetDownloadProgress()
+{
+    if(m_imp && m_bLoaded)
+        return (wxFileOffset) m_imp->GetDownloadProgress().ToLong();
+    return wxInvalidOffset;
+}
+
+wxFileOffset wxMediaCtrl::GetDownloadTotal()
+{
+    if(m_imp && m_bLoaded)
+        return (wxFileOffset) m_imp->GetDownloadTotal().ToLong();
+    return wxInvalidOffset;
 }
 
 //---------------------------------------------------------------------------
@@ -411,9 +464,49 @@ void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h)
         m_imp->Move(x, y, w, h);
 }
 
-//DARWIN gcc compiler badly screwed up - needs destructor impl in source
-wxMediaBackend::~wxMediaBackend()
-{                               }
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+//  wxMediaBackendCommonBase
+//
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+void wxMediaBackendCommonBase::NotifyMovieSizeChanged()
+{
+    // our best size changed after opening a new file
+    m_ctrl->InvalidateBestSize();
+    m_ctrl->SetSize(m_ctrl->GetSize());
+
+    // if the parent of the control has a sizer ask it to refresh our size
+    wxWindow * const parent = m_ctrl->GetParent();
+    if ( parent->GetSizer() )
+    {
+        m_ctrl->GetParent()->Layout();
+        m_ctrl->GetParent()->Refresh();
+        m_ctrl->GetParent()->Update();
+    }
+}
+
+void wxMediaBackendCommonBase::NotifyMovieLoaded()
+{
+    NotifyMovieSizeChanged();
+
+    // notify about movie being fully loaded
+    QueueEvent(wxEVT_MEDIA_LOADED);
+}
+
+bool wxMediaBackendCommonBase::SendStopEvent()
+{
+    wxMediaEvent theEvent(wxEVT_MEDIA_STOP, m_ctrl->GetId());
+
+    return !m_ctrl->ProcessEvent(theEvent) || theEvent.IsAllowed();
+}
+
+void wxMediaBackendCommonBase::QueueEvent(wxEventType evtType)
+{
+    wxMediaEvent theEvent(evtType, m_ctrl->GetId());
+    m_ctrl->AddPendingEvent(theEvent);
+}
+
 #include "wx/html/forcelnk.h"
 FORCE_LINK(basewxmediabackends);