17:39
[skypekit:skypekit.git] / skypekit_2.0.0.190_29281_CB30 / examples / cpp / tutorial / step6 / tutorial_6.cpp
1 /****************************************************************************
2
3 Getting Started With SkypeKit. Tutorial Application, Step 6.
4
5 In this example, we are going to write a command-line Skype dialer. It will:
6   * take a call target from a command line argument 
7   * attempt to initiate a call to that target
8   * exit when the call ends (or fails to connect)
9
10 **/
11
12 #ifdef _WIN32
13 #include "Windows.h"
14 #else
15 #include <unistd.h>
16 #endif
17
18 #include "skype-embedded_2.h"
19 #include "skype-tcp-transport.h"
20 #include "app_token.h"
21
22 using namespace Sid;
23
24 SEString inetAddr   = "127.0.0.1";
25 uint portNum        = 8963;
26
27 bool LoggedIn                   = false;
28 bool LoggedOut                  = false;
29 bool CallFinished               = false;
30 bool IsLiveSessionUp    = false;
31
32 SEString MyAccountName;
33 SEString MyAccountPsw;
34 SEString MyCallTarget;
35
36 SETCPTransport* transport   = 0;
37
38
39 void debugOut(const char* out)
40 {
41     //printf("%s", out);
42 };
43
44 void Delay(int Ms)
45 {
46         #ifdef _WIN32
47                 Sleep(Ms);
48         #else
49                 sleep(Ms);
50         #endif
51 };
52
53
54 //---------------------------------------------------------------------------------------
55 // Subclassing Participant
56
57 class MyParticipant : public Participant
58 {
59 public:
60     typedef DRef<MyParticipant, Participant> Ref;
61     MyParticipant(unsigned int oid, SERootObject* root);
62     ~MyParticipant() {};
63
64     void OnChange(int prop, const SEString& value);
65 };
66
67 MyParticipant::MyParticipant(unsigned int oid, SERootObject* root) : Participant(oid, root) {};
68
69 void MyParticipant::OnChange(int prop, const SEString& value)
70 {
71     if (prop == Participant::P_VOICE_STATUS)
72     {
73                 SEString Identity;
74                 GetPropIdentity(Identity);
75                 Participant::VOICE_STATUS VoiceStatus;
76                 GetPropVoiceStatus(VoiceStatus);
77
78                 printf("Participant %s voice status = %d\n", (const char*)Identity, VoiceStatus);
79
80     };
81 };
82
83 //---------------------------------------------------------------------------------------
84 // Subclassing Conversation
85
86 class MyConversation : public Conversation
87 {
88 public:
89     typedef DRef<MyConversation, Conversation> Ref;
90     MyConversation(unsigned int oid, SERootObject* root);
91     ~MyConversation() {};
92
93     void OnChange(int prop);
94 };
95
96 MyConversation::MyConversation(unsigned int oid, SERootObject* root) : Conversation(oid, root) {};
97
98 void MyConversation::OnChange(int prop)
99 {
100     if (prop == Conversation::P_LOCAL_LIVESTATUS)
101     {           
102                 Conversation::LOCAL_LIVESTATUS LiveStatus;
103                 this->GetPropLocalLivestatus(LiveStatus);
104                 if (LiveStatus == Conversation::RECENTLY_LIVE)
105                 {
106                         printf("Call finished.\n");
107                         CallFinished = true;
108                 };
109     };
110 };
111
112
113 //---------------------------------------------------------------------------------------
114 // Subclassing Account
115
116 class MyAccount : public Account
117 {
118 public:
119     typedef DRef<MyAccount, Account> Ref;
120     MyAccount(unsigned int oid, SERootObject* root);
121     ~MyAccount() {};
122
123     void OnChange(int prop);
124 };
125
126 MyAccount::MyAccount(unsigned int oid, SERootObject* root) : Account(oid, root) {};
127
128 void MyAccount::OnChange(int prop)
129 {
130     if (prop == Account::P_STATUS)
131     {
132         Account::STATUS LoginStatus;
133         GetPropStatus(LoginStatus);
134         if (LoginStatus == Account::LOGGED_IN)        { LoggedIn  = true; };
135         if (LoginStatus == Account::LOGGED_OUT)       { LoggedOut = true; };
136     };
137 };
138
139 //---------------------------------------------------------------------------------------
140 // Subclassing Skype
141
142 class MySkype : public Skype
143 {
144 public:
145     MySkype(SETransport* transport) : Skype(transport) {}
146     ~MySkype() {}
147     Account* newAccount(int oid) {return new MyAccount(oid, this);}
148     Conversation* newConversation(int oid) {return new MyConversation(oid, this);}
149     Participant* newParticipant(int oid) {return new MyParticipant(oid, this);}
150
151         void OnConversationListChange(
152                 const ConversationRef &conversation,
153                 const Conversation::LIST_TYPE &type,
154                 const bool &added);
155
156         bool SetupAudioDevices(uint MicNr, uint SpkNr);
157 };
158
159 void MySkype::OnConversationListChange(
160                 const ConversationRef &conversation,
161                 const Conversation::LIST_TYPE &type,
162                 const bool &added)
163 {
164         SEString DisplayName;
165         Conversation::LOCAL_LIVESTATUS LiveStatus;
166         conversation->GetPropDisplayname(DisplayName);
167         conversation->GetPropLocalLivestatus(LiveStatus);
168
169         printf("ConversationListChange fired on: %s\n", (const char*)DisplayName);
170         
171         if (type == Conversation::LIVE_CONVERSATIONS)
172         {
173             printf("Live status changed to %d\n", LiveStatus);
174
175         if (LiveStatus == Conversation::IM_LIVE)
176         {
177             printf("Live session is up.\n");
178             IsLiveSessionUp = true;
179         };
180
181         if (LiveStatus == Conversation::RECENTLY_LIVE)
182         {
183             printf("Call finished.\n");
184             IsLiveSessionUp = false;
185                         CallFinished = true;
186         };
187         };
188 };
189
190
191 bool MySkype::SetupAudioDevices(uint MicNr, uint SpkNr)
192
193 {
194         SEStringList SpkHandles, SpkNames, SpkProductIDs;
195         SEStringList MicHandles, MicNames, MicProductIDs;
196
197         GetAvailableOutputDevices (SpkHandles, SpkNames,  SpkProductIDs);
198         GetAvailableRecordingDevices (MicHandles, MicNames, MicProductIDs);
199
200         if (MicNr > (MicHandles.size() + 1)) 
201         { 
202                 printf("Invalid mic device no. (%d) passed to MySkype::SetupAudioDevices\n", MicNr); 
203                 return false;
204         };
205
206         if (SpkNr > (SpkHandles.size() + 1))
207         {
208                 printf("Invalid speaker device no. (%d) passed to MySkype::SetupAudioDevices\n", SpkNr); 
209                 return false;
210         };
211
212         printf("Setting mic to %s\n", (const char*)MicNames[MicNr]);
213         printf("Setting speakers to %s\n", (const char*)SpkNames[SpkNr]);
214
215         SelectSoundDevices(MicHandles[MicNr], SpkHandles[SpkNr], SpkHandles[SpkNr]);
216         SetSpeakerVolume(100);
217         return true;
218 };
219
220
221 //---------------------------------------------------------------------------------------
222 // Main
223
224 MySkype* skype = 0;
225
226 int main(int argc, char * argv[])
227 {
228     printf("*****************************************************************\n");
229     printf(" SkypeKit Tutorial, Step 6. - Initiating voice call (1 on 1).\n");
230     printf("*****************************************************************\n");
231
232     if (argc != 4)
233     {
234         printf("usage: tutorial_6 <skypename> <password> <calltarget>\n");
235         return 0;
236     };
237
238     MyAccountName = argv[1];
239     MyAccountPsw = argv[2];
240     MyCallTarget = argv[3];
241
242     printf("Creating transport ..\n");
243     transport = new SETCPTransport(inetAddr, portNum);
244     printf("Creating skype ..\n");
245     skype = new MySkype(transport);
246     skype->log = &(debugOut);
247
248     skype->init();
249     skype->start();
250
251     printf("Submitting application token..\n");
252     skype->SetApplicationToken(AppToken);
253
254     printf("Retrieving account ..\n");
255     MyAccount::Ref A;
256
257     if (skype->GetAccount(MyAccountName, A))
258     {
259         printf("Logging in..\n");
260         A->LoginWithPassword(MyAccountPsw, false, true);
261         while (!LoggedIn) {Delay(1);};
262         printf("Loggin complete.\n");
263                 
264                 if (skype->SetupAudioDevices(0, 0))
265                 {
266
267                         MyConversation::Ref C;
268                         SEStringList CallTargets;
269                         CallTargets.append(MyCallTarget);
270                         skype->GetConversationByParticipants(CallTargets, C, true, true);
271
272                         ParticipantRefs ConvParticipantList;
273                         C->GetParticipants(ConvParticipantList, Conversation::ALL);
274
275                         for (unsigned I = 0; I < ConvParticipantList.size(); I++)
276                         {
277                                 if (ConvParticipantList[I]->GetProp(Participant::P_IDENTITY) == MyCallTarget)
278                                 {
279                                         printf("Calling %s\n", (const char*)MyCallTarget);
280                                         ConvParticipantList[I]->Ring(MyCallTarget, false, 0, 10, false);
281                                         break;
282                                 };
283                         };
284
285                         while (!CallFinished) {Delay(1);};
286                 }
287                 else { printf("Unable to set audio devices.\n"); };
288
289         printf("Logging out..\n");
290         A->Logout(false);
291
292         while (!LoggedOut) {Delay(1);};
293         printf("Logout complete.\n");
294     }
295     else
296     {
297         printf("Account does not exist\n");
298     };
299
300     printf("Cleaning up.\n");
301     skype->stop();
302     skype->cleanup();
303     delete skype;
304     delete transport;
305     printf("Done.\n");
306     return 0;
307 };