Browse Source

iOS share link

Denis Muratshin 8 years ago
parent
commit
74409ae7b7
4 changed files with 543 additions and 492 deletions
  1. 309 306
      src/facebook.cpp
  2. 166 157
      src/facebook.h
  3. 30 28
      src/ios/iosFacebook.h
  4. 38 1
      src/ios/iosFacebook.mm

+ 309 - 306
src/facebook.cpp

@@ -1,306 +1,309 @@
-#include "facebook.h"
-
-#ifdef __ANDROID__
-#include "android/AndroidFacebook.h"
-
-#elif __APPLE__
-#include <TargetConditionals.h>
-#include "ios/iosFacebook.h"
-#else
-#include "sim/FacebookSimulator.h"
-#endif
-
-#include "ox/json.hpp"
-
-
-namespace facebook
-{
-    namespace internal
-    {
-        using namespace std;
-
-        cbInit          fInit = []() {};
-        cbFree          fFree = []() {};
-        cbLogin         fLogin = [](const vector<string>& permissions) {};
-        cbLogout        fLogout = []() {};
-        cbNewMeRequest  fNewMeRequest = []() {};
-        cbGetFriends    fGetFriends = []() {};
-        cbGameRequest   fGameRequest = [](const string& title, const string& text, const vector<string>& dest, const string& objectID, const std::string& userData) {};
-
-        cbRequestInvitableFriends fRequestInvitableFriends = [](const vector<string>&) {};
-
-        cbIsLoggedIn     fIsLoggedIn = []() {return false; };
-        cbGetUserID      fGetUserID = []() {return std::string(""); };
-        cbGetAccessToken fGetAccessToken = []() {return std::string(""); };
-        cbGetAppID       fGetAppID = []() {return std::string(""); };
-        cbGetAccessTokenPermissions fGetAccessTokenPermissions = []() {return std::vector<string>();};
-    }
-
-    using namespace internal;
-
-
-    spEventDispatcher _dispatcher;
-
-    spEventDispatcher dispatcher()
-    {
-        return _dispatcher;
-    }
-
-    void init()
-    {
-#ifdef __ANDROID__
-        fInit = jniFacebookInit;
-        fFree = jniFacebookFree;
-
-        fLogin = jniFacebookLogin;
-        fLogout = jniFacebookLogout;
-        fNewMeRequest = jniFacebookNewMeRequest;
-        fGetFriends = jniFacebookGetFriends;
-        fIsLoggedIn = jniFacebookIsLoggedIn;
-        fGetUserID = jniFacebookGetUserID;
-        fGetAccessToken = jniFacebookGetAccessToken;
-        fGetAppID = jniFacebookGetAppID;
-        fGameRequest = jniFacebookGameRequest;
-        fGetAccessTokenPermissions = jniFacebookGetAccessTokenPermissions;
-        fRequestInvitableFriends = jniFacebookRequestInvitableFriends;
-#elif TARGET_OS_IPHONE
-        fInit = iosFacebookInit;
-        fFree = iosFacebookFree;
-        fLogin = iosFacebookLogin;
-        fLogout = iosFacebookLogout;
-        fNewMeRequest = iosFacebookRequestMe;
-        fGetFriends = []() {OX_ASSERT(0); };
-        fIsLoggedIn = []() {OX_ASSERT(0); return false; };
-        fGetUserID = iosFacebookGetUserID;
-        fGetAccessToken = iosFacebookGetAccessToken;
-        fGetAppID = []() {OX_ASSERT(0); return std::string(""); };
-        fGameRequest = iosFacebookGameRequest;
-        fGetAccessTokenPermissions = iosFacebookGetPermissions;
-        fRequestInvitableFriends = iosFacebookRequestInvitableFriends;
-#else
-        fInit = facebookSimulatorInit;
-        fFree = facebookSimulatorFree;
-        fLogin = facebookSimulatorLogin;
-        fLogout = facebookSimulatorLogout;
-        fNewMeRequest = facebookSimulatorNewMeRequest;
-        fGetFriends = facebookSimulatorGetFriends;
-        fIsLoggedIn = facebookSimulatorIsLoggedIn;
-        fGetUserID = facebookSimulatorGetUserID;
-        fGetAccessToken = facebookSimulatorGetAccessToken;
-        fGetAppID = facebookSimulatorGetAppID;
-        fGameRequest = facebookSimulatorGameRequest;
-        fGetAccessTokenPermissions = facebookSimulatorGetAccessTokenPermissions;
-        fRequestInvitableFriends = facebookSimulatorInvitableFriendsRequest;
-#endif
-
-
-        log::messageln("facebook::init");
-        OX_ASSERT(_dispatcher == 0);
-        _dispatcher = new EventDispatcher;
-
-        fInit();
-
-        log::messageln("facebook::init done");
-    }
-
-    void free()
-    {
-        log::messageln("facebook::free");
-
-        OX_ASSERT(_dispatcher);
-
-        fFree();
-
-        _dispatcher->removeAllEventListeners();
-        _dispatcher = 0;
-        log::messageln("facebook::free done");
-    }
-
-    void login(const vector<string>& permissions)
-    {
-        log::messageln("facebook::login");
-
-        fLogin(permissions);
-
-        log::messageln("facebook::login done");
-    }
-
-    void logout()
-    {
-
-        log::messageln("facebook::logout");
-        fLogout();
-        log::messageln("facebook::logout done");
-    }
-
-    bool appInviteDialog(const string& appLinkUrl, const string& previewImageUrl)
-    {
-        log::messageln("facebook::AppInviteDialog");
-
-#ifdef __ANDROID__
-        return jniFacebookAppInviteDialog(appLinkUrl, previewImageUrl);
-#elif TARGET_OS_IPHONE
-#else
-        return facebookSimulatorAppInviteDialog(appLinkUrl, previewImageUrl);
-#endif
-        return false;
-
-    }
-
-    void newMeRequest()
-    {
-        log::messageln("facebook::newMeRequest");
-        fNewMeRequest();
-        log::messageln("facebook::newMeRequest done");
-    }
-
-    void gameRequest(const string& title, const string& text, const vector<string>& dest, const string& objectID, const string& userData)
-    {
-        fGameRequest(title, text, dest, objectID, userData);
-    }
-
-    void requestInvitableFriends(const vector<string>& exclude)
-    {
-        log::messageln("facebook::requestInvitableFriends");
-        fRequestInvitableFriends(exclude);
-    }
-
-    void getFriends()
-    {
-        log::messageln("facebook::getFriends");
-        fGetFriends();
-        log::messageln("facebook::getFriends done");
-    }
-
-    bool isLoggedIn()
-    {
-        log::messageln("facebook::isLoggined");
-        return fIsLoggedIn();
-    }
-
-    string getAccessToken()
-    {
-        log::messageln("facebook::getAccessToken");
-        string token = fGetAccessToken();
-        log::messageln("%s", token.c_str());
-        return token;
-    }
-
-    vector<string> getAccessTokenPermissions()
-    {
-        log::messageln("facebook::getAccessToken");
-        vector<string> res = fGetAccessTokenPermissions();
-        string str;
-        for (const auto& s : res)
-            str += s + ",";
-        if (!str.empty())
-            str.pop_back();
-        log::messageln("permissions: %s", str.c_str());
-
-        return res;
-    }
-
-    string getUserID()
-    {
-        log::messageln("facebook::getUserID");
-        string id = fGetUserID();
-
-        log::messageln("%s", id.c_str());
-
-        return id;
-    }
-
-    string getAppID()
-    {
-        return fGetAppID();
-    }
-
-    GameRequestEvent::GameRequestEvent(const string& Data, bool Canceled) : Event(EVENT), data(Data), canceled(Canceled)
-    {
-        Json::Reader reader;
-        Json::Value value;
-
-        bool ok = !Data.empty();
-        if (ok)
-            ok = reader.parse((char*)&Data.front(), (char*)&Data.front() + Data.size(), value, false);
-        if (ok)
-        {
-            const Json::Value& jr = value["request"];
-            if (!jr.isNull())
-                request = jr.asString();
-
-            const Json::Value& jto = value["to"];
-            if (!jto.isNull())
-            {
-                for (Json::ArrayIndex i = 0; i < jto.size(); ++i)
-                {
-                    to.push_back(jto[i].asString());
-                }
-            }
-        }
-    }
-
-    namespace internal
-    {
-        void newToken(const string& value)
-        {
-            log::messageln("facebook::internal::newToken %s", value.c_str());
-            TokenEvent ev;
-            ev.token = value;
-            if (_dispatcher)
-                _dispatcher->dispatchEvent(&ev);
-        }
-
-        void loginResult(bool value)
-        {
-            log::messageln("facebook::internal::loginResult %d", value);
-            LoginEvent ev;
-            ev.isLoggedIn = value;
-            if (_dispatcher)
-                _dispatcher->dispatchEvent(&ev);
-        }
-
-        void newMeRequestResult(const string& data, bool error)
-        {
-            log::messageln("facebook::internal::newMeRequestResult %s", data.c_str());
-
-            NewMeRequestEvent event;
-            Json::Reader reader;
-            Json::Value root;
-            bool parsingSuccessful = reader.parse(data.c_str(), root);     //parse process
-            if (!parsingSuccessful || error)
-            {
-                event.error = true;
-                log::messageln("newMeRequestResult error %s", error ? "response error" : "parse error");
-                return;
-            }
-            else
-            {
-                event.data = data;
-            }
-
-            if (_dispatcher)
-                _dispatcher->dispatchEvent(&event);
-        }
-
-        void newMyFriendsRequestResult(const string& data, bool error)
-        {
-            log::messageln("facebook::internal::newMyFriendsRequestResult %s", data.c_str());
-        }
-
-        void gameRequestResult(const string& data, bool canceled)
-        {
-            log::messageln("facebook::internal::gameRequestResult %s", data.c_str());
-            GameRequestEvent ev(data, canceled);
-            if (_dispatcher)
-                _dispatcher->dispatchEvent(&ev);
-        }
-
-        void dispatch(Event* ev)
-        {
-            if (_dispatcher)
-                _dispatcher->dispatchEvent(ev);
-        }
-    }
-}
-
+#include "facebook.h"
+
+#ifdef __ANDROID__
+#include "android/AndroidFacebook.h"
+
+#elif __APPLE__
+#include <TargetConditionals.h>
+#include "ios/iosFacebook.h"
+#else
+#include "sim/FacebookSimulator.h"
+#endif
+
+#include "ox/json.hpp"
+
+
+namespace facebook
+{
+    namespace internal
+    {
+        using namespace std;
+
+        cbInit          fInit = []() {};
+        cbFree          fFree = []() {};
+        cbLogin         fLogin = [](const vector<string>& permissions) {};
+        cbLogout        fLogout = []() {};
+        cbNewMeRequest  fNewMeRequest = []() {};
+        cbGetFriends    fGetFriends = []() {};
+        cbGameRequest   fGameRequest = [](const string& title, const string& text, const vector<string>& dest, const string& objectID, const std::string& userData) {};
+
+        cbRequestInvitableFriends fRequestInvitableFriends = [](const vector<string>&) {};
+
+        cbIsLoggedIn     fIsLoggedIn = []() {return false; };
+        cbGetUserID      fGetUserID = []() {return std::string(""); };
+        cbGetAccessToken fGetAccessToken = []() {return std::string(""); };
+        cbGetAppID       fGetAppID = []() {return std::string(""); };
+        cbGetAccessTokenPermissions fGetAccessTokenPermissions = []() {return std::vector<string>();};
+    }
+
+    using namespace internal;
+
+
+    spEventDispatcher _dispatcher;
+
+    spEventDispatcher dispatcher()
+    {
+        return _dispatcher;
+    }
+
+    void init()
+    {
+#ifdef __ANDROID__
+        fInit = jniFacebookInit;
+        fFree = jniFacebookFree;
+
+        fLogin = jniFacebookLogin;
+        fLogout = jniFacebookLogout;
+        fNewMeRequest = jniFacebookNewMeRequest;
+        fGetFriends = jniFacebookGetFriends;
+        fIsLoggedIn = jniFacebookIsLoggedIn;
+        fGetUserID = jniFacebookGetUserID;
+        fGetAccessToken = jniFacebookGetAccessToken;
+        fGetAppID = jniFacebookGetAppID;
+        fGameRequest = jniFacebookGameRequest;
+        fGetAccessTokenPermissions = jniFacebookGetAccessTokenPermissions;
+        fRequestInvitableFriends = jniFacebookRequestInvitableFriends;
+#elif TARGET_OS_IPHONE
+        fInit = iosFacebookInit;
+        fFree = iosFacebookFree;
+        fLogin = iosFacebookLogin;
+        fLogout = iosFacebookLogout;
+        fNewMeRequest = iosFacebookRequestMe;
+        fGetFriends = []() {OX_ASSERT(0); };
+        fIsLoggedIn = []() {OX_ASSERT(0); return false; };
+        fGetUserID = iosFacebookGetUserID;
+        fGetAccessToken = iosFacebookGetAccessToken;
+        fGetAppID = []() {OX_ASSERT(0); return std::string(""); };
+        fGameRequest = iosFacebookGameRequest;
+        fGetAccessTokenPermissions = iosFacebookGetPermissions;
+        fRequestInvitableFriends = iosFacebookRequestInvitableFriends;
+#else
+        fInit = facebookSimulatorInit;
+        fFree = facebookSimulatorFree;
+        fLogin = facebookSimulatorLogin;
+        fLogout = facebookSimulatorLogout;
+        fNewMeRequest = facebookSimulatorNewMeRequest;
+        fGetFriends = facebookSimulatorGetFriends;
+        fIsLoggedIn = facebookSimulatorIsLoggedIn;
+        fGetUserID = facebookSimulatorGetUserID;
+        fGetAccessToken = facebookSimulatorGetAccessToken;
+        fGetAppID = facebookSimulatorGetAppID;
+        fGameRequest = facebookSimulatorGameRequest;
+        fGetAccessTokenPermissions = facebookSimulatorGetAccessTokenPermissions;
+        fRequestInvitableFriends = facebookSimulatorInvitableFriendsRequest;
+#endif
+
+
+        log::messageln("facebook::init");
+        OX_ASSERT(_dispatcher == 0);
+        _dispatcher = new EventDispatcher;
+
+        fInit();
+
+        log::messageln("facebook::init done");
+    }
+
+    void free()
+    {
+        log::messageln("facebook::free");
+
+        OX_ASSERT(_dispatcher);
+
+        fFree();
+
+        _dispatcher->removeAllEventListeners();
+        _dispatcher = 0;
+        log::messageln("facebook::free done");
+    }
+
+    void login(const vector<string>& permissions)
+    {
+        log::messageln("facebook::login");
+
+        fLogin(permissions);
+
+        log::messageln("facebook::login done");
+    }
+
+    void logout()
+    {
+
+        log::messageln("facebook::logout");
+        fLogout();
+        log::messageln("facebook::logout done");
+    }
+
+    bool appInviteDialog(const string& appLinkUrl, const string& previewImageUrl)
+    {
+        log::messageln("facebook::AppInviteDialog");
+
+#ifdef __ANDROID__
+        return jniFacebookAppInviteDialog(appLinkUrl, previewImageUrl);
+#elif TARGET_OS_IPHONE
+#else
+        return facebookSimulatorAppInviteDialog(appLinkUrl, previewImageUrl);
+#endif
+        return false;
+
+    }
+
+    void newMeRequest()
+    {
+        log::messageln("facebook::newMeRequest");
+        fNewMeRequest();
+        log::messageln("facebook::newMeRequest done");
+    }
+
+    void gameRequest(const string& title, const string& text, const vector<string>& dest, const string& objectID, const string& userData)
+    {
+        fGameRequest(title, text, dest, objectID, userData);
+    }
+
+    void requestInvitableFriends(const vector<string>& exclude)
+    {
+        log::messageln("facebook::requestInvitableFriends");
+        fRequestInvitableFriends(exclude);
+    }
+
+    void getFriends()
+    {
+        log::messageln("facebook::getFriends");
+        fGetFriends();
+        log::messageln("facebook::getFriends done");
+    }
+
+    bool isLoggedIn()
+    {
+        log::messageln("facebook::isLoggined");
+        return fIsLoggedIn();
+    }
+
+    string getAccessToken()
+    {
+        log::messageln("facebook::getAccessToken");
+        string token = fGetAccessToken();
+        log::messageln("%s", token.c_str());
+        return token;
+    }
+
+    vector<string> getAccessTokenPermissions()
+    {
+        log::messageln("facebook::getAccessToken");
+        vector<string> res = fGetAccessTokenPermissions();
+        string str;
+        for (const auto& s : res)
+            str += s + ",";
+        if (!str.empty())
+            str.pop_back();
+        log::messageln("permissions: %s", str.c_str());
+
+        return res;
+    }
+
+    string getUserID()
+    {
+        log::messageln("facebook::getUserID");
+        string id = fGetUserID();
+
+        log::messageln("%s", id.c_str());
+
+        return id;
+    }
+
+    string getAppID()
+    {
+        return fGetAppID();
+    }
+
+    GameRequestEvent::GameRequestEvent(const string& Data, bool Canceled) : Event(EVENT), data(Data), canceled(Canceled)
+    {
+        Json::Reader reader;
+        Json::Value value;
+
+        bool ok = !Data.empty();
+        if (ok)
+            ok = reader.parse((char*)&Data.front(), (char*)&Data.front() + Data.size(), value, false);
+        if (ok)
+        {
+            const Json::Value& jr = value["request"];
+            if (!jr.isNull())
+                request = jr.asString();
+
+            const Json::Value& jto = value["to"];
+            if (!jto.isNull())
+            {
+                for (Json::ArrayIndex i = 0; i < jto.size(); ++i)
+                {
+                    to.push_back(jto[i].asString());
+                }
+            }
+        }
+    }
+    
+    
+    ShareEvent::ShareEvent(bool Canceled):Event(EVENT), canceled(Canceled){}
+
+    namespace internal
+    {
+        void newToken(const string& value)
+        {
+            log::messageln("facebook::internal::newToken %s", value.c_str());
+            TokenEvent ev;
+            ev.token = value;
+            if (_dispatcher)
+                _dispatcher->dispatchEvent(&ev);
+        }
+
+        void loginResult(bool value)
+        {
+            log::messageln("facebook::internal::loginResult %d", value);
+            LoginEvent ev;
+            ev.isLoggedIn = value;
+            if (_dispatcher)
+                _dispatcher->dispatchEvent(&ev);
+        }
+
+        void newMeRequestResult(const string& data, bool error)
+        {
+            log::messageln("facebook::internal::newMeRequestResult %s", data.c_str());
+
+            NewMeRequestEvent event;
+            Json::Reader reader;
+            Json::Value root;
+            bool parsingSuccessful = reader.parse(data.c_str(), root);     //parse process
+            if (!parsingSuccessful || error)
+            {
+                event.error = true;
+                log::messageln("newMeRequestResult error %s", error ? "response error" : "parse error");
+                return;
+            }
+            else
+            {
+                event.data = data;
+            }
+
+            if (_dispatcher)
+                _dispatcher->dispatchEvent(&event);
+        }
+
+        void newMyFriendsRequestResult(const string& data, bool error)
+        {
+            log::messageln("facebook::internal::newMyFriendsRequestResult %s", data.c_str());
+        }
+
+        void gameRequestResult(const string& data, bool canceled)
+        {
+            log::messageln("facebook::internal::gameRequestResult %s", data.c_str());
+            GameRequestEvent ev(data, canceled);
+            if (_dispatcher)
+                _dispatcher->dispatchEvent(&ev);
+        }
+
+        void dispatch(Event* ev)
+        {
+            if (_dispatcher)
+                _dispatcher->dispatchEvent(ev);
+        }
+    }
+}
+

+ 166 - 157
src/facebook.h

@@ -1,157 +1,166 @@
-#pragma once
-
-#include "oxygine/EventDispatcher.h"
-#include "oxygine/Event.h"
-#include "oxygine/json/json.h"
-#include <string>
-#include <list>
-
-using namespace std;
-using namespace oxygine;
-
-namespace facebook
-{
-
-    void init();
-    void free();
-
-    class NewMeRequestEvent : public Event
-    {
-    public:
-        enum { EVENT = sysEventID('f', 'b', 'n') };
-        NewMeRequestEvent() : Event(EVENT) {}
-
-        string data;
-
-        bool error = false;
-    };
-
-    class LoginEvent : public Event
-    {
-    public:
-        enum { EVENT = sysEventID('f', 'b', 'l')};
-        LoginEvent() : Event(EVENT) {}
-        bool isLoggedIn = false;
-    };
-
-    class FriendsEvent : public Event
-    {
-        enum { EVENT = sysEventID('f', 'b', 'f')};
-        FriendsEvent() : Event(EVENT) {}
-
-        struct friend_Data
-        {
-            string name;
-        };
-
-        typedef list<friend_Data> friends_list;
-
-        friends_list friends;
-        bool error = false;
-
-    };
-
-    class InvitableFriendsEvent: public Event
-    {
-    public:
-        enum {EVENT = sysEventID('f', 'I', 'F')};
-
-        InvitableFriendsEvent(): Event(EVENT), status(-1) {}
-        struct Friend
-        {
-            string id;
-            string name;
-            string url;
-        };
-
-        //vector<Friend> friends;
-        string data;
-        int status;//ok = 0; end = -1, error = -2
-
-    };
-
-    class TokenEvent : public Event
-    {
-    public:
-        enum { EVENT = sysEventID('f', 'b', 't')};
-        TokenEvent() : Event(EVENT) {};
-
-        string token;
-    };
-
-    class GameRequestEvent: public Event
-    {
-    public:
-        enum {EVENT = sysEventID('f', 'g', 'r')};
-        GameRequestEvent(const string& Data, bool Canceled);
-
-        string data;
-        bool canceled;
-
-
-        string request;
-        vector<string> to;
-    };
-
-    spEventDispatcher dispatcher();
-
-    bool isLoggedIn();
-    void login(const vector<string>& permissions);
-    void logout();
-    void getFriends();
-    void newMeRequest();
-    void gameRequest(const string& title, const string& text, const vector<string>& dest, const string& objectID, const string& userData);
-    void requestInvitableFriends(const vector<string>& exclude);
-
-
-    bool appInviteDialog(const string& appLinkUrl, const string& previewImageUrl);
-
-    string getAccessToken();
-    string getUserID();
-    string getAppID();
-    vector<string> getAccessTokenPermissions();
-
-    namespace internal
-    {
-        typedef void(*cbInit)();
-        typedef void(*cbFree)();
-        typedef void(*cbLogin)(const vector<string>& permissions);
-        typedef void(*cbLogout)();
-        typedef void(*cbNewMeRequest)();
-        typedef void(*cbGameRequest)(const string& title, const string& text, const vector<string>& dest, const string& objectID, const std::string& userData);
-        typedef void(*cbGetFriends)();
-
-        typedef void(*cbRequestInvitableFriends)(const vector<string>&);
-
-        typedef bool(*cbIsLoggedIn)();
-        typedef std::string(*cbGetUserID)();
-        typedef std::string(*cbGetAccessToken)();
-        typedef std::string(*cbGetAppID)();
-
-        typedef std::vector<std::string>(*cbGetAccessTokenPermissions)();
-
-        extern cbInit                       fInit;
-        extern cbFree                       fFree;
-        extern cbLogin                      fLogin;
-        extern cbLogout                     fLogout;
-        extern cbNewMeRequest               fNewMeRequest;
-        extern cbGetFriends                 fGetFriends;
-        extern cbRequestInvitableFriends    fRequestInvitableFriends;
-        extern cbGameRequest                fGameRequest;
-        extern cbIsLoggedIn                 fIsLoggedIn;
-        extern cbGetUserID                  fGetUserID;
-        extern cbGetAccessToken             fGetAccessToken;
-        extern cbGetAppID                   fGetAppID;
-        extern cbGetAccessTokenPermissions  fGetAccessTokenPermissions;
-
-        void newMeRequestResult(const string& data, bool error);
-        void loginResult(bool value);
-        void newToken(const string& value);
-        void newMyFriendsRequestResult(const string& data, bool error);
-
-        void gameRequestResult(const string& id, bool canceled);
-        //void resultInvitableFriends(int page, vector<);
-
-        void dispatch(Event*);
-    }
-};
+#pragma once
+
+#include "oxygine/EventDispatcher.h"
+#include "oxygine/Event.h"
+#include "oxygine/json/json.h"
+#include <string>
+#include <list>
+
+using namespace std;
+using namespace oxygine;
+
+namespace facebook
+{
+
+    void init();
+    void free();
+
+    class NewMeRequestEvent : public Event
+    {
+    public:
+        enum { EVENT = sysEventID('f', 'b', 'n') };
+        NewMeRequestEvent() : Event(EVENT) {}
+
+        string data;
+
+        bool error = false;
+    };
+
+    class LoginEvent : public Event
+    {
+    public:
+        enum { EVENT = sysEventID('f', 'b', 'l')};
+        LoginEvent() : Event(EVENT) {}
+        bool isLoggedIn = false;
+    };
+
+    class FriendsEvent : public Event
+    {
+        enum { EVENT = sysEventID('f', 'b', 'f')};
+        FriendsEvent() : Event(EVENT) {}
+
+        struct friend_Data
+        {
+            string name;
+        };
+
+        typedef list<friend_Data> friends_list;
+
+        friends_list friends;
+        bool error = false;
+
+    };
+
+    class InvitableFriendsEvent: public Event
+    {
+    public:
+        enum {EVENT = sysEventID('f', 'I', 'F')};
+
+        InvitableFriendsEvent(): Event(EVENT), status(-1) {}
+        struct Friend
+        {
+            string id;
+            string name;
+            string url;
+        };
+
+        //vector<Friend> friends;
+        string data;
+        int status;//ok = 0; end = -1, error = -2
+
+    };
+
+    class TokenEvent : public Event
+    {
+    public:
+        enum { EVENT = sysEventID('f', 'b', 't')};
+        TokenEvent() : Event(EVENT) {};
+
+        string token;
+    };
+
+    class GameRequestEvent: public Event
+    {
+    public:
+        enum {EVENT = sysEventID('f', 'g', 'r')};
+        GameRequestEvent(const string& Data, bool Canceled);
+
+        string data;
+        bool canceled;
+
+
+        string request;
+        vector<string> to;
+    };
+    
+    class ShareEvent: public Event
+    {
+    public:
+        enum {EVENT = sysEventID('f', 'S', 'h')};
+        bool canceled;
+        
+        ShareEvent(bool canceled);
+    };
+
+    spEventDispatcher dispatcher();
+
+    bool isLoggedIn();
+    void login(const vector<string>& permissions);
+    void logout();
+    void getFriends();
+    void newMeRequest();
+    void gameRequest(const string& title, const string& text, const vector<string>& dest, const string& objectID, const string& userData);
+    void requestInvitableFriends(const vector<string>& exclude);
+
+
+    bool appInviteDialog(const string& appLinkUrl, const string& previewImageUrl);
+
+    string getAccessToken();
+    string getUserID();
+    string getAppID();
+    vector<string> getAccessTokenPermissions();
+
+    namespace internal
+    {
+        typedef void(*cbInit)();
+        typedef void(*cbFree)();
+        typedef void(*cbLogin)(const vector<string>& permissions);
+        typedef void(*cbLogout)();
+        typedef void(*cbNewMeRequest)();
+        typedef void(*cbGameRequest)(const string& title, const string& text, const vector<string>& dest, const string& objectID, const std::string& userData);
+        typedef void(*cbGetFriends)();
+
+        typedef void(*cbRequestInvitableFriends)(const vector<string>&);
+
+        typedef bool(*cbIsLoggedIn)();
+        typedef std::string(*cbGetUserID)();
+        typedef std::string(*cbGetAccessToken)();
+        typedef std::string(*cbGetAppID)();
+
+        typedef std::vector<std::string>(*cbGetAccessTokenPermissions)();
+
+        extern cbInit                       fInit;
+        extern cbFree                       fFree;
+        extern cbLogin                      fLogin;
+        extern cbLogout                     fLogout;
+        extern cbNewMeRequest               fNewMeRequest;
+        extern cbGetFriends                 fGetFriends;
+        extern cbRequestInvitableFriends    fRequestInvitableFriends;
+        extern cbGameRequest                fGameRequest;
+        extern cbIsLoggedIn                 fIsLoggedIn;
+        extern cbGetUserID                  fGetUserID;
+        extern cbGetAccessToken             fGetAccessToken;
+        extern cbGetAppID                   fGetAppID;
+        extern cbGetAccessTokenPermissions  fGetAccessTokenPermissions;
+
+        void newMeRequestResult(const string& data, bool error);
+        void loginResult(bool value);
+        void newToken(const string& value);
+        void newMyFriendsRequestResult(const string& data, bool error);
+
+        void gameRequestResult(const string& id, bool canceled);
+        //void resultInvitableFriends(int page, vector<);
+
+        void dispatch(Event*);
+    }
+};

+ 30 - 28
src/ios/iosFacebook.h

@@ -1,28 +1,30 @@
-//
-//  Header.h
-//  HelloWorldFacebook_ios
-//
-//  Created by Denis on 17/03/16.
-//  Copyright © 2016 Mac. All rights reserved.
-//
-
-#ifndef Header_h
-#define Header_h
-#include <string>
-#include <vector>
-
-void iosFacebookInit();
-void iosFacebookFree();
-
-
-void iosFacebookLogin(const std::vector<std::string>& permissions);
-void iosFacebookLogout();
-void iosFacebookGameRequest(const std::string& title, const std::string& text, const std::vector<std::string>& dest, const std::string& objectID, const std::string& userData);
-
-std::string iosFacebookGetAccessToken();
-std::string iosFacebookGetUserID();
-std::string iosFacebookGetAppID();
-std::vector<std::string> iosFacebookGetPermissions();
-void iosFacebookRequestInvitableFriends(const std::vector<std::string>&);
-void iosFacebookRequestMe();
-#endif /* Header_h */
+//
+//  Header.h
+//  HelloWorldFacebook_ios
+//
+//  Created by Denis on 17/03/16.
+//  Copyright © 2016 Mac. All rights reserved.
+//
+
+#ifndef Header_h
+#define Header_h
+#include <string>
+#include <vector>
+
+void iosFacebookInit();
+void iosFacebookFree();
+
+
+void iosFacebookLogin(const std::vector<std::string>& permissions);
+void iosFacebookLogout();
+void iosFacebookGameRequest(const std::string& title, const std::string& text, const std::vector<std::string>& dest, const std::string& objectID, const std::string& userData);
+
+std::string iosFacebookGetAccessToken();
+std::string iosFacebookGetUserID();
+std::string iosFacebookGetAppID();
+std::vector<std::string> iosFacebookGetPermissions();
+void iosFacebookRequestInvitableFriends(const std::vector<std::string>&);
+void iosFacebookRequestMe();
+void iosFacebookShareLink(const std::string &url, const std::string &quote, const std::string& userData);
+
+#endif /* Header_h */

+ 38 - 1
src/ios/iosFacebook.mm

@@ -18,7 +18,7 @@ namespace oxygine
     extern bool _renderEnabled;
 }
 
-@interface FacebookRequests:NSObject<FBSDKGameRequestDialogDelegate>
+@interface FacebookRequests:NSObject<FBSDKGameRequestDialogDelegate, FBSDKSharingDelegate>
 {
 }
 @end
@@ -81,6 +81,30 @@ namespace oxygine
 }
 #pragma mark -
 
+
+- (void)sharer:(id<FBSDKSharing>)sharer didCompleteWithResults:(NSDictionary *)results
+{
+    _renderEnabled = true;
+    facebook::ShareEvent ev(false);
+    facebook::internal::dispatch(&ev);
+}
+
+- (void)sharer:(id<FBSDKSharing>)sharer didFailWithError:(NSError *)error
+{
+    _renderEnabled = true;
+    
+    facebook::ShareEvent ev(true);
+    facebook::internal::dispatch(&ev);
+}
+
+- (void)sharerDidCancel:(id<FBSDKSharing>)sharer
+{
+    _renderEnabled = true;
+    
+    facebook::ShareEvent ev(true);
+    facebook::internal::dispatch(&ev);
+}
+
 @end
 
 FacebookRequests* requests = 0;
@@ -343,3 +367,16 @@ void iosFacebookGameRequest(const string &title, const string &text, const vecto
     
     [dialog show];
 }
+
+void iosFacebookShareLink(const string &url, const string &quote, const string& userData)
+{
+    _renderEnabled = false;
+    
+    FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
+    content.contentURL = [NSURL URLWithString:[NSString stringWithUTF8String:url.c_str()]];
+    content.quote = [NSString stringWithUTF8String:quote.c_str()];
+    
+    [FBSDKShareDialog showFromViewController:getViewcontrollerForFB()
+                                 withContent:content
+                                    delegate:requests];
+}