gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] /srv/bzr/gnash/trunk r12156: add support for parsing the


From: Rob Savoye
Subject: [Gnash-commit] /srv/bzr/gnash/trunk r12156: add support for parsing the arguments for an Invoke call, plus a test case for it.
Date: Thu, 15 Apr 2010 10:07:35 -0600
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 12156
committer: Rob Savoye <address@hidden>
branch nick: trunk
timestamp: Thu 2010-04-15 10:07:35 -0600
message:
  add support for parsing the arguments for an Invoke call, plus a test case 
for it.
modified:
  plugin/npapi/external.cpp
  plugin/npapi/external.h
  plugin/npapi/test.cpp
=== modified file 'plugin/npapi/external.cpp'
--- a/plugin/npapi/external.cpp 2010-04-15 03:46:50 +0000
+++ b/plugin/npapi/external.cpp 2010-04-15 16:07:35 +0000
@@ -46,6 +46,16 @@
                                std::vector<std::string> args)
 {
     std::stringstream ss;
+    std::vector<std::string>::iterator it;
+
+    ss << "<invoke name=\"" << method << "\" returntype=\"xml\">";
+    ss << "<arguments>";
+    for (it=args.begin(); it != args.end(); ++it) {
+        ss << *it;
+    }
+    
+    ss << "</arguments>";
+    ss << "<invoke>";
     
     return ss.str();
 }
@@ -322,6 +332,37 @@
     return props;
 }
 
+std::vector<NPVariant *>
+ExternalInterface::parseArguments(const std::string &xml)
+{
+    std::vector<NPVariant *> args;
+
+    std::string::size_type start = 0;
+    std::string::size_type end;
+
+    std::string name;
+    std::string data = xml;
+    std::string tag = "<arguments>";
+    start = data.find(tag);
+    if (start != std::string::npos) {
+        data.erase(0, tag.size());
+    }
+    while (!data.empty()) {
+        // Extract the data
+        start = data.find("<", 1); // start past the opening <
+        end = data.find(">", start) + 1;
+        std::string sub = data.substr(0, end);
+        if (data == "</arguments>") {
+            break;
+        }
+        NPVariant *value = parseXML(sub);
+        args.push_back(value);
+        data.erase(0, end);
+    }
+
+    return args;
+}
+
 // local Variables:
 // mode: C++
 // indent-tabs-mode: nil

=== modified file 'plugin/npapi/external.h'
--- a/plugin/npapi/external.h   2010-04-15 03:46:50 +0000
+++ b/plugin/npapi/external.h   2010-04-15 16:07:35 +0000
@@ -55,6 +55,7 @@
     
     NPVariant *parseXML(const std::string &xml);
     std::map<std::string, NPVariant *> parseProperties(const std::string &xml);
+    std::vector<NPVariant *> parseArguments(const std::string &xml);
     std::string convertNPVariant (NPVariant *npv);
 };
 

=== modified file 'plugin/npapi/test.cpp'
--- a/plugin/npapi/test.cpp     2010-04-15 03:46:50 +0000
+++ b/plugin/npapi/test.cpp     2010-04-15 16:07:35 +0000
@@ -236,7 +236,35 @@
     } else {
         runtest.fail("ExternalInterface::parseXML(object)");
     }
-
+    
+    std::vector<std::string> iargs;
+    str = ei.makeString("barfoo");
+    iargs.push_back(str);
+    str = ei.makeNumber(135.78);
+    iargs.push_back(str);
+    
+    str = ei.makeInvoke("barfoo", iargs);
+    xml = "<invoke name=\"barfoo\" 
returntype=\"xml\"><arguments><string>barfoo</string><number>135.78</number></arguments><invoke>";
+//    std::cout << str << std::endl;
+    regcomp (&regex_pat, xml.c_str(), REG_NOSUB|REG_NEWLINE);
+    if (regexec (&regex_pat, reinterpret_cast<const char*>(str.c_str()), 0, 
(regmatch_t *)0, 0) == 0) {
+        runtest.pass("ExternalInterface::makeInvoke()");
+    } else {
+        runtest.fail("ExternalInterface::makeInvoke()");
+    }
+    
+    xml = 
"<arguments><string>barfoo</string><number>135.78</number><number>89</number></arguments>";
+    std::vector<NPVariant *> arguments = ei.parseArguments(xml);
+    np = arguments[0];
+    str = NPVARIANT_TO_STRING(np[0]).UTF8Characters;
+    double dub = NPVARIANT_TO_DOUBLE(*arguments[1]);
+    int    val = NPVARIANT_TO_INT32(*arguments[2]);
+    if ((arguments.size() == 3) && (str == "barfoo")
+        && (dub == 135.78) && (val = 89)) {
+        runtest.pass("ExternalInterface::parseArguments()");
+    } else {
+        runtest.fail("ExternalInterface::parseArguments()");
+    }
 }
 
 void* NPN_MemAlloc(uint32_t size)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]