************************* G4 reminder *************************
These new files:

        
c:\MyDocs\Gears3\googleclient\gears\opensource\gears\base\opera_mobile\opera_utils.cc

are missing unit tests.
***************************************************************

Hello andreip,

I'd like you to do a code review.  Please execute
        g4 diff -c 9135600

or point your web browser to
        http://mondrian/9135600

to review the following code:

Change 9135600 by [EMAIL PROTECTED] on 2008/11/24 16:53:02 *pending*

        Adds the Opera Mobile browser API headers and the OperaUtils class for 
accessing this API.

        This CL implements changes made by Stig, with a couple of my changes ...
        - Cleaned up some style problems (line length, tabs, identation)
        - Renamed base/opera to base/opera_mobile and third_party/opera to 
third_party/opera_mobile, as these directories are (I think) specific to the 
mobile version of the browser.
        
        R=andreip
        [EMAIL PROTECTED],[email protected]
        DELTA=377  (374 added, 0 deleted, 3 changed)
        OCL=9135600

Affected files ...

... //depot/googleclient/gears/opensource/gears/Makefile#213 edit
... //depot/googleclient/gears/opensource/gears/base/npapi/module.cc#7 edit
... //depot/googleclient/gears/opensource/gears/base/npapi/module.h#6 edit
... 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.cc#1 
add
... 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.h#1 
add
... 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_worker.h#1 
add
... 
//depot/googleclient/gears/opensource/third_party/opera_mobile/opera_callback_api.h#1
 add
... 
//depot/googleclient/gears/opensource/third_party/opera_mobile/opera_local_server_interface.h#1
 add

377 delta lines: 374 added, 0 deleted, 3 changed

Also consider running:
        g4 lint -c 9135600

which verifies that the changelist doesn't introduce new style violations.

If you can't do the review, please let me know as soon as possible.  During
your review, please ensure that all new code has corresponding unit tests and
that existing unit tests are updated appropriately.  Visit
http://www/eng/code_review.html for more information.

This is a semiautomated message from "g4 mail".  Complaints or suggestions?
Mail [EMAIL PROTECTED]
Change 9135600 by [EMAIL PROTECTED] on 2008/11/24 16:53:02 *pending*

        Adds the Opera Mobile browser API headers and the OperaUtils class for 
accessing this API.

Affected files ...

... //depot/googleclient/gears/opensource/gears/Makefile#213 edit
... //depot/googleclient/gears/opensource/gears/base/npapi/module.cc#7 edit
... //depot/googleclient/gears/opensource/gears/base/npapi/module.h#6 edit
... 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.cc#1 
add
... 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.h#1 
add
... 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_worker.h#1 
add
... 
//depot/googleclient/gears/opensource/third_party/opera_mobile/opera_callback_api.h#1
 add
... 
//depot/googleclient/gears/opensource/third_party/opera_mobile/opera_local_server_interface.h#1
 add

==== //depot/googleclient/gears/opensource/gears/Makefile#213 - 
c:\MyDocs\Gears3/googleclient/gears/opensource/gears/Makefile ====
# action=edit type=text
--- googleclient/gears/opensource/gears/Makefile        2008-11-24 
17:59:56.000000000 +0000
+++ googleclient/gears/opensource/gears/Makefile        2008-11-24 
17:39:49.000000000 +0000
@@ -1189,16 +1189,17 @@
 endif # WIN32
 
 #-----------------------------------------------------------------------------
-# base/opera
+# base/opera_mobile
 
 OPERA_VPATH    += \
-               base/opera \
+               base/opera_mobile \
                $(NULL)
 
 OPERA_CPPSRCS  += \
                detect_version_collision_win32.cc \
                message_queue_win32.cc \
                js_standalone_engine_op.cc \
+               opera_utils.cc \
                paths_op.cc \
                $(NULL)
 
==== //depot/googleclient/gears/opensource/gears/base/npapi/module.cc#7 - 
c:\MyDocs\Gears3/googleclient/gears/opensource/gears/base/npapi/module.cc ====
# action=edit type=text
--- googleclient/gears/opensource/gears/base/npapi/module.cc    2008-11-10 
14:29:58.000000000 +0000
+++ googleclient/gears/opensource/gears/base/npapi/module.cc    2008-11-24 
17:48:14.000000000 +0000
@@ -47,12 +47,18 @@
 #include "gears/base/safari/npapi_patches.h" 
 #endif
 #include "gears/base/npapi/module.h"
+#ifdef BROWSER_OPERA
+#include "gears/base/npapi/plugin.h"
+#include "gears/base/opera_mobile/opera_utils.h"
+//#include "gears/localserver/opera/gears_server_op.h"
+#include "third_party/opera_mobile/opera_callback_api.h"
+#endif // BROWSER_OPERA
 
 #ifndef HIBYTE
 #define HIBYTE(x) ((((uint32)(x)) & 0xff00) >> 8)
 #endif
 
-#ifdef BROWSER_WEBKIT
+#if defined(BROWSER_WEBKIT) || defined(BROWSER_OPERA)
 static bool g_allow_npinit = true;
 #else
 static bool g_allow_npinit = false;
@@ -185,6 +191,21 @@
 }
 #endif
 
+#ifdef BROWSER_OPERA
+void OP_Initialize(OpGearsAPI *opera_instance, OperaCallbacks *callbacks) {
+  LOG16((L"OP_Initialize called\n"));
+
+  OperaUtils::Init(opera_instance,
+                   ThreadMessageQueue::GetInstance()->GetCurrentThreadId());
+
+  callbacks->CreateWorker = OperaUtils::CreateWorkerThread;
+  // TODO([EMAIL PROTECTED]): Provide a CloneObject method.
+  //callbacks->CloneObject = PluginBase::CloneObject;;
+  callbacks->OpenSettingsDialog = OperaUtils::OpenSettingsDialog;
+  // TODO([EMAIL PROTECTED]): Provide a LocalServerInitialize method.
+  //callbacks->LocalServerInitialize = GearsServerOp::Create;
+}
+#endif // BROWSER_OPERA
 
 #ifdef WIN32
 BOOL MyDllMain(HANDLE instance, DWORD reason, LPVOID reserved) {
==== //depot/googleclient/gears/opensource/gears/base/npapi/module.h#6 - 
c:\MyDocs\Gears3/googleclient/gears/opensource/gears/base/npapi/module.h ====
# action=edit type=text
--- googleclient/gears/opensource/gears/base/npapi/module.h     2008-11-10 
14:29:58.000000000 +0000
+++ googleclient/gears/opensource/gears/base/npapi/module.h     2008-11-24 
17:33:11.000000000 +0000
@@ -38,4 +38,12 @@
 // js_runner_np.cc.
 void NotifyNPInstanceDestroyed(NPP instance);
 
+#ifdef BROWSER_OPERA
+class OpGearsAPI;
+class OperaCallbacks;
+// exported function to do initialization from the Opera browser
+extern "C" __declspec(dllexport) void OP_Initialize(OpGearsAPI *opera_instance,
+                                                    OperaCallbacks *callbacks);
+#endif // BROWSER_OPERA
+
 #endif  // GEARS_BASE_NPAPI_MODULE_H__
==== 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.cc#1 
- 
c:\MyDocs\Gears3/googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.cc
 ====
# action=add type=text
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.cc        
2008-11-24 17:39:58.000000000 +0000
@@ -0,0 +1,135 @@
+// Copyright 2008, Google Inc.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//  1. Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//  2. Redistributions in binary form must reproduce the above copyright 
notice,
+//     this list of conditions and the following disclaimer in the 
documentation
+//     and/or other materials provided with the distribution.
+//  3. Neither the name of Google Inc. nor the names of its contributors may be
+//     used to endorse or promote products derived from this software without
+//     specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "gears/base/opera_mobile/opera_utils.h"
+
+#include <assert.h>
+
+#include "gears/base/opera_mobile/opera_worker.h"
+#include "gears/base/npapi/module_wrapper.h"
+#include "gears/factory/factory_np.h"
+#include "gears/factory/factory_impl.h"
+#include "gears/ui/common/settings_dialog.h"
+#include "third_party/opera_mobile/opera_callback_api.h"
+
+static OpGearsAPI* g_opera_api;
+static ThreadId g_main_thread;
+
+// Implementation of the wrapper class for the native opera worker threads.
+class OperaWorkerThreadImpl : public OperaWorkerThread {
+ public:
+  OperaWorkerThreadImpl() : js_runner(NULL) {
+    factory.reset(NULL);
+  }
+  virtual ~OperaWorkerThreadImpl() {
+    factory.reset(NULL);
+    delete js_runner;
+  }
+
+  virtual void Destroy() {
+    delete this;
+  }
+
+  virtual NPObject* CreateWorkerFactory(NPP instance,
+                                        NPObject* global_object,
+                                        const unsigned short* url) {
+    // TODO([EMAIL PROTECTED]): Initialise the JsRunner.
+    //if (!js_runner)
+    //  js_runner = NewJsRunner(instance, global_object);
+    if (!js_runner)
+      return NULL;
+
+    if (!factory.get()) {
+      SecurityOrigin security_origin;
+      scoped_refptr<BrowsingContext> browsing_context;
+      if (!security_origin.InitFromUrl(url))
+        return NULL;
+      BrowserUtils::GetPageBrowsingContext((NPP)instance, &browsing_context);
+      
+      ModuleEnvironment* module_env =
+          new ModuleEnvironment(security_origin,
+                                true,
+                                js_runner,
+                                browsing_context.get());
+      if (!module_env)
+        return NULL;
+
+      if (!CreateModule<GearsFactoryImpl>(
+            module_env, reinterpret_cast<JsCallContext*>(instance), &factory)) 
{
+        return NULL;
+      }
+         }
+
+    if (!NPVARIANT_IS_OBJECT(factory.get()->GetWrapperToken()))
+      return NULL;
+    NPObject* fo = NPVARIANT_TO_OBJECT(factory.get()->GetWrapperToken());
+    NPN_RetainObject(fo);
+    
+    return fo;
+  }
+
+  virtual void SuspendObjectCreation() {
+    if (factory.get())
+      factory.get()->SuspendObjectCreation();
+  }
+
+  virtual void ResumeObjectCreationAndUpdatePermissions() {
+    if (factory.get())
+      factory.get()->ResumeObjectCreationAndUpdatePermissions();
+  }
+
+ private:
+  JsRunnerInterface* js_runner;
+  scoped_refptr<GearsFactoryImpl> factory;
+};
+
+//static
+void OperaUtils::Init(OpGearsAPI* instance, ThreadId main_thread) {
+  g_opera_api = instance;
+  g_main_thread = main_thread;
+}
+
+// static
+OpGearsAPI* OperaUtils::GetGearsApi() {
+  assert(g_opera_api != NULL);
+  return g_opera_api;
+}
+
+// static
+ThreadId OperaUtils::GetMainThreadId() {
+  assert(g_main_thread != NULL);
+  return g_main_thread;
+}
+
+// static
+OperaWorkerThread* OperaUtils::CreateWorkerThread() {
+  OperaWorkerThreadImpl* opw = new OperaWorkerThreadImpl();
+  return opw;
+}
+
+// static
+void OperaUtils::OpenSettingsDialog() {
+  SettingsDialog::Run(NULL);
+}
==== 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.h#1 - 
c:\MyDocs\Gears3/googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.h
 ====
# action=add type=text
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ googleclient/gears/opensource/gears/base/opera_mobile/opera_utils.h 
2008-11-24 17:43:50.000000000 +0000
@@ -0,0 +1,45 @@
+// Copyright 2008, Google Inc.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//  1. Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//  2. Redistributions in binary form must reproduce the above copyright 
notice,
+//     this list of conditions and the following disclaimer in the 
documentation
+//     and/or other materials provided with the distribution.
+//  3. Neither the name of Google Inc. nor the names of its contributors may be
+//     used to endorse or promote products derived from this software without
+//     specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GEARS_BASE_OPERA_MOBILE_OPERA_UTILS_H__
+#define GEARS_BASE_OPERA_MOBILE_OPERA_UTILS_H__
+
+#include "gears/base/common/message_queue.h"  // For ThreadId
+
+class OpGearsAPI;
+class OperaWorkerThread;
+
+
+class OperaUtils {
+ public:
+  static void Init(OpGearsAPI* instance, ThreadId main_thread);
+
+  static OpGearsAPI* GetGearsApi();
+  static ThreadId GetMainThreadId();
+  static OperaWorkerThread* CreateWorkerThread();
+  static void OpenSettingsDialog();
+};
+
+#endif // GEARS_BASE_OPERA_MOBILE_OPERA_UTILS_H__
==== 
//depot/googleclient/gears/opensource/gears/base/opera_mobile/opera_worker.h#1 
- 
c:\MyDocs\Gears3/googleclient/gears/opensource/gears/base/opera_mobile/opera_worker.h
 ====
# action=add type=text
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ googleclient/gears/opensource/gears/base/opera_mobile/opera_worker.h        
2008-11-24 17:36:44.000000000 +0000
@@ -0,0 +1,44 @@
+// Copyright 2008, Google Inc.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//  1. Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//  2. Redistributions in binary form must reproduce the above copyright 
notice,
+//     this list of conditions and the following disclaimer in the 
documentation
+//     and/or other materials provided with the distribution.
+//  3. Neither the name of Google Inc. nor the names of its contributors may be
+//     used to endorse or promote products derived from this software without
+//     specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GEARS_BASE_OPERA_OPERA_MOBILE_WORKER_H__
+#define GEARS_BASE_OPERA_OPERA_MOBILE_WORKER_H__
+
+#include "third_party/npapi/npapi.h" // for NPP
+
+struct NPObject;
+
+class OperaWorkerThread {
+ public:
+  virtual ~OperaWorkerThread() {}
+  virtual void Destroy() = 0;
+  
+  virtual NPObject* CreateWorkerFactory(NPP instance, NPObject* global_object,
+                                        const unsigned short* url) = 0;
+  virtual void SuspendObjectCreation() = 0;
+  virtual void ResumeObjectCreationAndUpdatePermissions() = 0;
+};
+
+#endif // GEARS_BASE_OPERA_OPERA_WORKER_H__
==== 
//depot/googleclient/gears/opensource/third_party/opera_mobile/opera_callback_api.h#1
 - 
c:\MyDocs\Gears3/googleclient/gears/opensource/third_party/opera_mobile/opera_callback_api.h
 ====
# action=add type=text
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ googleclient/gears/opensource/third_party/opera_mobile/opera_callback_api.h 
2008-11-24 17:54:08.000000000 +0000
@@ -0,0 +1,94 @@
+#ifndef OPERA_OPERA_CALLBACK_API_H__
+#define OPERA_OPERA_CALLBACK_API_H__
+
+#include "third_party/npapi/npapi.h" // for NPP
+
+struct NPObject;
+class OpGearsAPI;
+class OperaCallbacks;
+class OperaWorkerThread;
+class OpLocalServerInterface;
+
+typedef void (*OP_Initialize_func)(OpGearsAPI *, OperaCallbacks *);
+typedef OperaWorkerThread* (*CreateWorker_func)();
+typedef NPObject* (*CloneObject_func)(NPObject *object);
+typedef void (*OpenSettingsDialog_func)();
+typedef void (*LocalServerInitialize_func)(
+    OpLocalServerInterface **opera_local_server_instance);
+
+class OperaCallbacks {
+ public:
+  CreateWorker_func CreateWorker;
+  CloneObject_func CloneObject;
+  OpenSettingsDialog_func OpenSettingsDialog;
+  LocalServerInitialize_func LocalServerInitialize;
+};
+
+class OpHTTPRequestDataProviderInterface {
+ public:
+  virtual bool IsAsync() = 0;
+  virtual bool GetNextReqHeader(const unsigned short *&name,
+                                const unsigned short *&value) = 0;
+  virtual const unsigned short*        GetUrl() = 0;
+  virtual const unsigned short*        GetMethod() = 0;
+  virtual long GetPostData(unsigned char* buffer, long max_size) = 0;
+};
+
+class OpUrlData {
+ public:
+  virtual unsigned intGetStatus() = 0;
+  virtual void GetStatusText(const char *&status) = 0;
+  virtual void GetBodyText(const char *&content,
+                           unsigned long &content_length) = 0;
+  virtual void GetResponseHeaders(const char *&headers) = 0;
+  virtual void GetResponseCharset(const char *&charset) = 0;
+  virtual bool IsFinished() = 0;
+  virtual void OnCompleted() = 0;
+};
+
+class OpHTTPListener {
+ public:
+  enum RedirectStatus
+  {
+    REDIRECT_OK,
+    REDIRECT_CANCEL
+  };
+
+  enum LoadingError
+  {
+    LERROR_GENERIC,
+    LERROR_OUT_OF_MEMORY
+  };
+
+  virtual void OnDataReceived() = 0;
+  virtual RedirectStatus OnRedirected(const unsigned short* redirect_url) = 0;
+  virtual void OnError(LoadingError err) = 0;
+  virtual void OnRequestCreated(OpUrlData* data) = 0;
+  virtual void OnRequestDestroyed() = 0;
+};
+
+class OpDialogListener {
+ public:
+  virtual void OnClose(const unsigned short *result) = 0;
+};
+
+class OpGearsAPI {
+ public:
+  virtual      void RequestUrl(NPP plugin_instance,
+                          OpHTTPRequestDataProviderInterface *req_data,
+                          OpHTTPListener *listener) = 0;
+  virtual void OpenDialog(NPP plugin_instance,
+                           const unsigned short *html_file,
+                           int width,
+                           int height,
+                           const unsigned short *arguments_string,
+                           const unsigned short *&result) = 0;
+  virtual NPObject* CreateWorkerPool(NPP plugin_instance,
+                                     NPObject* factory) = 0;
+  virtual      void SetCurrentGlobalObject(NPP plugin_instance,
+                                      NPObject* global_object) = 0;
+  virtual void GetCookieString(const unsigned short *url,
+                               const char *&cookie_out) = 0;
+};
+
+#endif // OPERA_OPERA_CALLBACK_API_H__
==== 
//depot/googleclient/gears/opensource/third_party/opera_mobile/opera_local_server_interface.h#1
 - 
c:\MyDocs\Gears3/googleclient/gears/opensource/third_party/opera_mobile/opera_local_server_interface.h
 ====
# action=add type=text
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ 
googleclient/gears/opensource/third_party/opera_mobile/opera_local_server_interface.h
       2008-11-24 17:17:48.000000000 +0000
@@ -0,0 +1,26 @@
+#ifndef OPERA_LOCAL_SERVER_INTERFACE_H__
+#define OPERA_LOCAL_SERVER_INTERFACE_H__
+
+class OpCacheReaderInterface {
+ public:
+  virtual bool GetHeaderData(const unsigned short *url,
+                             char **header_str,
+                             int &header_length) = 0;
+  virtual void ReleaseHeaderData() = 0;
+  virtual int GetBodyData(char *header_str, int buffer_length) = 0;
+  virtual bool More() = 0;
+  virtual void Destroy() = 0;
+ protected:
+  virtual ~OpCacheReaderInterface() {}
+};
+
+class OpLocalServerInterface {
+ public:
+  virtual bool CanService(const unsigned short *url) = 0;
+  virtual OpCacheReaderInterface *GetCacheReader() = 0;
+  virtual void Destroy() = 0;
+ protected:
+  virtual ~OpLocalServerInterface() {}
+};
+
+#endif // OPERA_LOCAL_SERVER_INTERFACE_H__

Reply via email to