Use IndexOf (char)
[mono.git] / mcs / class / System.Web / System.Web.Configuration_2.0 / ProvidersHelper.cs
index 153b0f40ef766273966c61f3efddff95b1592db5..e9b8dca4a8d064289ef8fbedfb5259ef09aa3db6 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-using System;
-using System.Configuration;
-
 #if NET_2_0
 
+using System;
+using System.Collections;
+using System.Configuration;
 using System.Configuration.Provider;
+using System.Data.Common;
+using System.Data.SqlClient;
+using System.IO;
+using System.Reflection;
+using System.Web;
+using System.Web.Compilation;
+using System.Collections.Specialized;
 
 namespace System.Web.Configuration {
 
        public static class ProvidersHelper
        {
-               [MonoTODO ("is this right?")]
                public static ProviderBase InstantiateProvider (ProviderSettings providerSettings, Type providerType)
                {
-                       ProviderBase provider = Activator.CreateInstance (providerType) as ProviderBase;
+                       Type settingsType = HttpApplication.LoadType (providerSettings.Type);
+                       
+                       if (settingsType == null)
+                               settingsType = HttpApplication.LoadTypeFromBin (providerSettings.Type);
+
+                       // check App_Code dlls
+                       if (settingsType == null) {
+                               IList appCode = BuildManager.CodeAssemblies;
+
+                               if (appCode != null && appCode.Count > 0) {
+                                       Assembly asm;
+                                       foreach (object o in appCode) {
+                                               asm = o as Assembly;
+                                               if (asm == null)
+                                                       continue;
+                                               settingsType = asm.GetType (providerSettings.Type);
+                                               if (settingsType != null)
+                                                       break;
+                                       }
+                               }
+                       }
+
+                       if (settingsType == null)
+                               throw new ConfigurationErrorsException (String.Format ("Could not find type: {0}",
+                                                                                      providerSettings.Type));
+                       if (!providerType.IsAssignableFrom (settingsType))
+                               throw new ConfigurationErrorsException (String.Format ("Provider '{0}' must subclass from '{1}'",
+                                                                                      providerSettings.Name, providerType));
 
-                       provider.Initialize (providerSettings.Name, providerSettings.Parameters);
+                       ProviderBase provider = Activator.CreateInstance (settingsType) as ProviderBase;
+
+                       NameValueCollection col = new NameValueCollection (providerSettings.Parameters);
+                       provider.Initialize (providerSettings.Name, col);
 
                        return provider;
                }
 
-               [MonoTODO ("is this right?")]
                public static void InstantiateProviders (ProviderSettingsCollection configProviders, ProviderCollection providers, Type providerType)
                {
+                       if (!typeof (ProviderBase).IsAssignableFrom (providerType))
+                               throw new ConfigurationErrorsException (String.Format ("type '{0}' must subclass from ProviderBase", providerType));
+
                        foreach (ProviderSettings settings in configProviders)
                                providers.Add (InstantiateProvider (settings, providerType));
                }
+
+               internal static DbProviderFactory GetDbProviderFactory (string providerName)
+               {
+                       DbProviderFactory f = null;
+
+                       if (providerName != null && providerName != "") {
+                               try {
+                                       f = DbProviderFactories.GetFactory(providerName);
+                               }
+                               catch (Exception e) { Console.WriteLine (e); /* nada */ }
+                               if (f != null)
+                                       return f;
+                       }
+
+                       return SqlClientFactory.Instance;
+               }
        }
 
 }