Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Unified Diff: mojo/public/go/application/describer.go

Issue 1345263002: Generate Mojom Types in Go (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: GetIdentifier without a default Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/go/application/describer.go
diff --git a/mojo/public/go/application/describer.go b/mojo/public/go/application/describer.go
new file mode 100644
index 0000000000000000000000000000000000000000..58cc85691e851840c9b29a03a58de8977c22c9d1
--- /dev/null
+++ b/mojo/public/go/application/describer.go
@@ -0,0 +1,98 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package application
+
+import (
+ "fmt"
+ "log"
+
+ "mojo/public/go/bindings"
+
+ "mojo/public/interfaces/bindings/service_describer"
+)
+
+// ServiceDescriberFactory implements ServiceFactory for the ServiceDescriber.
+// For cleanup purposes, it is also the implementation of a ServiceDescriber.
+type ServiceDescriberFactory struct {
+ mapping map[string]service_describer.ServiceDescription
+ stubs []*bindings.Stub
+ descriptions map[string]*ServiceDescriptionFactory
+}
+
+func newServiceDescriberFactory(mapping map[string]service_describer.ServiceDescription) *ServiceDescriberFactory {
+ return &ServiceDescriberFactory{
+ mapping: mapping,
+ descriptions: make(map[string]*ServiceDescriptionFactory),
+ }
+}
+
+func (sd *ServiceDescriberFactory) Create(request service_describer.ServiceDescriber_Request) {
+ stub := service_describer.NewServiceDescriberStub(request, sd, bindings.GetAsyncWaiter())
+ sd.stubs = append(sd.stubs, stub)
+ go func() {
+ for {
+ if err := stub.ServeRequest(); err != nil {
+ connectionError, ok := err.(*bindings.ConnectionError)
+ if !ok || !connectionError.Closed() {
+ log.Println(err)
+ }
+ break
+ }
+ }
+ }()
+}
+
+func (sd *ServiceDescriberFactory) Close() {
+ for _, stub := range sd.stubs {
+ stub.Close()
+ }
+ for _, description := range sd.descriptions {
+ for _, stub := range description.stubs {
+ stub.Close()
+ }
+ }
+}
+
+// Helper method for DescribeService
+func (sd *ServiceDescriberFactory) getServiceDescriptionFactory(inInterfaceName string) *ServiceDescriptionFactory {
+ // Assumes the interface name is in the mapping.
+ if desc, ok := sd.descriptions[inInterfaceName]; ok {
+ return desc
+ }
+ sd.descriptions[inInterfaceName] = &ServiceDescriptionFactory{
+ description: sd.mapping[inInterfaceName],
+ }
+ return sd.descriptions[inInterfaceName]
+}
+
+func (sd *ServiceDescriberFactory) DescribeService(inInterfaceName string, inDescriptionRequest service_describer.ServiceDescription_Request) (err error) {
+ if _, ok := sd.mapping[inInterfaceName]; ok {
+ sd.getServiceDescriptionFactory(inInterfaceName).Create(inDescriptionRequest)
+ return nil
+ }
+ return fmt.Errorf("The interface %s is unknown by this application", inInterfaceName)
+}
+
+// ServiceDescriptionFactory implements ServiceFactory for the ServiceDescription.
+type ServiceDescriptionFactory struct {
+ stubs []*bindings.Stub
+ description service_describer.ServiceDescription
+}
+
+func (serviceDescriptionFactory *ServiceDescriptionFactory) Create(request service_describer.ServiceDescription_Request) {
+ stub := service_describer.NewServiceDescriptionStub(request, serviceDescriptionFactory.description, bindings.GetAsyncWaiter())
+ serviceDescriptionFactory.stubs = append(serviceDescriptionFactory.stubs, stub)
+ go func() {
+ for {
+ if err := stub.ServeRequest(); err != nil {
+ connectionError, ok := err.(*bindings.ConnectionError)
+ if !ok || !connectionError.Closed() {
+ log.Println(err)
+ }
+ break
+ }
+ }
+ }()
+}

Powered by Google App Engine
This is Rietveld 408576698