[email protected] 8 tahun lalu
induk
melakukan
5d031c2075
2 mengubah file dengan 101 tambahan dan 59 penghapusan
  1. 91 55
      src/billing.cpp
  2. 10 4
      src/billing.h

+ 91 - 55
src/billing.cpp

@@ -28,6 +28,39 @@ namespace oxygine
             cbConsume                    fConsume = [](const string&) {};
             cbRequestPurchases           fRequestPurchases = []() {};
             cbRequestDetails             fRequestDetails = [](const std::vector<std::string>& items) {};
+
+            cbParsePurchaseData          fParsePurchaseData = [](const PurchasedEvent *event, ParsedPurchaseData &pdata) {
+
+                Json::Reader reader;
+                Json::Value &data = pdata.data;
+                reader.parse(event->data1, data, false);
+
+                MarketType mt = getMarketType();
+
+                if (mt == google || mt == simulator)
+                {
+                    pdata.productID     = data["productId"].asString();
+                    pdata.purchaseToken = data["purchaseToken"].asString();
+                    pdata.purchaseState = data["purchaseState"].asInt();
+                    pdata.payload       = data["developerPayload"].asString();
+                }
+
+                if (mt == amazon)
+                {
+                    pdata.purchaseToken = data["receiptId"].asString();
+                    pdata.productID     = data["sku"].asString();
+                    pdata.payload       = event->data3;
+                }
+
+                if (mt == ios)
+                {
+                    pdata.productID     = data["productIdentifier"].asString();
+                    pdata.iosTransactionReceipt = data["transactionReceipt"].asString();
+
+                    pdata.purchaseToken = data["transactionIdentifier"].asString();
+                    pdata.payload       = event->data3;
+                }
+            };
         }
 
         using namespace internal;
@@ -48,6 +81,24 @@ namespace oxygine
             fConsume = jniBillingConsume;
             fRequestPurchases = jniBillingGetPurchases;
             fRequestDetails = jniBillingUpdate;
+
+            fParsePurchaseData = [](const PurchasedEvent *event, ParsedPurchaseData &pdata) {
+                MarketType mt = getMarketType();
+                if (mt == google)
+                {
+                    pdata.productID     = pdata.data["productId"].asString();
+                    pdata.purchaseToken = pdata.data["purchaseToken"].asString();
+                    pdata.purchaseState = pdata.data["purchaseState"].asInt();
+                    pdata.payload       = pdata.data["developerPayload"].asString();
+                }
+                if (mt == amazon)
+                {
+                    pdata.purchaseToken = pdata.data["receiptId"].asString();
+                    pdata.productID     = pdata.data["sku"].asString();
+                    pdata.payload       = event->data3;
+                }
+            };
+
 #elif IOS_STORE
             fInit = iosBillingInit;
             fFree = iosBillingFree;
@@ -55,6 +106,14 @@ namespace oxygine
             fConsume = iosBillingConsume;
             fRequestPurchases = iosBillingGetPurchases;
             fRequestDetails = iosBillingUpdate;
+            
+            fParsePurchaseData = [](const PurchasedEvent *event, ParsedPurchaseData &pdata) {
+                pdata.productID             = pdata.data["productIdentifier"].asString();
+                pdata.iosTransactionReceipt = pdata.data["transactionReceipt"].asString();
+                pdata.purchaseToken         = pdata.data["transactionIdentifier"].asString();
+                pdata.payload               = pdata.event->data3;
+            };
+
 #else
             fInit = billingSimulatorInit;
             fFree = billingSimulatorFree;
@@ -62,15 +121,18 @@ namespace oxygine
             fConsume = billingSimulatorConsume;
             fRequestPurchases = billingSimulatorGetPurchases;
             fRequestDetails = billingSimulatorRequestDetails;
-#endif
 
+            fParsePurchaseData = [](const PurchasedEvent *event, ParsedPurchaseData &pdata) {
+                pdata.productID     = pdata.data["productId"].asString();
+                pdata.purchaseToken = pdata.data["purchaseToken"].asString();
+                pdata.purchaseState = pdata.data["purchaseState"].asInt();
+                pdata.payload       = pdata.data["developerPayload"].asString();
+            };
+#endif
 
-            log::messageln("billing::init");
-            OX_ASSERT(_dispatcher == 0);
-            _dispatcher = new EventDispatcher;
 
+            internal::init();
             fInit();
-
             log::messageln("billing::init done");
         }
 
@@ -118,6 +180,11 @@ namespace oxygine
             fPurchase(id, payload);
         }
 
+        void parsePurchaseData(const PurchasedEvent &event, ParsedPurchaseData &data)
+        {
+            fParsePurchaseData(&event, data);
+        }
+
         void consume(const std::string& token)
         {
             log::messageln("billing::consume");
@@ -193,6 +260,23 @@ namespace oxygine
 
         namespace internal
         {
+            void init()
+            {
+                log::messageln("billing::internal::init");
+                OX_ASSERT(_dispatcher == 0);
+                _dispatcher = new EventDispatcher;
+            }
+
+            void dispatch(Event* ev)
+            {
+                if (_dispatcher)
+                    _dispatcher->dispatchEvent(ev);
+                else
+                {
+                    log::error("billing::internal::dispatch can't dispatch event");
+                }
+            }
+
             void purchased(int requestCode, int resultCode, const std::string& data1, const std::string& data2, const std::string& data3)
             {
                 log::messageln("billing::internal::purchased %d %d <%s> <%s> <%s>", requestCode, resultCode, data1.c_str(), data2.c_str(), data3.c_str());
@@ -217,62 +301,14 @@ namespace oxygine
                 }
 
                 PurchasedEvent ev(data1, data2, data3, event);
-                if (_dispatcher)
-                    _dispatcher->dispatchEvent(&ev);
+                dispatch(&ev);
             }
 
             void detailed(const std::string& str)
             {
                 log::messageln("billing::internal::detailed %s", str.c_str());
                 DetailsEvent ev(str);
-                if (_dispatcher)
-                    _dispatcher->dispatchEvent(&ev);
-            }
-
-            /*
-
-            void detailed(const std::string& data_)
-            {
-                Json::Value data;
-
-                Json::Reader reader;
-                reader.parse(data_, data, false);
-
-                DetailsEvent ev(data);
-                _dispatcher->dispatchEvent(&ev);
-            }
-            */
-        }
-
-        ParsePurchasedData::ParsePurchasedData(const PurchasedEvent* event)
-        {
-            Json::Reader reader;
-            reader.parse(event->data1, data, false);
-
-            MarketType mt = getMarketType();
-
-            if (mt == google || mt == simulator)
-            {
-                productID = data["productId"].asString();
-                purchaseToken = data["purchaseToken"].asString();
-                purchaseState = data["purchaseState"].asInt();
-                payload = data["developerPayload"].asString();
-            }
-
-            if (mt == amazon)
-            {
-                purchaseToken = data["receiptId"].asString();
-                productID = data["sku"].asString();
-                payload = event->data3;
-            }
-
-            if (mt == ios)
-            {
-                productID = data["productIdentifier"].asString();
-                iosTransactionReceipt = data["transactionReceipt"].asString();
-
-                purchaseToken = data["transactionIdentifier"].asString();
-                payload = event->data3;
+                dispatch(&ev);
             }
         }
     }

+ 10 - 4
src/billing.h

@@ -27,12 +27,11 @@ namespace oxygine
             std::string data3;
         };
 
-        class ParsePurchasedData
-        {
-        public:
-            ParsePurchasedData(const PurchasedEvent* event);
 
 
+        class ParsedPurchaseData
+        {
+        public:
             Json::Value data;
             Json::Value signature;
 
@@ -122,6 +121,7 @@ namespace oxygine
         void purchase(const std::string& id, const std::string& payload);
         void consume(const std::string& token);
 
+        void parsePurchaseData(const PurchasedEvent &event, ParsedPurchaseData &data);
         /**requestPurchases should be called right after billing::init() or when you are ready to receive purchased
         ios purchases wont work without this;
         */
@@ -151,6 +151,7 @@ namespace oxygine
             typedef void(*cbConsume)(const std::string&);
             typedef void(*cbRequestPurchases)();
             typedef void(*cbRequestDetails)(const std::vector<std::string>& items);
+            typedef void(*cbParsePurchaseData)(const PurchasedEvent *event, ParsedPurchaseData &data);
 
             extern cbInit                       fInit;
             extern cbFree                       fFree;
@@ -158,6 +159,7 @@ namespace oxygine
             extern cbConsume                    fConsume;
             extern cbRequestPurchases           fRequestPurchases;
             extern cbRequestDetails             fRequestDetails;
+            extern cbParsePurchaseData          fParsePurchaseData;
 
             const int ActivityOK = -1;
 
@@ -167,6 +169,10 @@ namespace oxygine
             void purchased(int requestCode, int resultCode, const std::string& data1, const std::string& data2, const std::string& data3);
             //void detailed(const std::string&);
             void detailed(const std::string&);
+
+            void dispatch(Event*);
+
+            void init();
         }
     }
 }