29 #include <nsAppDirectoryServiceDefs.h>
30 #include <nsDirectoryServiceUtils.h>
31 #include <nsIProcess.h>
32 #include <nsIFileURL.h>
33 #include <nsNetUtil.h>
36 #include <CoreServices/CoreServices.h>
37 #include <ApplicationServices/ApplicationServices.h>
38 #include "nsILocalFileMac.h"
39 #include <sys/types.h>
40 #include <sys/sysctl.h>
52 typedef std::vector<pid_t> sbPIDVector;
53 typedef sbPIDVector::const_iterator sbPIDVectorIter;
56 GetPidName(pid_t aPid)
67 size_t dataLength = 0;
68 if (sysctl(mib, 3, NULL, &dataLength, NULL, 0) >= 0) {
70 char processPathStr[dataLength];
71 if (sysctl(mib, 3, &processPathStr[0], &dataLength, NULL, 0) >= 0) {
74 size_t lastSlashIndex = processPath.rfind(
'/');
75 if (lastSlashIndex != std::string::npos) {
76 processName = processPath.substr(lastSlashIndex + 1);
85 GetActiveProcessesByName(
const std::string & aProcessName,
86 sbPIDVector & aOutVector)
96 size_t bufferLength = 0;
97 if (sysctl(mib, 4, NULL, &bufferLength, NULL, 0) < 0) {
98 return NS_ERROR_FAILURE;
102 struct kinfo_proc *kp = (
struct kinfo_proc *)malloc(bufferLength);
103 NS_ENSURE_TRUE(kp != NULL, NS_ERROR_OUT_OF_MEMORY);
106 if (sysctl(mib, 4, kp, &bufferLength, NULL, 0) < 0) {
108 return NS_ERROR_FAILURE;
111 PRInt32 entries = bufferLength /
sizeof(
struct kinfo_proc);
114 return NS_ERROR_FAILURE;
117 for (PRInt32
i = entries;
i >= 0;
i--) {
118 std::string curProcessName = GetPidName((&kp[
i])->kp_proc.p_pid);
119 if (curProcessName.compare(aProcessName) == 0) {
120 aOutVector.push_back((&kp[
i])->kp_proc.p_pid);
142 sbMediaExportITunesAgentService::StartExportAgent()
148 sbMediaExportITunesAgentService::UnregisterExportAgent()
157 nsCOMPtr<nsIURI> agentParentFolderURI;
158 rv = NS_NewURI(getter_AddRefs(agentParentFolderURI),
159 NS_LITERAL_STRING(
"resource://app"));
160 NS_ENSURE_SUCCESS(rv, rv);
162 nsCOMPtr<nsIFileURL> parentFolderFileURL =
163 do_QueryInterface(agentParentFolderURI, &rv);
164 NS_ENSURE_SUCCESS(rv, rv);
166 nsCOMPtr<nsIFile> agentFile;
167 rv = parentFolderFileURL->GetFile(getter_AddRefs(agentFile));
168 NS_ENSURE_SUCCESS(rv, rv);
170 nsCOMPtr<nsIFile> appRegD;
171 rv = NS_GetSpecialDirectory(NS_APP_APPLICATION_REGISTRY_DIR,
172 getter_AddRefs(appRegD));
173 NS_ENSURE_SUCCESS(rv, rv);
176 rv = appRegD->GetLeafName(leafName);
177 NS_ENSURE_SUCCESS(rv, rv);
179 NS_ConvertUTF16toUTF8 profile(leafName);
184 rv = agentFile->Append(NS_LITERAL_STRING(
"songbirditunesagent.app"));
185 NS_ENSURE_SUCCESS(rv, rv);
187 nsCOMPtr<nsILocalFileMac> agentMacFile =
188 do_QueryInterface(agentFile, &rv);
189 NS_ENSURE_SUCCESS(rv, rv);
192 rv = agentMacFile->GetFSRef(&agentFSRef);
194 CFArrayRef argv = nsnull;
197 if (aShouldUnregister) {
199 arg[0] = CFStringCreateWithCString(kCFAllocatorDefault,
201 kCFStringEncodingUTF8);
202 argv = CFArrayCreate(kCFAllocatorDefault,
208 arg[0] = CFStringCreateWithCString(kCFAllocatorDefault,
210 kCFStringEncodingUTF8);
211 arg[1] = CFStringCreateWithCString(kCFAllocatorDefault,
212 NS_ConvertUTF16toUTF8(profile).
get(),
213 kCFStringEncodingUTF8);
214 argv = CFArrayCreate(kCFAllocatorDefault,
220 LSApplicationParameters appParams = {
230 ProcessSerialNumber outPSN;
231 OSStatus err = LSOpenApplication(&appParams, &outPSN);
232 NS_ENSURE_TRUE(err == noErr, NS_ERROR_FAILURE);
238 rv = agentFile->Append(NS_LITERAL_STRING(
"songbirditunesagent.exe"));
239 NS_ENSURE_SUCCESS(rv, rv);
241 nsCOMPtr<nsIProcess> agentProcess =
242 do_CreateInstance(NS_PROCESS_CONTRACTID, &rv);
243 NS_ENSURE_SUCCESS(rv, rv);
245 rv = agentProcess->Init(agentFile);
246 NS_ENSURE_SUCCESS(rv, rv);
248 if (aShouldUnregister) {
249 const char*
args[] = {
"--unregister" };
250 rv = agentProcess->Run(PR_TRUE, args, 1);
251 NS_ENSURE_SUCCESS(rv, rv);
253 const char*
args[] = {
"--profile", profile.get() };
254 rv = agentProcess->Run(PR_FALSE, args, 2);
255 NS_ENSURE_SUCCESS(rv, rv);
258 LOG((
"%s: ERROR: Tried to start the export agent on a non-supported OS",
266 sbMediaExportITunesAgentService::GetIsAgentRunning(PRBool *aIsRunning)
268 NS_ENSURE_ARG_POINTER(aIsRunning);
269 *aIsRunning = PR_FALSE;
272 sbPIDVector processes;
273 nsresult rv = GetActiveProcessesByName(
"songbirditunesagent", processes);
274 *aIsRunning = NS_SUCCEEDED(rv) && processes.size() > 0;
279 HANDLE hMutex = OpenMutex(SYNCHRONIZE, PR_TRUE, L
"songbirditunesagent");
280 *aIsRunning = hMutex != nsnull;
290 sbMediaExportITunesAgentService::KillActiveAgents()
298 nsCOMPtr<nsIURI> agentParentFolderURI;
299 rv = NS_NewURI(getter_AddRefs(agentParentFolderURI),
300 NS_LITERAL_STRING(
"resource://app"));
301 NS_ENSURE_SUCCESS(rv, rv);
303 nsCOMPtr<nsIFileURL> parentFolderFileURL =
304 do_QueryInterface(agentParentFolderURI, &rv);
305 NS_ENSURE_SUCCESS(rv, rv);
307 nsCOMPtr<nsIFile> agentFile;
308 rv = parentFolderFileURL->GetFile(getter_AddRefs(agentFile));
309 NS_ENSURE_SUCCESS(rv, rv);
315 rv = agentFile->GetPath(agentPath);
316 NS_ENSURE_SUCCESS(rv, rv);
318 agentPath.AppendLiteral(
"/songbirditunesagent.app/Contents/MacOS/songbirditunesagent");
320 nsCOMPtr<nsILocalFileMac> macAgentFileSpec =
321 do_CreateInstance(
"@mozilla.org/file/local;1", &rv);
322 NS_ENSURE_SUCCESS(rv, rv);
324 rv = macAgentFileSpec->InitWithPath(agentPath);
325 NS_ENSURE_SUCCESS(rv, rv);
327 agentFile = do_QueryInterface(macAgentFileSpec, &rv);
328 NS_ENSURE_SUCCESS(rv, rv);
331 rv = agentFile->Append(NS_LITERAL_STRING(
"songbirditunesagent.exe"));
332 NS_ENSURE_SUCCESS(rv, rv);
337 nsCOMPtr<nsIProcess> killProcess =
338 do_CreateInstance(NS_PROCESS_CONTRACTID, &rv);
339 NS_ENSURE_SUCCESS(rv, rv);
341 rv = killProcess->Init(agentFile);
342 NS_ENSURE_SUCCESS(rv, rv);
344 nsCString
args(
"--kill");
345 const char *argsStr =
args.get();
348 rv = killProcess->Run(PR_TRUE, &argsStr, 1);
349 NS_ENSURE_SUCCESS(rv, rv);
_getSelectedPageStyle s i