[NeoStats-Devel] [Commits] r2833 - trunk/src

[email protected] Wed, 28 Sep 2005 23:41:50 +1000
Newsgroups gmane.comp.neostats.devel
Message-ID <[email protected]>
Author: Fish
Date: Wed Sep 28 21:41:42 2005
New Revision: 2833

Modified:
   trunk/src/NeoStats.pm
   trunk/src/neostats.pm.h
   trunk/src/perl.c
Log:
update perl extension bindings. This pretty much works now


Modified: trunk/src/NeoStats.pm
==============================================================================
--- trunk/src/NeoStats.pm	(original)
+++ trunk/src/NeoStats.pm	Wed Sep 28 21:41:42 2005
@@ -50,6 +50,11 @@
     my ($package) = caller;
     my $pkg_info = NeoStats::Embed::pkg_info( $package );
     my $filename = $pkg_info->{filename};
+	
+	if ($pkg_info->{type} != 0) {
+		NeoStats::debug("Extension tried to register as a module");
+		return NeoStats::NS_FAILURE;
+	}
 
     my ($name, $version, $description, $startupcb, $shutdowncb) = @_;
     $description = "" unless defined $description;
@@ -69,6 +74,33 @@
     return NeoStats::NS_SUCCESS;
   }
 
+  sub registerextension {
+    if (@_ != 4) {
+      NeoStats::debug("Invalid Number of arguments to registerextension");
+      return NeoStats::NS_FAILURE;
+    }
+    my ($package) = caller;
+    my $pkg_info = NeoStats::Embed::pkg_info( $package );
+    my $filename = $pkg_info->{filename};
+	
+	if ($pkg_info->{type} != 1) {
+		NeoStats::debug("Perl Module tried to register as a extension");
+		return NeoStats::NS_FAILURE;
+	}
+
+    my ($name, $version, $startupcb, $shutdowncb) = @_;
+    $pkg_info->{name} = $name;
+    $pkg_info->{version} = $version;
+    $pkg_info->{gui_entry} =
+      NeoStats::Internal::registerextension( $pkg_info->{name}, $pkg_info->{version});
+    $startupcb = NeoStats::Embed::fix_callback( $package, $startupcb );
+    $shutdowncb = NeoStats::Embed::fix_callback( $package, $shutdowncb );
+    $pkg_info->{shutdown} = $shutdowncb;
+    $pkg_info->{startup} = $startupcb;
+
+    # keep with old behavior
+    return NeoStats::NS_SUCCESS;
+  }
 
 
   sub hook_event {
@@ -719,6 +751,7 @@
       # this must come before the eval or the filename will not be found in
       # NeoStats::register
       $scripts{$package}{filename} = $file;
+	  $scripts{$package}{type} = 0;
 
       {
 #        no strict; no warnings;
@@ -741,7 +774,57 @@
     
     return 0;
   }
+ 
+  
+    sub loadextension {
+    my $file = expand_homedir( shift @_ );
+
+    my $package = file2pkg( $file );
 
+    if ( open FH, $file ) {
+      my $source = do {local $/; <FH>};
+      close FH;
+
+      if ( my $replacements = $source =~ s/^\s*package ([\w:]+).*?;//mg ) {
+        my $original_package = $1;
+
+        if ( $replacements > 1 ) {
+          NeoStats::debug( "Too many package defintions, only 1 is allowed\n" );
+          return 1;
+        }
+
+        # fixes things up for code calling subs with fully qualified names
+        $source =~ s/${original_package}:://g;
+
+      }
+
+      # this must come before the eval or the filename will not be found in
+      # NeoStats::registerextension
+      $scripts{$package}{filename} = $file;
+	  $scripts{$package}{type} = 1;
+	  
+      {
+#        no strict; no warnings;
+        eval "package $package; $source;";
+      }
+
+      if ( $@ ) {
+        # something went wrong
+        NeoStats::debug( "Error loading extension '$file':\n$@\n" );
+
+        # make sure the script list doesn't contain false information
+        unload( $scripts{$package}{filename} );
+        return 1;
+      }
+
+    } else {
+      NeoStats::debug( "Error opening '$file': $!\n" );
+      return 2;
+    }
+    
+    return 0;
+  }
+  
   sub unload {
     my $file = shift @_;
     my $package = file2pkg( $file );

Modified: trunk/src/neostats.pm.h
==============================================================================
--- trunk/src/neostats.pm.h	(original)
+++ trunk/src/neostats.pm.h	Wed Sep 28 21:41:42 2005
@@ -51,6 +51,11 @@
 "my $pkg_info = NeoStats::Embed::pkg_info( $package );\n"
 "my $filename = $pkg_info->{filename};\n"
 "\n"
+"if ($pkg_info->{type} != 0) {\n"
+"NeoStats::debug(\"Extension tried to register as a module\");\n"
+"return NeoStats::NS_FAILURE;\n"
+"}\n"
+"\n"
 "my ($name, $version, $description, $startupcb, $shutdowncb) = @_;\n"
 "$description = \"\" unless defined $description;\n"
 "\n"
@@ -69,6 +74,33 @@
 "return NeoStats::NS_SUCCESS;\n"
 "}\n"
 "\n"
+"sub registerextension {\n"
+"if (@_ != 4) {\n"
+"NeoStats::debug(\"Invalid Number of arguments to registerextension\");\n"
+"return NeoStats::NS_FAILURE;\n"
+"}\n"
+"my ($package) = caller;\n"
+"my $pkg_info = NeoStats::Embed::pkg_info( $package );\n"
+"my $filename = $pkg_info->{filename};\n"
+"\n"
+"if ($pkg_info->{type} != 1) {\n"
+"NeoStats::debug(\"Perl Module tried to register as a extension\");\n"
+"return NeoStats::NS_FAILURE;\n"
+"}\n"
+"\n"
+"my ($name, $version, $startupcb, $shutdowncb) = @_;\n"
+"$pkg_info->{name} = $name;\n"
+"$pkg_info->{version} = $version;\n"
+"$pkg_info->{gui_entry} =\n"
+"NeoStats::Internal::registerextension( $pkg_info->{name}, $pkg_info->{version});\n"
+"$startupcb = NeoStats::Embed::fix_callback( $package, $startupcb );\n"
+"$shutdowncb = NeoStats::Embed::fix_callback( $package, $shutdowncb );\n"
+"$pkg_info->{shutdown} = $shutdowncb;\n"
+"$pkg_info->{startup} = $startupcb;\n"
+"\n"
+"\n"
+"return NeoStats::NS_SUCCESS;\n"
+"}\n"
 "\n"
 "\n"
 "sub hook_event {\n"
@@ -719,6 +751,7 @@
 "\n"
 "\n"
 "$scripts{$package}{filename} = $file;\n"
+"$scripts{$package}{type} = 0;\n"
 "\n"
 "{\n"
 "\n"
@@ -742,6 +775,56 @@
 "return 0;\n"
 "}\n"
 "\n"
+"\n"
+"sub loadextension {\n"
+"my $file = expand_homedir( shift @_ );\n"
+"\n"
+"my $package = file2pkg( $file );\n"
+"\n"
+"if ( open FH, $file ) {\n"
+"my $source = do {local $/; <FH>};\n"
+"close FH;\n"
+"\n"
+"if ( my $replacements = $source =~ s/^\\s*package ([\\w:]+).*?;//mg ) {\n"
+"my $original_package = $1;\n"
+"\n"
+"if ( $replacements > 1 ) {\n"
+"NeoStats::debug( \"Too many package defintions, only 1 is allowed\\n\" );\n"
+"return 1;\n"
+"}\n"
+"\n"
+"\n"
+"$source =~ s/${original_package}:://g;\n"
+"\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"$scripts{$package}{filename} = $file;\n"
+"$scripts{$package}{type} = 1;\n"
+"\n"
+"{\n"
+"\n"
+"eval \"package $package; $source;\";\n"
+"}\n"
+"\n"
+"if ( $@ ) {\n"
+"\n"
+"NeoStats::debug( \"Error loading extension '$file':\\n$@\\n\" );\n"
+"\n"
+"\n"
+"unload( $scripts{$package}{filename} );\n"
+"return 1;\n"
+"}\n"
+"\n"
+"} else {\n"
+"NeoStats::debug( \"Error opening '$file': $!\\n\" );\n"
+"return 2;\n"
+"}\n"
+"\n"
+"return 0;\n"
+"}\n"
+"\n"
 "sub unload {\n"
 "my $file = shift @_;\n"
 "my $package = file2pkg( $file );\n"

Modified: trunk/src/perl.c
==============================================================================
--- trunk/src/perl.c	(original)
+++ trunk/src/perl.c	Wed Sep 28 21:41:42 2005
@@ -433,11 +433,33 @@
 		mod->info->version = strndup(SvPV_nolen (ST (1)), sv_len(ST (1)));
 		mod->info->description = strndup(SvPV_nolen (ST (2)), sv_len(ST(2)));
 		mod->pm->registered = 1;
+		mod->pm->type = TYPE_MODULE;
 		XSRETURN_UV (PTR2UV (mod));
 
 	}
 }
 
+static
+XS (XS_NeoStats_registerextension)
+{
+	Module *mod;
+	dXSARGS;
+	if (items != 2) {
+		nlog(LOG_WARNING, "Usage: NeoStats::Internal::registerextension(scriptname, version)");
+	} else {
+		mod = GET_CUR_MODULE();
+		if (!mod) {
+			nlog(LOG_WARNING, "Current Mod Stack for Perl Mods is screwed");
+			XSRETURN_EMPTY;
+		}
+		mod->pm->extname = strndup(SvPV_nolen(ST(0)), sv_len(ST (0)));
+		mod->pm->extversion = strndup(SvPV_nolen (ST (1)), sv_len(ST (1)));
+		mod->pm->registered = 1;
+		mod->pm->type = TYPE_EXTENSION;
+		XSRETURN_UV (PTR2UV (mod));
+	}
+}
+
 /* NeoStats::debug(output) */
 static
 XS (XS_NeoStats_debug)
@@ -1535,6 +1557,7 @@
 	newCONSTSUB (stash, "NS_FAILURE", newSViv (NS_FAILURE));
 
 	if (mod->pm->extninit) {
+		newXS ("NeoStats::Internal::registerextension", XS_NeoStats_registerextension, __FILE__);
 		mod->pm->extninit();
 	}
 }
@@ -1595,27 +1618,29 @@
 int load_perlextension(const char *filename, perl_xs_init init_func, Client *u)
 {
 	Module *mod;
+	char filebuf[BUFSIZE];
 	
 	mod = GET_CUR_MODULE();
 	if (!mod) {
 		nlog(LOG_WARNING, "Trying to laod a Perl Extension %s in the core? No No", filename);
 		return NS_FAILURE;
 	}	
-	
-	mod = load_perlfiles((const char *)filename, mod, init_func);
+	ircsnprintf(filebuf, BUFSIZE, "modules/%s.ple", filename);
+printf("%s\n",filebuf);
+	mod = load_perlfiles((const char *)filebuf, mod, init_func);
 	
 	SET_RUN_LEVEL(mod);
 	if (!execute_perl (mod, sv_2mortal (newSVpv ("NeoStats::Embed::loadextension", 0)),
-								1, (char *)filename)) {
+								1, (char *)filebuf)) {
 		/* if we are here, check that pm->mod->description has something, otherwise the script didnt register */
 		if (!mod->pm->registered) {
-			load_module_error(u, filename, __("Perl extension didn't register.", u));
+			load_module_error(u, filebuf, __("Perl extension didn't register.", u));
 			unload_perlextension(mod);
 			return NS_FAILURE;
 		}		
 		/* it loaded ok */
 	} else {
-		load_module_error(u, filename, __("Errors in Perl extension", u));
+		load_module_error(u, filebuf, __("Errors in Perl extension", u));
 		unload_perlextension(mod);
 		return NS_FAILURE;	
 	}